/* 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 %s)\n", libxl_defbool_to_string(c_info->hap)); printf("\t(oos %s)\n", libxl_defbool_to_string(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"); } if (c_info->pool_name) printf("\t(cpupool %s)\n", c_info->pool_name); 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 %"PRId64")\n", b_info->max_memkb); printf("\t(target_memkb %"PRId64")\n", b_info->target_memkb); printf("\t(nomigrate %s)\n", libxl_defbool_to_string(b_info->disable_migrate)); if (c_info->type == LIBXL_DOMAIN_TYPE_PV && b_info->u.pv.bootloader) { 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 %"PRId64")\n", b_info->video_memkb); printf("\t\t\t(shadow_memkb %"PRId64")\n", b_info->shadow_memkb); printf("\t\t\t(pae %s)\n", libxl_defbool_to_string(b_info->u.hvm.pae)); printf("\t\t\t(apic %s)\n", libxl_defbool_to_string(b_info->u.hvm.apic)); printf("\t\t\t(acpi %s)\n", libxl_defbool_to_string(b_info->u.hvm.acpi)); printf("\t\t\t(nx %s)\n", libxl_defbool_to_string(b_info->u.hvm.nx)); printf("\t\t\t(viridian %s)\n", libxl_defbool_to_string(b_info->u.hvm.viridian)); printf("\t\t\t(hpet %s)\n", libxl_defbool_to_string(b_info->u.hvm.hpet)); printf("\t\t\t(vpt_align %s)\n", libxl_defbool_to_string(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 %s)\n", libxl_defbool_to_string(b_info->u.hvm.nested_hvm)); printf("\t\t\t(stdvga %s)\n", b_info->u.hvm.vga.kind == LIBXL_VGA_INTERFACE_TYPE_STD ? "True" : "False"); printf("\t\t\t(vnc %s)\n", libxl_defbool_to_string(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 %s)\n", libxl_defbool_to_string(b_info->u.hvm.vnc.findunused)); printf("\t\t\t(keymap %s)\n", b_info->u.hvm.keymap); printf("\t\t\t(sdl %s)\n", libxl_defbool_to_string(b_info->u.hvm.sdl.enable)); printf("\t\t\t(opengl %s)\n", libxl_defbool_to_string(b_info->u.hvm.sdl.opengl)); printf("\t\t\t(nographic %s)\n", libxl_defbool_to_string(b_info->u.hvm.nographic)); printf("\t\t\t(spice %s)\n", libxl_defbool_to_string(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 %s)\n", libxl_defbool_to_string(b_info->u.hvm.spice.disable_ticketing)); printf("\t\t\t(spiceagent_mouse %s)\n", libxl_defbool_to_string(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 %s)\n", libxl_defbool_to_string(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 %s)\n", libxl_defbool_to_string(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); printf("\t\t\t(cmdline %s)\n", b_info->u.pv.cmdline); printf("\t\t\t(ramdisk %s)\n", b_info->u.pv.ramdisk); printf("\t\t\t(e820_host %s)\n", libxl_defbool_to_string(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_nics; i++) { printf("\t(device\n"); printf("\t\t(vif\n"); if (d_config->nics[i].ifname) printf("\t\t\t(vifname %s)\n", d_config->nics[i].ifname); printf("\t\t\t(backend_domid %d)\n", d_config->nics[i].backend_domid); printf("\t\t\t(frontend_domid %d)\n", domid); printf("\t\t\t(devid %d)\n", d_config->nics[i].devid); printf("\t\t\t(mtu %d)\n", d_config->nics[i].mtu); printf("\t\t\t(model %s)\n", d_config->nics[i].model); printf("\t\t\t(mac %02x%02x%02x%02x%02x%02x)\n", d_config->nics[i].mac[0], d_config->nics[i].mac[1], d_config->nics[i].mac[2], d_config->nics[i].mac[3], d_config->nics[i].mac[4], d_config->nics[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 %s)\n", libxl_defbool_to_string(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 %s)\n", libxl_defbool_to_string(d_config->vfbs[i].vnc.findunused)); printf("\t\t\t(keymap %s)\n", d_config->vfbs[i].keymap); printf("\t\t\t(sdl %s)\n", libxl_defbool_to_string(d_config->vfbs[i].sdl.enable)); printf("\t\t\t(opengl %s)\n", libxl_defbool_to_string(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"); }
int libxl__domain_rename(libxl__gc *gc, uint32_t domid, const char *old_name, const char *new_name, xs_transaction_t trans) { libxl_ctx *ctx = libxl__gc_owner(gc); char *dom_path = 0; const char *name_path; char *got_old_name; unsigned int got_old_len; xs_transaction_t our_trans = 0; uint32_t stub_dm_domid; const char *stub_dm_old_name = NULL, *stub_dm_new_name = NULL; int rc; libxl_dominfo info; char *uuid; const char *vm_name_path; libxl_dominfo_init(&info); dom_path = libxl__xs_get_dompath(gc, domid); if (!dom_path) goto x_nomem; name_path= GCSPRINTF("%s/name", dom_path); if (!name_path) goto x_nomem; stub_dm_domid = libxl_get_stubdom_id(CTX, domid); if (stub_dm_domid) { stub_dm_old_name = libxl__stub_dm_name(gc, old_name); stub_dm_new_name = libxl__stub_dm_name(gc, new_name); } retry_transaction: if (!trans) { trans = our_trans = xs_transaction_start(ctx->xsh); if (!our_trans) { LOGEVD(ERROR, errno, domid, "Create xs transaction for domain (re)name"); goto x_fail; } } if (!new_name) { LOGD(ERROR, domid, "New domain name not specified"); rc = ERROR_INVAL; goto x_rc; } if (new_name[0]) { /* nonempty names must be unique */ uint32_t domid_e; rc = libxl_name_to_domid(ctx, new_name, &domid_e); if (rc == ERROR_INVAL) { /* no such domain, good */ } else if (rc != 0) { LOGD(ERROR, domid, "Unexpected error checking for existing domain"); goto x_rc; } else if (domid_e == domid) { /* domain already has this name, ok (but we do still * need the rest of the code as we may need to check * old_name, for example). */ } else { LOGD(ERROR, domid, "Domain with name \"%s\" already exists.", new_name); rc = ERROR_INVAL; goto x_rc; } } if (old_name) { got_old_name = xs_read(ctx->xsh, trans, name_path, &got_old_len); if (!got_old_name) { LOGEVD(ERROR, errno, domid, "Check old name for domain allegedly named `%s'", old_name); goto x_fail; } if (strcmp(old_name, got_old_name)) { LOGD(ERROR, domid, "Allegedly named `%s' is actually named `%s' - racing ?", old_name, got_old_name); free(got_old_name); goto x_fail; } free(got_old_name); } if (!xs_write(ctx->xsh, trans, name_path, new_name, strlen(new_name))) { LOGD(ERROR, domid, "Failed to write new name `%s'" " for domain previously named `%s'", new_name, old_name); goto x_fail; } /* update /vm/<uuid>/name */ rc = libxl_domain_info(ctx, &info, domid); if (rc) goto x_rc; uuid = GCSPRINTF(LIBXL_UUID_FMT, LIBXL_UUID_BYTES(info.uuid)); vm_name_path = GCSPRINTF("/vm/%s/name", uuid); if (libxl__xs_write_checked(gc, trans, vm_name_path, new_name)) goto x_fail; if (stub_dm_domid) { rc = libxl__domain_rename(gc, stub_dm_domid, stub_dm_old_name, stub_dm_new_name, trans); if (rc) { LOGED(ERROR, domid, "Unable to rename stub-domain"); goto x_rc; } } if (our_trans) { if (!xs_transaction_end(ctx->xsh, our_trans, 0)) { trans = our_trans = 0; if (errno != EAGAIN) { LOGD(ERROR, domid, "Failed to commit new name `%s'" " for domain previously named `%s'", new_name, old_name); goto x_fail; } LOGD(DEBUG, domid, "Need to retry rename transaction" " for domain (name_path=\"%s\", new_name=\"%s\")", name_path, new_name); goto retry_transaction; } our_trans = 0; } rc = 0; x_rc: if (our_trans) xs_transaction_end(ctx->xsh, our_trans, 1); libxl_dominfo_dispose(&info); return rc; x_fail: rc = ERROR_FAIL; goto x_rc; x_nomem: rc = ERROR_NOMEM; goto x_rc; }