aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2012-02-07 17:01:57 +0000
committerIan Campbell <ian.campbell@citrix.com>2012-02-07 17:01:57 +0000
commit9faa8b12d80ffb9615bc07adc2249af60c0e32f8 (patch)
tree288e80d3464bd8e0a742f371162308d4707759f4 /tools/libxl
parent914e61c1ec5a7996a3e71692ce41e77359e70e0c (diff)
downloadxen-9faa8b12d80ffb9615bc07adc2249af60c0e32f8.tar.gz
xen-9faa8b12d80ffb9615bc07adc2249af60c0e32f8.tar.bz2
xen-9faa8b12d80ffb9615bc07adc2249af60c0e32f8.zip
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> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/libxl')
-rw-r--r--tools/libxl/Makefile2
-rw-r--r--tools/libxl/libxl.h2
-rw-r--r--tools/libxl/libxl_json.c152
-rw-r--r--tools/libxl/libxl_json.h3
-rw-r--r--tools/libxl/xl.c10
-rw-r--r--tools/libxl/xl.h8
-rw-r--r--tools/libxl/xl_cmdimpl.c226
-rw-r--r--tools/libxl/xl_sxp.c220
8 files changed, 449 insertions, 174 deletions
diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index d5893d7ef2..06764f25f9 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -66,7 +66,7 @@ $(LIBXLU_OBJS): CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h
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 --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 3ec22bcde1..1bffa039c4 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -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 --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
index d5e970d20f..54186838d3 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -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 --git a/tools/libxl/libxl_json.h b/tools/libxl/libxl_json.h
index 898dec79e7..bee029317f 100644
--- a/tools/libxl/libxl_json.h
+++ b/tools/libxl/libxl_json.h
@@ -70,4 +70,7 @@ static inline yajl_gen libxl__yajl_gen_alloc(const yajl_alloc_funcs *allocFuncs)
#endif /* !HAVE_YAJL_V2 */
+yajl_gen_status libxl_domain_config_gen_json(yajl_gen hand,
+ libxl_domain_config *p);
+
#endif /* LIBXL_JSON_H */
diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c
index 02a680326f..9dac99842e 100644
--- a/tools/libxl/xl.c
+++ b/tools/libxl/xl.c
@@ -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 char *configfile,
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 --git a/tools/libxl/xl.h b/tools/libxl/xl.h
index 6c30765c7a..a852a43d36 100644
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -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 --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 70f9848f36..61ca902084 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -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 line, const char *func, char *fmt, ...)
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;
+ if (output_format == OUTPUT_FORMAT_SXP)
+ return printf_info_sexp(domid, d_config);
- 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);
+ yajl_gen_config conf = { 1, " " };
+ const char *buf;
+ unsigned int len = 0;
+ yajl_gen_status s;
+ yajl_gen hand;
- /* 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");
+ hand = yajl_gen_alloc(&conf, NULL);
+ if (!hand) {
+ fprintf(stderr, "unable to allocate JSON generator\n");
+ return;
}
- 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");
+ 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(platformdata (null))\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;
- 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);
+ s = yajl_gen_map_close(hand);
+ if (s != yajl_gen_status_ok)
+ goto out;
- 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");
- }
- }
+ s = yajl_gen_get_buf(hand, (const unsigned char **)&buf, &len);
+ if (s != yajl_gen_status_ok)
+ goto out;
- 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");
+ 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 *configfile_filename_report,
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_create *dom_info)
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 libxl_dominfo *info, int nb_domain)
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 --git a/tools/libxl/xl_sxp.c b/tools/libxl/xl_sxp.c
new file mode 100644
index 0000000000..25ca0bdd11
--- /dev/null
+++ b/tools/libxl/xl_sxp.c
@@ -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:
+ */