diff options
author | Ian Campbell <ian.campbell@citrix.com> | 2012-02-07 17:01:57 +0000 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2012-02-07 17:01:57 +0000 |
commit | 9faa8b12d80ffb9615bc07adc2249af60c0e32f8 (patch) | |
tree | 288e80d3464bd8e0a742f371162308d4707759f4 /tools/libxl | |
parent | 914e61c1ec5a7996a3e71692ce41e77359e70e0c (diff) | |
download | xen-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/Makefile | 2 | ||||
-rw-r--r-- | tools/libxl/libxl.h | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_json.c | 152 | ||||
-rw-r--r-- | tools/libxl/libxl_json.h | 3 | ||||
-rw-r--r-- | tools/libxl/xl.c | 10 | ||||
-rw-r--r-- | tools/libxl/xl.h | 8 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 226 | ||||
-rw-r--r-- | tools/libxl/xl_sxp.c | 220 |
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: + */ |