On Wed, 2012-02-01 at 16:43 +0000, Ian Jackson wrote:> Ian Campbell writes ("[GIT PULL] libxl API updates backlog"):
> > I''ve built up a rather large backlog of patches. Many of them
have been
> > posted before and acked so rather than spam the list with another big
> > mail bomb I am sending as a git pull request a large batch of those
> > patches which have been acked.
>
> Thanks.
>
> This one had conflicts:
>
> > xl: use json output by default
Rebased version below.
> I have applied the rest:
Thanks!
8<----------------------------------
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1328115855 0
# Node ID 5926f25e1d8a847ad3dc74ab9bc582b365f352ec
# Parent 512bd9cd537d3846a12eebc255760fa7a2064a86
xl: use json output by default
Move the sxp producing code off into a separate file. It is supported
for legacy reasons and needn''t be updated other than the improve
compatibility with xm.
libxl_domain_config is not currently generated by the IDL (adding the
necessary support for Array types is on my to do list) so hand code
the json generation function for now.
Since this rather directly exposes a libxl data structure it''s not
clear what sort of forward compatibility guarantees we can
make. However it seems like it should be as stable as libxl''s own API
(which we are looking to stabilise)
(Gratuitous string.h include needed for memset in libxl_util.h)
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
[since last version -- update xendomains script patch merged in]
diff -r 512bd9cd537d -r 5926f25e1d8a docs/man/xl.pod.1
--- a/docs/man/xl.pod.1 Wed Feb 01 17:03:45 2012 +0000
+++ b/docs/man/xl.pod.1 Wed Feb 01 17:04:15 2012 +0000
@@ -219,7 +219,7 @@ B<OPTIONS>
=item B<-l>, B<--long>
The output for B<xl list> is not the table view shown below, but
-instead presents the data in SXP compatible format.
+instead presents the data in as a JSON data structure.
=item B<-Z>, B<--context>
Also prints the security labels.
diff -r 512bd9cd537d -r 5926f25e1d8a tools/hotplug/Linux/init.d/xendomains
--- a/tools/hotplug/Linux/init.d/xendomains Wed Feb 01 17:03:45 2012 +0000
+++ b/tools/hotplug/Linux/init.d/xendomains Wed Feb 01 17:04:15 2012 +0000
@@ -202,15 +202,20 @@ rdnames()
done
}
+LIST_GREP=''((domain\|(domid\|(name\|^{$\|"name":\|"domid":''
parseln()
{
- if [[ "$1" =~ ''(domain'' ]]; then
+ if [[ "$1" =~ ''(domain'' ]] || [[ "$1"
= "{" ]]; then
name=;id- else if [[ "$1" =~ ''(name'' ]];
then
+ elif [[ "$1" =~ ''(name'' ]]; then
name=$(echo $1 | sed -e ''s/^.*(name \(.*\))$/\1/'')
- else if [[ "$1" =~ ''(domid'' ]]; then
+ elif [[ "$1" =~ ''(domid'' ]]; then
id=$(echo $1 | sed -e ''s/^.*(domid \(.*\))$/\1/'')
- fi; fi; fi
+ elif [[ "$1" =~ ''"name":'' ]]; then
+ name=$(echo $1 | sed -e ''s/^.*"name":
"\(.*\)",$/\1/'')
+ elif [[ "$1" =~ ''"domid":'' ]]; then
+ id=$(echo $1 | sed -e ''s/^.*"domid":
\(.*\),$/\1/'')
+ fi
[ -n "$name" -a -n "$id" ] && return 0 ||
return 1
}
@@ -228,7 +233,7 @@ is_running()
RC=0
;;
esac
- done < <($CMD list -l | grep
''(\(domain\|domid\|name\)'')
+ done < <($CMD list -l | grep $LIST_GREP)
return $RC
}
@@ -310,7 +315,7 @@ all_zombies()
if test "$state" != "-b---d" -a "$state" !=
"-----d"; then
return 1;
fi
- done < <($CMD list -l | grep
''(\(domain\|domid\|name\)'')
+ done < <($CMD list -l | grep $LIST_GREP)
return 0
}
@@ -441,7 +446,7 @@ stop()
fi
kill $WDOG_PID >/dev/null 2>&1
fi
- done < <($CMD list -l | grep
''(\(domain\|domid\|name\)'')
+ done < <($CMD list -l | grep $LIST_GREP)
# NB. this shuts down ALL Xen domains (politely), not just the ones in
# AUTODIR/*
@@ -478,7 +483,7 @@ check_domain_up()
return 0
;;
esac
- done < <($CMD list -l | grep
''(\(domain\|domid\|name\)'')
+ done < <($CMD list -l | grep $LIST_GREP)
return 1
}
diff -r 512bd9cd537d -r 5926f25e1d8a tools/libxl/Makefile
--- a/tools/libxl/Makefile Wed Feb 01 17:03:45 2012 +0000
+++ b/tools/libxl/Makefile Wed Feb 01 17:04:15 2012 +0000
@@ -66,7 +66,7 @@ LIBXLU_OBJS = libxlu_cfg_y.o libxlu_cfg_
CLIENTS = xl testidl
-XL_OBJS = xl.o xl_cmdimpl.o xl_cmdtable.o
+XL_OBJS = xl.o xl_cmdimpl.o xl_cmdtable.o xl_sxp.o
$(XL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h
$(XL_OBJS): CFLAGS += $(CFLAGS_libxenlight)
diff -r 512bd9cd537d -r 5926f25e1d8a tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Wed Feb 01 17:03:45 2012 +0000
+++ b/tools/libxl/libxl.h Wed Feb 01 17:04:15 2012 +0000
@@ -130,6 +130,7 @@
#include <stdbool.h>
#include <stdint.h>
#include <stdarg.h>
+#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/wait.h> /* for pid_t */
@@ -304,6 +305,7 @@ typedef struct {
libxl_action_on_shutdown on_watchdog;
libxl_action_on_shutdown on_crash;
} libxl_domain_config;
+char *libxl_domain_config_to_json(libxl_ctx *ctx, libxl_domain_config *p);
/* context functions */
int libxl_ctx_alloc(libxl_ctx **pctx, int version,
diff -r 512bd9cd537d -r 5926f25e1d8a tools/libxl/libxl_json.c
--- a/tools/libxl/libxl_json.c Wed Feb 01 17:03:45 2012 +0000
+++ b/tools/libxl/libxl_json.c Wed Feb 01 17:04:15 2012 +0000
@@ -843,6 +843,158 @@ out:
return ret;
}
+yajl_gen_status libxl_domain_config_gen_json(yajl_gen hand,
+ libxl_domain_config *p)
+{
+ yajl_gen_status s;
+ int i;
+
+ s = yajl_gen_map_open(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"c_info",
+ sizeof("c_info")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = libxl_domain_create_info_gen_json(hand, &p->c_info);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"b_info",
+ sizeof("b_info")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = libxl_domain_build_info_gen_json(hand, &p->b_info);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"disks",
+ sizeof("disks")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = yajl_gen_array_open(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ for (i = 0; i < p->num_disks; i++) {
+ s = libxl_device_disk_gen_json(hand, &p->disks[i]);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ }
+ s = yajl_gen_array_close(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"vifs",
+ sizeof("vifs")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = yajl_gen_array_open(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ for (i = 0; i < p->num_vifs; i++) {
+ s = libxl_device_nic_gen_json(hand, &p->vifs[i]);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ }
+ s = yajl_gen_array_close(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"pcidevs",
+ sizeof("pcidevs")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = yajl_gen_array_open(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ for (i = 0; i < p->num_pcidevs; i++) {
+ s = libxl_device_pci_gen_json(hand, &p->pcidevs[i]);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ }
+ s = yajl_gen_array_close(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"vfbs",
+ sizeof("vfbs")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = yajl_gen_array_open(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ for (i = 0; i < p->num_vfbs; i++) {
+ s = libxl_device_vfb_gen_json(hand, &p->vfbs[i]);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ }
+ s = yajl_gen_array_close(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"vkbs",
+ sizeof("vkbs")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = yajl_gen_array_open(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ for (i = 0; i < p->num_vkbs; i++) {
+ s = libxl_device_vkb_gen_json(hand, &p->vkbs[i]);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ }
+ s = yajl_gen_array_close(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"on_poweroff",
+ sizeof("on_poweroff")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = libxl_action_on_shutdown_gen_json(hand, &p->on_poweroff);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"on_reboot",
+ sizeof("on_reboot")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = libxl_action_on_shutdown_gen_json(hand, &p->on_reboot);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"on_watchdog",
+ sizeof("on_watchdog")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = libxl_action_on_shutdown_gen_json(hand, &p->on_watchdog);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"on_crash",
+ sizeof("on_crash")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = libxl_action_on_shutdown_gen_json(hand, &p->on_crash);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_map_close(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ out:
+ return s;
+}
+
+char *libxl_domain_config_to_json(libxl_ctx *ctx, libxl_domain_config *p)
+{
+ return libxl__object_to_json(ctx, "libxl_domain_config",
+
(libxl__gen_json_callback)&libxl_domain_config_gen_json,
+ (void *)p);
+}
+
/*
* Local variables:
* mode: C
diff -r 512bd9cd537d -r 5926f25e1d8a tools/libxl/libxl_json.h
--- a/tools/libxl/libxl_json.h Wed Feb 01 17:03:45 2012 +0000
+++ b/tools/libxl/libxl_json.h Wed Feb 01 17:04:15 2012 +0000
@@ -70,4 +70,7 @@ static inline yajl_gen libxl__yajl_gen_a
#endif /* !HAVE_YAJL_V2 */
+yajl_gen_status libxl_domain_config_gen_json(yajl_gen hand,
+ libxl_domain_config *p);
+
#endif /* LIBXL_JSON_H */
diff -r 512bd9cd537d -r 5926f25e1d8a tools/libxl/xl.c
--- a/tools/libxl/xl.c Wed Feb 01 17:03:45 2012 +0000
+++ b/tools/libxl/xl.c Wed Feb 01 17:04:15 2012 +0000
@@ -38,6 +38,7 @@ int dryrun_only;
int autoballoon = 1;
char *lockfile;
char *default_vifscript = NULL;
+enum output_format default_output_format = OUTPUT_FORMAT_JSON;
static xentoollog_level minmsglevel = XTL_PROGRESS;
@@ -78,6 +79,15 @@ static void parse_global_config(const ch
if (!xlu_cfg_get_string (config, "vifscript", &buf, 0))
default_vifscript = strdup(buf);
+ if (!xlu_cfg_get_string (config, "output_format", &buf, 0)) {
+ if (!strcmp(buf, "json"))
+ default_output_format = OUTPUT_FORMAT_JSON;
+ else if (!strcmp(buf, "sxp"))
+ default_output_format = OUTPUT_FORMAT_SXP;
+ else {
+ fprintf(stderr, "invalid default output format
\"%s\"\n", buf);
+ }
+ }
xlu_cfg_destroy(config);
}
diff -r 512bd9cd537d -r 5926f25e1d8a tools/libxl/xl.h
--- a/tools/libxl/xl.h Wed Feb 01 17:03:45 2012 +0000
+++ b/tools/libxl/xl.h Wed Feb 01 17:04:15 2012 +0000
@@ -111,6 +111,14 @@ extern int dryrun_only;
extern char *lockfile;
extern char *default_vifscript;
+enum output_format {
+ OUTPUT_FORMAT_JSON,
+ OUTPUT_FORMAT_SXP,
+};
+extern enum output_format default_output_format;
+
+extern void printf_info_sexp(int domid, libxl_domain_config *d_config);
+
#endif /* XL_H */
/*
diff -r 512bd9cd537d -r 5926f25e1d8a tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c Wed Feb 01 17:03:45 2012 +0000
+++ b/tools/libxl/xl_cmdimpl.c Wed Feb 01 17:04:15 2012 +0000
@@ -38,6 +38,7 @@
#include "libxl.h"
#include "libxl_utils.h"
+#include "libxl_json.h"
#include "libxlutil.h"
#include "xl.h"
@@ -289,187 +290,66 @@ static void dolog(const char *file, int
free(s);
}
-static void printf_info(int domid,
+static void printf_info(enum output_format output_format,
+ int domid,
libxl_domain_config *d_config)
{
- int i;
- libxl_dominfo info;
-
- libxl_domain_create_info *c_info = &d_config->c_info;
- libxl_domain_build_info *b_info = &d_config->b_info;
-
- printf("(domain\n\t(domid %d)\n", domid);
- printf("\t(create_info)\n");
- printf("\t(hvm %d)\n", c_info->type == LIBXL_DOMAIN_TYPE_HVM);
- printf("\t(hap %d)\n", c_info->hap);
- printf("\t(oos %d)\n", c_info->oos);
- printf("\t(ssidref %d)\n", c_info->ssidref);
- printf("\t(name %s)\n", c_info->name);
-
- /* retrieve the UUID from dominfo, since it is probably generated
- * during parsing and thus does not match the real one
- */
- if (libxl_domain_info(ctx, &info, domid) == 0) {
- printf("\t(uuid " LIBXL_UUID_FMT ")\n",
LIBXL_UUID_BYTES(info.uuid));
- } else {
- printf("\t(uuid <unknown>)\n");
- }
-
- printf("\t(cpupool %s)\n", libxl_cpupoolid_to_name(ctx,
c_info->poolid));
- if (c_info->xsdata)
- printf("\t(xsdata contains data)\n");
+ if (output_format == OUTPUT_FORMAT_SXP)
+ return printf_info_sexp(domid, d_config);
+
+ yajl_gen_config conf = { 1, " " };
+ const char *buf;
+ unsigned int len = 0;
+ yajl_gen_status s;
+ yajl_gen hand;
+
+ hand = yajl_gen_alloc(&conf, NULL);
+ if (!hand) {
+ fprintf(stderr, "unable to allocate JSON generator\n");
+ return;
+ }
+
+ s = yajl_gen_map_open(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"domid",
+ sizeof("domid")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ if (domid != -1)
+ s = yajl_gen_integer(hand, domid);
else
- printf("\t(xsdata (null))\n");
- if (c_info->platformdata)
- printf("\t(platformdata contains data)\n");
- else
- printf("\t(platformdata (null))\n");
-
-
- printf("\t(build_info)\n");
- printf("\t(max_vcpus %d)\n", b_info->max_vcpus);
- printf("\t(tsc_mode %s)\n",
libxl_tsc_mode_to_string(b_info->tsc_mode));
- printf("\t(max_memkb %d)\n", b_info->max_memkb);
- printf("\t(target_memkb %d)\n", b_info->target_memkb);
- printf("\t(nomigrate %d)\n", b_info->disable_migrate);
-
- if (c_info->type == LIBXL_DOMAIN_TYPE_PV &&
b_info->u.pv.bootloader) {
- int i;
- printf("\t(bootloader %s)\n", b_info->u.pv.bootloader);
- if (b_info->u.pv.bootloader_args) {
- printf("\t(bootloader_args");
- for (i=0; b_info->u.pv.bootloader_args[i]; i++)
- printf(" %s", b_info->u.pv.bootloader_args[i]);
- printf(")\n");
- }
- }
-
- printf("\t(image\n");
- switch (c_info->type) {
- case LIBXL_DOMAIN_TYPE_HVM:
- printf("\t\t(hvm\n");
- printf("\t\t\t(firmware %s)\n", b_info->u.hvm.firmware);
- printf("\t\t\t(video_memkb %d)\n", b_info->video_memkb);
- printf("\t\t\t(shadow_memkb %d)\n", b_info->shadow_memkb);
- printf("\t\t\t(pae %d)\n", b_info->u.hvm.pae);
- printf("\t\t\t(apic %d)\n", b_info->u.hvm.apic);
- printf("\t\t\t(acpi %d)\n", b_info->u.hvm.acpi);
- printf("\t\t\t(nx %d)\n", b_info->u.hvm.nx);
- printf("\t\t\t(viridian %d)\n", b_info->u.hvm.viridian);
- printf("\t\t\t(hpet %d)\n", b_info->u.hvm.hpet);
- printf("\t\t\t(vpt_align %d)\n", b_info->u.hvm.vpt_align);
- printf("\t\t\t(timer_mode %s)\n",
- libxl_timer_mode_to_string(b_info->u.hvm.timer_mode));
-
- printf("\t\t\t(nestedhvm %d)\n",
b_info->u.hvm.nested_hvm);
- printf("\t\t\t(no_incr_generationid %d)\n",
- b_info->u.hvm.no_incr_generationid);
-
- printf("\t\t\t(stdvga %d)\n", b_info->u.hvm.stdvga);
- printf("\t\t\t(vnc %d)\n", b_info->u.hvm.vnc.enable);
- printf("\t\t\t(vnclisten %s)\n",
b_info->u.hvm.vnc.listen);
- printf("\t\t\t(vncdisplay %d)\n",
b_info->u.hvm.vnc.display);
- printf("\t\t\t(vncunused %d)\n",
b_info->u.hvm.vnc.findunused);
- printf("\t\t\t(keymap %s)\n", b_info->u.hvm.keymap);
- printf("\t\t\t(sdl %d)\n", b_info->u.hvm.sdl.enable);
- printf("\t\t\t(opengl %d)\n", b_info->u.hvm.sdl.opengl);
- printf("\t\t\t(nographic %d)\n", b_info->u.hvm.nographic);
- printf("\t\t\t(spice %d)\n", b_info->u.hvm.spice.enable);
- printf("\t\t\t(spiceport %d)\n",
b_info->u.hvm.spice.port);
- printf("\t\t\t(spicetls_port %d)\n",
b_info->u.hvm.spice.tls_port);
- printf("\t\t\t(spicehost %s)\n",
b_info->u.hvm.spice.host);
- printf("\t\t\t(spicedisable_ticketing %d)\n",
- b_info->u.hvm.spice.disable_ticketing);
- printf("\t\t\t(spiceagent_mouse %d)\n",
b_info->u.hvm.spice.agent_mouse);
-
- printf("\t\t\t(device_model %s)\n", b_info->device_model ?
: "default");
- printf("\t\t\t(gfx_passthru %d)\n",
b_info->u.hvm.gfx_passthru);
- printf("\t\t\t(serial %s)\n", b_info->u.hvm.serial);
- printf("\t\t\t(boot %s)\n", b_info->u.hvm.boot);
- printf("\t\t\t(usb %d)\n", b_info->u.hvm.usb);
- printf("\t\t\t(usbdevice %s)\n", b_info->u.hvm.usbdevice);
- printf("\t\t)\n");
- break;
- case LIBXL_DOMAIN_TYPE_PV:
- printf("\t\t(linux %d)\n", 0);
- printf("\t\t\t(kernel %s)\n", b_info->u.pv.kernel.path);
- printf("\t\t\t(cmdline %s)\n", b_info->u.pv.cmdline);
- printf("\t\t\t(ramdisk %s)\n", b_info->u.pv.ramdisk.path);
- printf("\t\t\t(e820_host %d)\n", b_info->u.pv.e820_host);
- printf("\t\t)\n");
- break;
- default:
- fprintf(stderr, "Unknown domain type %d\n", c_info->type);
- exit(1);
- }
- printf("\t)\n");
-
- for (i = 0; i < d_config->num_disks; i++) {
- printf("\t(device\n");
- printf("\t\t(tap\n");
- printf("\t\t\t(backend_domid %d)\n",
d_config->disks[i].backend_domid);
- printf("\t\t\t(frontend_domid %d)\n", domid);
- printf("\t\t\t(physpath %s)\n",
d_config->disks[i].pdev_path);
- printf("\t\t\t(phystype %d)\n",
d_config->disks[i].backend);
- printf("\t\t\t(virtpath %s)\n", d_config->disks[i].vdev);
- printf("\t\t\t(unpluggable %d)\n",
d_config->disks[i].removable);
- printf("\t\t\t(readwrite %d)\n",
d_config->disks[i].readwrite);
- printf("\t\t\t(is_cdrom %d)\n",
d_config->disks[i].is_cdrom);
- printf("\t\t)\n");
- printf("\t)\n");
- }
-
- for (i = 0; i < d_config->num_vifs; i++) {
- printf("\t(device\n");
- printf("\t\t(vif\n");
- if (d_config->vifs[i].ifname)
- printf("\t\t\t(vifname %s)\n",
d_config->vifs[i].ifname);
- printf("\t\t\t(backend_domid %d)\n",
d_config->vifs[i].backend_domid);
- printf("\t\t\t(frontend_domid %d)\n", domid);
- printf("\t\t\t(devid %d)\n", d_config->vifs[i].devid);
- printf("\t\t\t(mtu %d)\n", d_config->vifs[i].mtu);
- printf("\t\t\t(model %s)\n", d_config->vifs[i].model);
- printf("\t\t\t(mac %02x%02x%02x%02x%02x%02x)\n",
- d_config->vifs[i].mac[0], d_config->vifs[i].mac[1],
- d_config->vifs[i].mac[2], d_config->vifs[i].mac[3],
- d_config->vifs[i].mac[4], d_config->vifs[i].mac[5]);
- printf("\t\t)\n");
- printf("\t)\n");
- }
-
- for (i = 0; i < d_config->num_pcidevs; i++) {
- printf("\t(device\n");
- printf("\t\t(pci\n");
- printf("\t\t\t(pci dev %04x:%02x:%02x.%01x@%02x)\n",
- d_config->pcidevs[i].domain, d_config->pcidevs[i].bus,
- d_config->pcidevs[i].dev, d_config->pcidevs[i].func,
- d_config->pcidevs[i].vdevfn);
- printf("\t\t\t(opts msitranslate %d power_mgmt %d)\n",
- d_config->pcidevs[i].msitranslate,
- d_config->pcidevs[i].power_mgmt);
- printf("\t\t)\n");
- printf("\t)\n");
- }
-
- for (i = 0; i < d_config->num_vfbs; i++) {
- printf("\t(device\n");
- printf("\t\t(vfb\n");
- printf("\t\t\t(backend_domid %d)\n",
d_config->vfbs[i].backend_domid);
- printf("\t\t\t(frontend_domid %d)\n", domid);
- printf("\t\t\t(devid %d)\n", d_config->vfbs[i].devid);
- printf("\t\t\t(vnc %d)\n", d_config->vfbs[i].vnc.enable);
- printf("\t\t\t(vnclisten %s)\n",
d_config->vfbs[i].vnc.listen);
- printf("\t\t\t(vncdisplay %d)\n",
d_config->vfbs[i].vnc.display);
- printf("\t\t\t(vncunused %d)\n",
d_config->vfbs[i].vnc.findunused);
- printf("\t\t\t(keymap %s)\n", d_config->vfbs[i].keymap);
- printf("\t\t\t(sdl %d)\n", d_config->vfbs[i].sdl.enable);
- printf("\t\t\t(opengl %d)\n",
d_config->vfbs[i].sdl.opengl);
- printf("\t\t\t(display %s)\n",
d_config->vfbs[i].sdl.display);
- printf("\t\t\t(xauthority %s)\n",
d_config->vfbs[i].sdl.xauthority);
- printf("\t\t)\n");
- printf("\t)\n");
- }
- printf(")\n");
+ s = yajl_gen_null(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_string(hand, (const unsigned char *)"config",
+ sizeof("config")-1);
+ if (s != yajl_gen_status_ok)
+ goto out;
+ s = libxl_domain_config_gen_json(hand, d_config);
+ if (s != yajl_gen_status_ok)
+ goto out;
+
+ s = yajl_gen_map_close(hand);
+ 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;
+
+ puts(buf);
+
+out:
+ yajl_gen_free(hand);
+
+ if (s != yajl_gen_status_ok)
+ fprintf(stderr,
+ "unable to format domain config as JSON (YAJL:%d)\n",
s);
+
+ if (ferror(stdout) || fflush(stdout)) { perror("stdout");
exit(-1); }
}
static int parse_action_on_shutdown(const char *buf, libxl_action_on_shutdown
*a)
@@ -682,7 +562,7 @@ static void parse_config_data(const char
c_info->hap = l;
if (xlu_cfg_replace_string (config, "name", &c_info->name,
0)) {
- fprintf(stderr, "Domain name must be specified.");
+ fprintf(stderr, "Domain name must be specified.\n");
exit(1);
}
@@ -1723,7 +1603,7 @@ static int create_domain(struct domain_c
dom_info->no_incr_generationid;
if (debug || dom_info->dryrun)
- printf_info(-1, &d_config);
+ printf_info(default_output_format, -1, &d_config);
ret = 0;
if (dom_info->dryrun)
@@ -2525,7 +2405,7 @@ static void list_domains_details(const l
CHK_ERRNO(asprintf(&config_file, "<domid %d data>",
info[i].domid));
memset(&d_config, 0x00, sizeof(d_config));
parse_config_data(config_file, (char *)data, len, &d_config);
- printf_info(info[i].domid, &d_config);
+ printf_info(default_output_format, info[i].domid, &d_config);
libxl_domain_config_dispose(&d_config);
free(data);
free(config_file);
diff -r 512bd9cd537d -r 5926f25e1d8a tools/libxl/xl_sxp.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/xl_sxp.c Wed Feb 01 17:04:15 2012 +0000
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2009 Citrix Ltd.
+ * Author Stefano Stabellini <stefano.stabellini@eu.citrix.com>
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ */
+
+/*
+ * Legacy SXP output handling
+ */
+
+#include "libxl_osdeps.h"
+
+#include <stdlib.h>
+
+#include "libxl.h"
+#include "libxl_utils.h"
+#include "xl.h"
+
+/* In general you should not add new output to this function since it
+ * is intended only for legacy use.
+ */
+void printf_info_sexp(int domid, libxl_domain_config *d_config)
+{
+ int i;
+ libxl_dominfo info;
+
+ libxl_domain_create_info *c_info = &d_config->c_info;
+ libxl_domain_build_info *b_info = &d_config->b_info;
+
+ printf("(domain\n\t(domid %d)\n", domid);
+ printf("\t(create_info)\n");
+ printf("\t(hvm %d)\n", c_info->type == LIBXL_DOMAIN_TYPE_HVM);
+ printf("\t(hap %d)\n", c_info->hap);
+ printf("\t(oos %d)\n", c_info->oos);
+ printf("\t(ssidref %d)\n", c_info->ssidref);
+ printf("\t(name %s)\n", c_info->name);
+
+ /* retrieve the UUID from dominfo, since it is probably generated
+ * during parsing and thus does not match the real one
+ */
+ if (libxl_domain_info(ctx, &info, domid) == 0) {
+ printf("\t(uuid " LIBXL_UUID_FMT ")\n",
LIBXL_UUID_BYTES(info.uuid));
+ } else {
+ printf("\t(uuid <unknown>)\n");
+ }
+
+ printf("\t(cpupool %s)\n", libxl_cpupoolid_to_name(ctx,
c_info->poolid));
+ if (c_info->xsdata)
+ printf("\t(xsdata contains data)\n");
+ else
+ printf("\t(xsdata (null))\n");
+ if (c_info->platformdata)
+ printf("\t(platformdata contains data)\n");
+ else
+ printf("\t(platformdata (null))\n");
+
+
+ printf("\t(build_info)\n");
+ printf("\t(max_vcpus %d)\n", b_info->max_vcpus);
+ printf("\t(tsc_mode %s)\n",
libxl_tsc_mode_to_string(b_info->tsc_mode));
+ printf("\t(max_memkb %d)\n", b_info->max_memkb);
+ printf("\t(target_memkb %d)\n", b_info->target_memkb);
+ printf("\t(nomigrate %d)\n", b_info->disable_migrate);
+
+ if (c_info->type == LIBXL_DOMAIN_TYPE_PV &&
b_info->u.pv.bootloader) {
+ int i;
+ printf("\t(bootloader %s)\n", b_info->u.pv.bootloader);
+ if (b_info->u.pv.bootloader_args) {
+ printf("\t(bootloader_args");
+ for (i=0; b_info->u.pv.bootloader_args[i]; i++)
+ printf(" %s", b_info->u.pv.bootloader_args[i]);
+ printf(")\n");
+ }
+ }
+
+ printf("\t(image\n");
+ switch (c_info->type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
+ printf("\t\t(hvm\n");
+ printf("\t\t\t(firmware %s)\n", b_info->u.hvm.firmware);
+ printf("\t\t\t(video_memkb %d)\n", b_info->video_memkb);
+ printf("\t\t\t(shadow_memkb %d)\n", b_info->shadow_memkb);
+ printf("\t\t\t(pae %d)\n", b_info->u.hvm.pae);
+ printf("\t\t\t(apic %d)\n", b_info->u.hvm.apic);
+ printf("\t\t\t(acpi %d)\n", b_info->u.hvm.acpi);
+ printf("\t\t\t(nx %d)\n", b_info->u.hvm.nx);
+ printf("\t\t\t(viridian %d)\n", b_info->u.hvm.viridian);
+ printf("\t\t\t(hpet %d)\n", b_info->u.hvm.hpet);
+ printf("\t\t\t(vpt_align %d)\n", b_info->u.hvm.vpt_align);
+ printf("\t\t\t(timer_mode %s)\n",
+ libxl_timer_mode_to_string(b_info->u.hvm.timer_mode));
+ printf("\t\t\t(nestedhvm %d)\n",
b_info->u.hvm.nested_hvm);
+ printf("\t\t\t(no_incr_generationid %d)\n",
+ b_info->u.hvm.no_incr_generationid);
+
+ printf("\t\t\t(stdvga %d)\n", b_info->u.hvm.stdvga);
+ printf("\t\t\t(vnc %d)\n", b_info->u.hvm.vnc.enable);
+ printf("\t\t\t(vnclisten %s)\n",
b_info->u.hvm.vnc.listen);
+ printf("\t\t\t(vncdisplay %d)\n",
b_info->u.hvm.vnc.display);
+ printf("\t\t\t(vncunused %d)\n",
b_info->u.hvm.vnc.findunused);
+ printf("\t\t\t(keymap %s)\n", b_info->u.hvm.keymap);
+ printf("\t\t\t(sdl %d)\n", b_info->u.hvm.sdl.enable);
+ printf("\t\t\t(opengl %d)\n", b_info->u.hvm.sdl.opengl);
+ printf("\t\t\t(nographic %d)\n", b_info->u.hvm.nographic);
+ printf("\t\t\t(spice %d)\n", b_info->u.hvm.spice.enable);
+ printf("\t\t\t(spiceport %d)\n",
b_info->u.hvm.spice.port);
+ printf("\t\t\t(spicetls_port %d)\n",
b_info->u.hvm.spice.tls_port);
+ printf("\t\t\t(spicehost %s)\n",
b_info->u.hvm.spice.host);
+ printf("\t\t\t(spicedisable_ticketing %d)\n",
+ b_info->u.hvm.spice.disable_ticketing);
+ printf("\t\t\t(spiceagent_mouse %d)\n",
b_info->u.hvm.spice.agent_mouse);
+
+ printf("\t\t\t(device_model %s)\n", b_info->device_model ?
: "default");
+ printf("\t\t\t(gfx_passthru %d)\n",
b_info->u.hvm.gfx_passthru);
+ printf("\t\t\t(serial %s)\n", b_info->u.hvm.serial);
+ printf("\t\t\t(boot %s)\n", b_info->u.hvm.boot);
+ printf("\t\t\t(usb %d)\n", b_info->u.hvm.usb);
+ printf("\t\t\t(usbdevice %s)\n", b_info->u.hvm.usbdevice);
+ printf("\t\t)\n");
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
+ printf("\t\t(linux %d)\n", 0);
+ printf("\t\t\t(kernel %s)\n", b_info->u.pv.kernel.path);
+ printf("\t\t\t(cmdline %s)\n", b_info->u.pv.cmdline);
+ printf("\t\t\t(ramdisk %s)\n", b_info->u.pv.ramdisk.path);
+ printf("\t\t\t(e820_host %d)\n", b_info->u.pv.e820_host);
+ printf("\t\t)\n");
+ break;
+ default:
+ fprintf(stderr, "Unknown domain type %d\n", c_info->type);
+ exit(1);
+ }
+ printf("\t)\n");
+
+ for (i = 0; i < d_config->num_disks; i++) {
+ printf("\t(device\n");
+ printf("\t\t(tap\n");
+ printf("\t\t\t(backend_domid %d)\n",
d_config->disks[i].backend_domid);
+ printf("\t\t\t(frontend_domid %d)\n", domid);
+ printf("\t\t\t(physpath %s)\n",
d_config->disks[i].pdev_path);
+ printf("\t\t\t(phystype %d)\n",
d_config->disks[i].backend);
+ printf("\t\t\t(virtpath %s)\n", d_config->disks[i].vdev);
+ printf("\t\t\t(unpluggable %d)\n",
d_config->disks[i].removable);
+ printf("\t\t\t(readwrite %d)\n",
d_config->disks[i].readwrite);
+ printf("\t\t\t(is_cdrom %d)\n",
d_config->disks[i].is_cdrom);
+ printf("\t\t)\n");
+ printf("\t)\n");
+ }
+
+ for (i = 0; i < d_config->num_vifs; i++) {
+ printf("\t(device\n");
+ printf("\t\t(vif\n");
+ if (d_config->vifs[i].ifname)
+ printf("\t\t\t(vifname %s)\n",
d_config->vifs[i].ifname);
+ printf("\t\t\t(backend_domid %d)\n",
d_config->vifs[i].backend_domid);
+ printf("\t\t\t(frontend_domid %d)\n", domid);
+ printf("\t\t\t(devid %d)\n", d_config->vifs[i].devid);
+ printf("\t\t\t(mtu %d)\n", d_config->vifs[i].mtu);
+ printf("\t\t\t(model %s)\n", d_config->vifs[i].model);
+ printf("\t\t\t(mac %02x%02x%02x%02x%02x%02x)\n",
+ d_config->vifs[i].mac[0], d_config->vifs[i].mac[1],
+ d_config->vifs[i].mac[2], d_config->vifs[i].mac[3],
+ d_config->vifs[i].mac[4], d_config->vifs[i].mac[5]);
+ printf("\t\t)\n");
+ printf("\t)\n");
+ }
+
+ for (i = 0; i < d_config->num_pcidevs; i++) {
+ printf("\t(device\n");
+ printf("\t\t(pci\n");
+ printf("\t\t\t(pci dev %04x:%02x:%02x.%01x@%02x)\n",
+ d_config->pcidevs[i].domain, d_config->pcidevs[i].bus,
+ d_config->pcidevs[i].dev, d_config->pcidevs[i].func,
+ d_config->pcidevs[i].vdevfn);
+ printf("\t\t\t(opts msitranslate %d power_mgmt %d)\n",
+ d_config->pcidevs[i].msitranslate,
+ d_config->pcidevs[i].power_mgmt);
+ printf("\t\t)\n");
+ printf("\t)\n");
+ }
+
+ for (i = 0; i < d_config->num_vfbs; i++) {
+ printf("\t(device\n");
+ printf("\t\t(vfb\n");
+ printf("\t\t\t(backend_domid %d)\n",
d_config->vfbs[i].backend_domid);
+ printf("\t\t\t(frontend_domid %d)\n", domid);
+ printf("\t\t\t(devid %d)\n", d_config->vfbs[i].devid);
+ printf("\t\t\t(vnc %d)\n", d_config->vfbs[i].vnc.enable);
+ printf("\t\t\t(vnclisten %s)\n",
d_config->vfbs[i].vnc.listen);
+ printf("\t\t\t(vncdisplay %d)\n",
d_config->vfbs[i].vnc.display);
+ printf("\t\t\t(vncunused %d)\n",
d_config->vfbs[i].vnc.findunused);
+ printf("\t\t\t(keymap %s)\n", d_config->vfbs[i].keymap);
+ printf("\t\t\t(sdl %d)\n", d_config->vfbs[i].sdl.enable);
+ printf("\t\t\t(opengl %d)\n",
d_config->vfbs[i].sdl.opengl);
+ printf("\t\t\t(display %s)\n",
d_config->vfbs[i].sdl.display);
+ printf("\t\t\t(xauthority %s)\n",
d_config->vfbs[i].sdl.xauthority);
+ printf("\t\t)\n");
+ printf("\t)\n");
+ }
+ printf(")\n");
+}
+
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */