=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.
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
}
RC=0
;;
esac
- done < <($CMD list -l | grep '(\(domain\|domid\|name\)')
+ done < <($CMD list -l | grep $LIST_GREP)
return $RC
}
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
}
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/*
return 0
;;
esac
- done < <($CMD list -l | grep '(\(domain\|domid\|name\)')
+ done < <($CMD list -l | grep $LIST_GREP)
return 1
}
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)
#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 */
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,
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
#endif /* !HAVE_YAJL_V2 */
+yajl_gen_status libxl_domain_config_gen_json(yajl_gen hand,
+ libxl_domain_config *p);
+
#endif /* LIBXL_JSON_H */
int autoballoon = 1;
char *lockfile;
char *default_vifscript = NULL;
+enum output_format default_output_format = OUTPUT_FORMAT_JSON;
static xentoollog_level minmsglevel = XTL_PROGRESS;
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);
}
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 */
/*
#include "libxl.h"
#include "libxl_utils.h"
+#include "libxl_json.h"
#include "libxlutil.h"
#include "xl.h"
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)
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);
}
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)
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);
--- /dev/null
+/*
+ * 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:
+ */