mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-26 18:41:17 +00:00
Changes needed for multiple graphics adapters
* src/domain_conf.c src/domain_conf.h: parse and save multiple graphics elements instead of one, patch by Pritesh Kothari * src/qemu_conf.c src/qemu_driver.c: adapt the qemu/kvm driver for the new structures, patch by Pritesh Kothari * src/xend_internal.c src/xm_internal.c: same thing for Xen drivers Daniel
This commit is contained in:
parent
9f9ce6130d
commit
7ee54d8356
@ -1,3 +1,11 @@
|
||||
Thu May 7 09:24:47 CEST 2009 Daniel Veillard <veillard@redhat.com>
|
||||
|
||||
* src/domain_conf.c src/domain_conf.h: parse and save multiple
|
||||
graphics elements instead of one, patch by Pritesh Kothari
|
||||
* src/qemu_conf.c src/qemu_driver.c: adapt the qemu/kvm driver for
|
||||
the new structures, patch by Pritesh Kothari
|
||||
* src/xend_internal.c src/xm_internal.c: same thing for Xen drivers
|
||||
|
||||
Thu May 7 09:16:05 CEST 2009 Guido Günther <agx@sigxcpu.org>
|
||||
|
||||
* src/lxc_controller.c (main): don't crash when called without
|
||||
|
@ -408,7 +408,9 @@ void virDomainDefFree(virDomainDefPtr def)
|
||||
if (!def)
|
||||
return;
|
||||
|
||||
virDomainGraphicsDefFree(def->graphics);
|
||||
for (i = 0 ; i < def->ngraphics ; i++)
|
||||
virDomainGraphicsDefFree(def->graphics[i]);
|
||||
VIR_FREE(def->graphics);
|
||||
|
||||
for (i = 0 ; i < def->ninputs ; i++)
|
||||
virDomainInputDefFree(def->inputs[i]);
|
||||
@ -2422,19 +2424,21 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
|
||||
"%s", _("cannot extract graphics devices"));
|
||||
goto error;
|
||||
}
|
||||
if (n > 0) {
|
||||
if (n && VIR_ALLOC_N(def->graphics, n) < 0)
|
||||
goto no_memory;
|
||||
for (i = 0 ; i < n ; i++) {
|
||||
virDomainGraphicsDefPtr graphics = virDomainGraphicsDefParseXML(conn,
|
||||
nodes[0],
|
||||
nodes[i],
|
||||
flags);
|
||||
if (!graphics)
|
||||
goto error;
|
||||
|
||||
def->graphics = graphics;
|
||||
def->graphics[def->ngraphics++] = graphics;
|
||||
}
|
||||
VIR_FREE(nodes);
|
||||
|
||||
/* If graphics are enabled, there's an implicit PS2 mouse */
|
||||
if (def->graphics != NULL) {
|
||||
if (def->ngraphics > 0) {
|
||||
virDomainInputDefPtr input;
|
||||
|
||||
if (VIR_ALLOC(input) < 0) {
|
||||
@ -3506,7 +3510,7 @@ char *virDomainDefFormat(virConnectPtr conn,
|
||||
virDomainInputDefFormat(conn, &buf, def->inputs[n]) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (def->graphics) {
|
||||
if (def->ngraphics > 0) {
|
||||
/* If graphics is enabled, add the implicit mouse */
|
||||
virDomainInputDef autoInput = {
|
||||
VIR_DOMAIN_INPUT_TYPE_MOUSE,
|
||||
@ -3517,8 +3521,9 @@ char *virDomainDefFormat(virConnectPtr conn,
|
||||
if (virDomainInputDefFormat(conn, &buf, &autoInput) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virDomainGraphicsDefFormat(conn, &buf, def, def->graphics, flags) < 0)
|
||||
goto cleanup;
|
||||
for (n = 0 ; n < def->ngraphics ; n++)
|
||||
if (virDomainGraphicsDefFormat(conn, &buf, def, def->graphics[n], flags) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
for (n = 0 ; n < def->nsounds ; n++)
|
||||
|
@ -456,8 +456,8 @@ struct _virDomainDef {
|
||||
|
||||
int localtime;
|
||||
|
||||
/* Only 1 */
|
||||
virDomainGraphicsDefPtr graphics;
|
||||
int ngraphics;
|
||||
virDomainGraphicsDefPtr *graphics;
|
||||
|
||||
int ndisks;
|
||||
virDomainDiskDefPtr *disks;
|
||||
|
@ -1348,21 +1348,21 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||
}
|
||||
}
|
||||
|
||||
if (def->graphics &&
|
||||
def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
|
||||
if ((def->ngraphics == 1) &&
|
||||
def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
|
||||
virBuffer opt = VIR_BUFFER_INITIALIZER;
|
||||
char *optstr;
|
||||
|
||||
if (qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON) {
|
||||
if (def->graphics->data.vnc.listenAddr)
|
||||
virBufferAdd(&opt, def->graphics->data.vnc.listenAddr, -1);
|
||||
if (def->graphics[0]->data.vnc.listenAddr)
|
||||
virBufferAdd(&opt, def->graphics[0]->data.vnc.listenAddr, -1);
|
||||
else if (driver->vncListen)
|
||||
virBufferAdd(&opt, driver->vncListen, -1);
|
||||
|
||||
virBufferVSprintf(&opt, ":%d",
|
||||
def->graphics->data.vnc.port - 5900);
|
||||
def->graphics[0]->data.vnc.port - 5900);
|
||||
|
||||
if (def->graphics->data.vnc.passwd ||
|
||||
if (def->graphics[0]->data.vnc.passwd ||
|
||||
driver->vncPassword)
|
||||
virBufferAddLit(&opt, ",password");
|
||||
|
||||
@ -1387,7 +1387,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||
}
|
||||
} else {
|
||||
virBufferVSprintf(&opt, "%d",
|
||||
def->graphics->data.vnc.port - 5900);
|
||||
def->graphics[0]->data.vnc.port - 5900);
|
||||
}
|
||||
if (virBufferError(&opt))
|
||||
goto no_memory;
|
||||
@ -1396,22 +1396,22 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||
|
||||
ADD_ARG_LIT("-vnc");
|
||||
ADD_ARG(optstr);
|
||||
if (def->graphics->data.vnc.keymap) {
|
||||
if (def->graphics[0]->data.vnc.keymap) {
|
||||
ADD_ARG_LIT("-k");
|
||||
ADD_ARG_LIT(def->graphics->data.vnc.keymap);
|
||||
ADD_ARG_LIT(def->graphics[0]->data.vnc.keymap);
|
||||
}
|
||||
} else if (def->graphics &&
|
||||
def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
||||
} else if ((def->ngraphics == 1) &&
|
||||
def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
||||
char *xauth = NULL;
|
||||
char *display = NULL;
|
||||
|
||||
if (def->graphics->data.sdl.xauth &&
|
||||
if (def->graphics[0]->data.sdl.xauth &&
|
||||
virAsprintf(&xauth, "XAUTHORITY=%s",
|
||||
def->graphics->data.sdl.xauth) < 0)
|
||||
def->graphics[0]->data.sdl.xauth) < 0)
|
||||
goto no_memory;
|
||||
if (def->graphics->data.sdl.display &&
|
||||
if (def->graphics[0]->data.sdl.display &&
|
||||
virAsprintf(&display, "DISPLAY=%s",
|
||||
def->graphics->data.sdl.display) < 0) {
|
||||
def->graphics[0]->data.sdl.display) < 0) {
|
||||
VIR_FREE(xauth);
|
||||
goto no_memory;
|
||||
}
|
||||
@ -1420,7 +1420,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||
ADD_ENV(xauth);
|
||||
if (display)
|
||||
ADD_ENV(display);
|
||||
if (def->graphics->data.sdl.fullscreen)
|
||||
if (def->graphics[0]->data.sdl.fullscreen)
|
||||
ADD_ARG_LIT("-full-screen");
|
||||
}
|
||||
|
||||
|
@ -1140,13 +1140,13 @@ qemudInitPasswords(virConnectPtr conn,
|
||||
* for that yet...
|
||||
*/
|
||||
|
||||
if (vm->def->graphics &&
|
||||
vm->def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
|
||||
(vm->def->graphics->data.vnc.passwd || driver->vncPassword)) {
|
||||
if ((vm->def->ngraphics == 1) &&
|
||||
vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
|
||||
(vm->def->graphics[0]->data.vnc.passwd || driver->vncPassword)) {
|
||||
|
||||
if (qemudMonitorCommandExtra(vm, "change vnc password",
|
||||
vm->def->graphics->data.vnc.passwd ?
|
||||
vm->def->graphics->data.vnc.passwd :
|
||||
vm->def->graphics[0]->data.vnc.passwd ?
|
||||
vm->def->graphics[0]->data.vnc.passwd :
|
||||
driver->vncPassword,
|
||||
QEMU_PASSWD_PROMPT,
|
||||
&info) < 0) {
|
||||
@ -1338,16 +1338,16 @@ static int qemudStartVMDaemon(virConnectPtr conn,
|
||||
driver->securityDriver->domainGenSecurityLabel(conn, vm) < 0)
|
||||
return -1;
|
||||
|
||||
if (vm->def->graphics &&
|
||||
vm->def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
|
||||
vm->def->graphics->data.vnc.autoport) {
|
||||
if ((vm->def->ngraphics == 1) &&
|
||||
vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
|
||||
vm->def->graphics[0]->data.vnc.autoport) {
|
||||
int port = qemudNextFreeVNCPort(driver);
|
||||
if (port < 0) {
|
||||
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("Unable to find an unused VNC port"));
|
||||
goto cleanup;
|
||||
}
|
||||
vm->def->graphics->data.vnc.port = port;
|
||||
vm->def->graphics[0]->data.vnc.port = port;
|
||||
}
|
||||
|
||||
if (virFileMakePath(driver->logDir) < 0) {
|
||||
@ -1504,10 +1504,10 @@ cleanup:
|
||||
VIR_FREE(vm->def->seclabel.label);
|
||||
VIR_FREE(vm->def->seclabel.imagelabel);
|
||||
}
|
||||
if (vm->def->graphics &&
|
||||
vm->def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
|
||||
vm->def->graphics->data.vnc.autoport)
|
||||
vm->def->graphics->data.vnc.port = -1;
|
||||
if ((vm->def->ngraphics == 1) &&
|
||||
vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
|
||||
vm->def->graphics[0]->data.vnc.autoport)
|
||||
vm->def->graphics[0]->data.vnc.port = -1;
|
||||
if (vm->logfile != -1) {
|
||||
close(vm->logfile);
|
||||
vm->logfile = -1;
|
||||
|
@ -2023,7 +2023,11 @@ xenDaemonParseSxprGraphicsOld(virConnectPtr conn,
|
||||
!(graphics->data.vnc.keymap = strdup(keymap)))
|
||||
goto no_memory;
|
||||
|
||||
def->graphics = graphics;
|
||||
if (VIR_ALLOC_N(def->graphics, 1) < 0)
|
||||
goto no_memory;
|
||||
def->graphics[0] = graphics;
|
||||
def->ngraphics = 1;
|
||||
graphics = NULL;
|
||||
} else if ((tmp = sexpr_fmt_node(root, "domain/image/%s/sdl", hvm ? "hvm" : "linux")) &&
|
||||
tmp[0] == '1') {
|
||||
/* Graphics device (HVM, or old (pre-3.0.4) style PV sdl config) */
|
||||
@ -2041,7 +2045,11 @@ xenDaemonParseSxprGraphicsOld(virConnectPtr conn,
|
||||
!(graphics->data.sdl.xauth = strdup(xauth)))
|
||||
goto no_memory;
|
||||
|
||||
def->graphics = graphics;
|
||||
if (VIR_ALLOC_N(def->graphics, 1) < 0)
|
||||
goto no_memory;
|
||||
def->graphics[0] = graphics;
|
||||
def->ngraphics = 1;
|
||||
graphics = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -2130,7 +2138,11 @@ xenDaemonParseSxprGraphicsNew(virConnectPtr conn,
|
||||
goto no_memory;
|
||||
}
|
||||
|
||||
def->graphics = graphics;
|
||||
if (VIR_ALLOC_N(def->graphics, 1) < 0)
|
||||
goto no_memory;
|
||||
def->graphics[0] = graphics;
|
||||
def->ngraphics = 1;
|
||||
graphics = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2447,7 +2459,7 @@ xenDaemonParseSxpr(virConnectPtr conn,
|
||||
goto error;
|
||||
|
||||
/* Graphics device (HVM <= 3.0.4, or PV <= 3.0.3) vnc config */
|
||||
if (!def->graphics &&
|
||||
if ((def->ngraphics == 0) &&
|
||||
xenDaemonParseSxprGraphicsOld(conn, def, root, hvm, xendConfigVersion) < 0)
|
||||
goto error;
|
||||
|
||||
@ -5731,8 +5743,9 @@ xenDaemonFormatSxpr(virConnectPtr conn,
|
||||
/* PV graphics for xen <= 3.0.4, or HVM graphics for xen <= 3.1.0 */
|
||||
if ((!hvm && xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF) ||
|
||||
(hvm && xendConfigVersion < 4)) {
|
||||
if (def->graphics &&
|
||||
xenDaemonFormatSxprGraphicsOld(conn, def->graphics, &buf, xendConfigVersion) < 0)
|
||||
if ((def->ngraphics == 1) &&
|
||||
xenDaemonFormatSxprGraphicsOld(conn, def->graphics[0],
|
||||
&buf, xendConfigVersion) < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
@ -5756,8 +5769,8 @@ xenDaemonFormatSxpr(virConnectPtr conn,
|
||||
* or HVM graphics config xen >= 3.0.5 */
|
||||
if ((xendConfigVersion >= XEND_CONFIG_MIN_VERS_PVFB_NEWCONF && !hvm) ||
|
||||
(xendConfigVersion >= 4 && hvm)) {
|
||||
if (def->graphics &&
|
||||
xenDaemonFormatSxprGraphicsNew(conn, def->graphics, &buf) < 0)
|
||||
if ((def->ngraphics == 1) &&
|
||||
xenDaemonFormatSxprGraphicsNew(conn, def->graphics[0], &buf) < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -1257,7 +1257,10 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
|
||||
if (xenXMConfigCopyStringOpt(conn, conf, "keymap", &graphics->data.vnc.keymap) < 0)
|
||||
goto cleanup;
|
||||
|
||||
def->graphics = graphics;
|
||||
if (VIR_ALLOC_N(def->graphics, 1) < 0)
|
||||
goto no_memory;
|
||||
def->graphics[0] = graphics;
|
||||
def->ngraphics = 1;
|
||||
graphics = NULL;
|
||||
} else {
|
||||
if (xenXMConfigGetBool(conn, conf, "sdl", &val, 0) < 0)
|
||||
@ -1270,7 +1273,10 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
|
||||
goto cleanup;
|
||||
if (xenXMConfigCopyStringOpt(conn, conf, "xauthority", &graphics->data.sdl.xauth) < 0)
|
||||
goto cleanup;
|
||||
def->graphics = graphics;
|
||||
if (VIR_ALLOC_N(def->graphics, 1) < 0)
|
||||
goto no_memory;
|
||||
def->graphics[0] = graphics;
|
||||
def->ngraphics = 1;
|
||||
graphics = NULL;
|
||||
}
|
||||
}
|
||||
@ -1339,7 +1345,10 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
|
||||
nextkey++;
|
||||
key = nextkey;
|
||||
}
|
||||
def->graphics = graphics;
|
||||
if (VIR_ALLOC_N(def->graphics, 1) < 0)
|
||||
goto no_memory;
|
||||
def->graphics[0] = graphics;
|
||||
def->ngraphics = 1;
|
||||
graphics = NULL;
|
||||
}
|
||||
}
|
||||
@ -2305,20 +2314,20 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
|
||||
}
|
||||
}
|
||||
|
||||
if (def->graphics) {
|
||||
if (def->ngraphics == 1) {
|
||||
if (priv->xendConfigVersion < (hvm ? 4 : XEND_CONFIG_MIN_VERS_PVFB_NEWCONF)) {
|
||||
if (def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
||||
if (def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
||||
if (xenXMConfigSetInt(conf, "sdl", 1) < 0)
|
||||
goto no_memory;
|
||||
if (xenXMConfigSetInt(conf, "vnc", 0) < 0)
|
||||
goto no_memory;
|
||||
if (def->graphics->data.sdl.display &&
|
||||
if (def->graphics[0]->data.sdl.display &&
|
||||
xenXMConfigSetString(conf, "display",
|
||||
def->graphics->data.sdl.display) < 0)
|
||||
def->graphics[0]->data.sdl.display) < 0)
|
||||
goto no_memory;
|
||||
if (def->graphics->data.sdl.xauth &&
|
||||
if (def->graphics[0]->data.sdl.xauth &&
|
||||
xenXMConfigSetString(conf, "xauthority",
|
||||
def->graphics->data.sdl.xauth) < 0)
|
||||
def->graphics[0]->data.sdl.xauth) < 0)
|
||||
goto no_memory;
|
||||
} else {
|
||||
if (xenXMConfigSetInt(conf, "sdl", 0) < 0)
|
||||
@ -2326,53 +2335,53 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
|
||||
if (xenXMConfigSetInt(conf, "vnc", 1) < 0)
|
||||
goto no_memory;
|
||||
if (xenXMConfigSetInt(conf, "vncunused",
|
||||
def->graphics->data.vnc.autoport ? 1 : 0) < 0)
|
||||
def->graphics[0]->data.vnc.autoport ? 1 : 0) < 0)
|
||||
goto no_memory;
|
||||
if (!def->graphics->data.vnc.autoport &&
|
||||
if (!def->graphics[0]->data.vnc.autoport &&
|
||||
xenXMConfigSetInt(conf, "vncdisplay",
|
||||
def->graphics->data.vnc.port - 5900) < 0)
|
||||
def->graphics[0]->data.vnc.port - 5900) < 0)
|
||||
goto no_memory;
|
||||
if (def->graphics->data.vnc.listenAddr &&
|
||||
if (def->graphics[0]->data.vnc.listenAddr &&
|
||||
xenXMConfigSetString(conf, "vnclisten",
|
||||
def->graphics->data.vnc.listenAddr) < 0)
|
||||
def->graphics[0]->data.vnc.listenAddr) < 0)
|
||||
goto no_memory;
|
||||
if (def->graphics->data.vnc.passwd &&
|
||||
if (def->graphics[0]->data.vnc.passwd &&
|
||||
xenXMConfigSetString(conf, "vncpasswd",
|
||||
def->graphics->data.vnc.passwd) < 0)
|
||||
def->graphics[0]->data.vnc.passwd) < 0)
|
||||
goto no_memory;
|
||||
if (def->graphics->data.vnc.keymap &&
|
||||
if (def->graphics[0]->data.vnc.keymap &&
|
||||
xenXMConfigSetString(conf, "keymap",
|
||||
def->graphics->data.vnc.keymap) < 0)
|
||||
def->graphics[0]->data.vnc.keymap) < 0)
|
||||
goto no_memory;
|
||||
}
|
||||
} else {
|
||||
virConfValuePtr vfb, disp;
|
||||
char *vfbstr = NULL;
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
if (def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
||||
if (def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
|
||||
virBufferAddLit(&buf, "type=sdl");
|
||||
if (def->graphics->data.sdl.display)
|
||||
if (def->graphics[0]->data.sdl.display)
|
||||
virBufferVSprintf(&buf, ",display=%s",
|
||||
def->graphics->data.sdl.display);
|
||||
if (def->graphics->data.sdl.xauth)
|
||||
def->graphics[0]->data.sdl.display);
|
||||
if (def->graphics[0]->data.sdl.xauth)
|
||||
virBufferVSprintf(&buf, ",xauthority=%s",
|
||||
def->graphics->data.sdl.xauth);
|
||||
def->graphics[0]->data.sdl.xauth);
|
||||
} else {
|
||||
virBufferAddLit(&buf, "type=vnc");
|
||||
virBufferVSprintf(&buf, ",vncunused=%d",
|
||||
def->graphics->data.vnc.autoport ? 1 : 0);
|
||||
if (!def->graphics->data.vnc.autoport)
|
||||
def->graphics[0]->data.vnc.autoport ? 1 : 0);
|
||||
if (!def->graphics[0]->data.vnc.autoport)
|
||||
virBufferVSprintf(&buf, ",vncdisplay=%d",
|
||||
def->graphics->data.vnc.port - 5900);
|
||||
if (def->graphics->data.vnc.listenAddr)
|
||||
def->graphics[0]->data.vnc.port - 5900);
|
||||
if (def->graphics[0]->data.vnc.listenAddr)
|
||||
virBufferVSprintf(&buf, ",vnclisten=%s",
|
||||
def->graphics->data.vnc.listenAddr);
|
||||
if (def->graphics->data.vnc.passwd)
|
||||
def->graphics[0]->data.vnc.listenAddr);
|
||||
if (def->graphics[0]->data.vnc.passwd)
|
||||
virBufferVSprintf(&buf, ",vncpasswd=%s",
|
||||
def->graphics->data.vnc.passwd);
|
||||
if (def->graphics->data.vnc.keymap)
|
||||
def->graphics[0]->data.vnc.passwd);
|
||||
if (def->graphics[0]->data.vnc.keymap)
|
||||
virBufferVSprintf(&buf, ",keymap=%s",
|
||||
def->graphics->data.vnc.keymap);
|
||||
def->graphics[0]->data.vnc.keymap);
|
||||
}
|
||||
if (virBufferError(&buf))
|
||||
goto no_memory;
|
||||
|
Loading…
Reference in New Issue
Block a user