Index: src/xm_internal.c =================================================================== RCS file: /data/cvs/libxen/src/xm_internal.c,v retrieving revision 1.125 diff -u -r1.125 xm_internal.c --- src/xm_internal.c 24 Apr 2009 12:17:50 -0000 1.125 +++ src/xm_internal.c 6 May 2009 16:07:11 -0000 @@ -1257,7 +1257,10 @@ 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 @@ 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 @@ 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 @@ } } - 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 @@ 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; Index: src/xend_internal.c =================================================================== RCS file: /data/cvs/libxen/src/xend_internal.c,v retrieving revision 1.260 diff -u -r1.260 xend_internal.c --- src/xend_internal.c 24 Apr 2009 12:17:50 -0000 1.260 +++ src/xend_internal.c 6 May 2009 16:07:11 -0000 @@ -2023,7 +2023,11 @@ !(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 @@ !(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 @@ 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 @@ 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 @@ /* 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 @@ * 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; }