static int qemuMigrationCookieAddGraphics(qemuMigrationCookiePtr mig, virQEMUDriverPtr driver, virDomainObjPtr dom) { size_t i = 0; if (mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Migration graphics data already present")); return -1; } for (i = 0; i < dom->def->ngraphics; i++) { if (dom->def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { virDomainGraphicsListenDefPtr glisten = virDomainGraphicsGetListen(dom->def->graphics[i], 0); if (!glisten) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing listen element")); return -1; } switch (glisten->type) { case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS: case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK: /* Seamless migration is supported only for listen types * 'address and 'network'. */ if (!(mig->graphics = qemuMigrationCookieGraphicsSpiceAlloc(driver, dom->def->graphics[i], glisten))) return -1; mig->flags |= QEMU_MIGRATION_COOKIE_GRAPHICS; break; case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET: case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE: case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: break; } /* Seamless migration is supported only for one graphics. */ if (mig->graphics) break; } } return 0; }
static int xenFormatXLSpice(virConfPtr conf, virDomainDefPtr def) { virDomainGraphicsListenDefPtr glisten; virDomainGraphicsDefPtr graphics; if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) { graphics = def->graphics[0]; if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { /* set others to false but may not be necessary */ if (xenConfigSetInt(conf, "sdl", 0) < 0) return -1; if (xenConfigSetInt(conf, "vnc", 0) < 0) return -1; if (xenConfigSetInt(conf, "spice", 1) < 0) return -1; if ((glisten = virDomainGraphicsGetListen(graphics, 0)) && glisten->address && xenConfigSetString(conf, "spicehost", glisten->address) < 0) return -1; if (xenConfigSetInt(conf, "spiceport", graphics->data.spice.port) < 0) return -1; if (xenConfigSetInt(conf, "spicetls_port", graphics->data.spice.tlsPort) < 0) return -1; if (graphics->data.spice.auth.passwd) { if (xenConfigSetInt(conf, "spicedisable_ticketing", 0) < 0) return -1; if (xenConfigSetString(conf, "spicepasswd", graphics->data.spice.auth.passwd) < 0) return -1; } else { if (xenConfigSetInt(conf, "spicedisable_ticketing", 1) < 0) return -1; } if (graphics->data.spice.mousemode) { switch (graphics->data.spice.mousemode) { case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_SERVER: if (xenConfigSetInt(conf, "spiceagent_mouse", 0) < 0) return -1; break; case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_CLIENT: if (xenConfigSetInt(conf, "spiceagent_mouse", 1) < 0) return -1; /* * spicevdagent must be enabled if using client * mode mouse */ if (xenConfigSetInt(conf, "spicevdagent", 1) < 0) return -1; break; default: break; } } if (graphics->data.spice.copypaste == VIR_TRISTATE_BOOL_YES) { if (xenConfigSetInt(conf, "spice_clipboard_sharing", 1) < 0) return -1; /* * spicevdagent must be enabled if spice_clipboard_sharing * is enabled */ if (xenConfigSetInt(conf, "spicevdagent", 1) < 0) return -1; } } } return 0; }