From 955f12037e5056002722d68f84c021e44284f06b Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 6 Mar 2007 20:00:17 +0000 Subject: [PATCH] Added support for keymap in VNC display --- AUTHORS | 3 +- ChangeLog | 8 ++++ src/xend_internal.c | 21 ++++++---- src/xm_internal.c | 42 ++++++++++++------- src/xml.c | 10 +++++ tests/sexpr2xmldata/sexpr2xml-fv-v2.sexpr | 2 +- tests/sexpr2xmldata/sexpr2xml-fv-v2.xml | 2 +- tests/sexpr2xmldata/sexpr2xml-fv.sexpr | 2 +- tests/sexpr2xmldata/sexpr2xml-fv.xml | 2 +- .../sexpr2xmldata/sexpr2xml-pv-vfb-new.sexpr | 2 +- tests/sexpr2xmldata/sexpr2xml-pv-vfb-new.xml | 2 +- .../sexpr2xmldata/sexpr2xml-pv-vfb-orig.sexpr | 2 +- tests/sexpr2xmldata/sexpr2xml-pv-vfb-orig.xml | 2 +- tests/xml2sexprdata/xml2sexpr-fv-v2.sexpr | 2 +- .../xml2sexpr-fv-vncunused.sexpr | 2 +- .../xml2sexprdata/xml2sexpr-fv-vncunused.xml | 2 +- tests/xml2sexprdata/xml2sexpr-fv.xml | 2 +- .../xml2sexprdata/xml2sexpr-pv-vfb-new.sexpr | 2 +- tests/xml2sexprdata/xml2sexpr-pv-vfb-new.xml | 2 +- .../xml2sexprdata/xml2sexpr-pv-vfb-orig.sexpr | 2 +- tests/xml2sexprdata/xml2sexpr-pv-vfb-orig.xml | 2 +- 21 files changed, 77 insertions(+), 39 deletions(-) diff --git a/AUTHORS b/AUTHORS index 39c55ca4b9..f4ddea83ae 100644 --- a/AUTHORS +++ b/AUTHORS @@ -5,7 +5,7 @@ The libvirt project was initiated by: Daniel Veillard or -The primary maintainers for various code sub-systems / drivers +The primary maintainers for various code sub-systems / drivers are: Daniel Veillard (xen & everything else) @@ -30,6 +30,7 @@ Patches have also been contributed by: Kazuki Mizushima Saori Fukuta Tatsuro Enokura + Takahashi Tomohiro [....send patches to get your name here....] diff --git a/ChangeLog b/ChangeLog index 334a43ce39..765f31918e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Tue Mar 06 14:21:12 EST 2007 Daniel P. Berrange + + * src/xend_internal.c, src/xml.c, src/xm_internal.c: Support + the 'keymap' attribute for VNC configuration. Based on patch + signed off by: Takahashi Tomohiro + * tests/sexpr2xmldata/, tests/xml2sexprdata/: Update to test + handling of keymap attribute + Tue Mar 06 11:47:12 EST 2007 Daniel P. Berrange * src/qemud.c: Unlink read-only socket upon startup (patch diff --git a/src/xend_internal.c b/src/xend_internal.c index f56d24fcad..bc8023d4ef 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -1587,11 +1587,13 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi } else if (tmp && !strcmp(tmp, "vnc")) { int port = xenStoreDomainGetVNCPort(conn, domid); const char *listenAddr = sexpr_node(node, "device/vfb/vnclisten"); - if (listenAddr) { - virBufferVSprintf(&buf, " \n", port, listenAddr); - } else { - virBufferVSprintf(&buf, " \n", port); - } + const char *keymap = sexpr_node(node, "device/vfb/keymap"); + virBufferVSprintf(&buf, " \n", 3); } } } @@ -1632,6 +1634,7 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi if (tmp[0] == '1') { int port = xenStoreDomainGetVNCPort(conn, domid); const char *listenAddr = sexpr_fmt_node(root, "domain/image/%s/vnclisten", hvm ? "hvm" : "linux"); + const char *keymap = sexpr_fmt_node(root, "domain/image/%s/keymap", hvm ? "hvm" : "linux"); /* For Xen >= 3.0.3, don't generate a fixed port mapping * because it will almost certainly be wrong ! Just leave * it as -1 which lets caller see that the VNC server isn't @@ -1640,10 +1643,12 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi */ if (port == -1 && xendConfigVersion < 2) port = 5900 + domid; + virBufferVSprintf(&buf, " \n", port, listenAddr); - else - virBufferVSprintf(&buf, " \n", port); + virBufferVSprintf(&buf, " listen='%s'", listenAddr); + if (keymap) + virBufferVSprintf(&buf, " keymap='%s'", keymap); + virBufferAdd(&buf, "/>\n", 3); } } diff --git a/src/xm_internal.c b/src/xm_internal.c index 066d86db07..5e76eb0cde 100644 --- a/src/xm_internal.c +++ b/src/xm_internal.c @@ -579,6 +579,7 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) { long vncunused = 1; const char *vnclisten = NULL; const char *vncpasswd = NULL; + const char *keymap = NULL; if (xenXMConfigGetString(conf, "name", &name) < 0) return (NULL); @@ -890,6 +891,8 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) { vnclisten = NULL; if (xenXMConfigGetString(conf, "vncpasswd", &vncpasswd) < 0) vncpasswd = NULL; + if (xenXMConfigGetString(conf, "keymap", &keymap) < 0) + keymap = NULL; } if (xenXMConfigGetInt(conf, "sdl", &val) == 0 && val) sdl = 1; @@ -924,6 +927,8 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) { vnclisten = key + 10; } else if (!strncmp(key, "vncpasswd=", 10)) { vncpasswd = key + 10; + } else if (!strncmp(key, "keymap=", 7)) { + keymap = key + 7; } else if (!strncmp(key, "vncdisplay=", 11)) { int port = strtol(key+11, NULL, 10); if (port == -1) @@ -942,21 +947,19 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) { } if (vnc) { - if (vncpasswd) { - if (vnclisten) - virBufferVSprintf(buf, " \n", - (vncunused ? -1 : 5900+vncdisplay), vnclisten, vncpasswd); - else - virBufferVSprintf(buf, " \n", - (vncunused ? -1 : 5900+vncdisplay), vncpasswd); - } else { - if (vnclisten) - virBufferVSprintf(buf, " \n", - (vncunused ? -1 : 5900+vncdisplay), vnclisten); - else - virBufferVSprintf(buf, " \n", - (vncunused ? -1 : 5900+vncdisplay)); + virBufferVSprintf(buf, + " \n", 3); } if (sdl) { virBufferAdd(buf, " \n", -1); @@ -1863,6 +1866,9 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) { if (xenXMConfigSetStringFromXPath(conn, conf, ctxt, "vncpasswd", "string(/domain/devices/graphics[@type='vnc']/@passwd)", 1, "cannot set the vncpasswd parameter") < 0) goto error; + if (xenXMConfigSetStringFromXPath(conn, conf, ctxt, "keymap", "string(/domain/devices/graphics[@type='vnc']/@keymap)", 1, + "cannot set the keymap parameter") < 0) + goto error; /* XXX vncdisplay */ /* @@ -1894,6 +1900,7 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) { xmlChar *vncport = xmlGetProp(obj->nodesetval->nodeTab[i], BAD_CAST "port"); xmlChar *vnclisten = xmlGetProp(obj->nodesetval->nodeTab[i], BAD_CAST "listen"); xmlChar *vncpasswd = xmlGetProp(obj->nodesetval->nodeTab[i], BAD_CAST "passwd"); + xmlChar *keymap = xmlGetProp(obj->nodesetval->nodeTab[i], BAD_CAST "keymap"); int vncunused = vncport ? (!strcmp((const char*)vncport, "-1") ? 1 : 0) : 1; if (vncunused) len += 12; @@ -1903,6 +1910,8 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) { len += 11 + strlen((const char*)vnclisten); if (vncpasswd) len += 11 + strlen((const char*)vncpasswd); + if (keymap) + len += 8 + strlen((const char*)keymap); if ((val = malloc(len)) != NULL) { strcpy(val, "type=vnc"); if (vncunused) { @@ -1923,6 +1932,11 @@ virConfPtr xenXMParseXMLToConfig(virConnectPtr conn, const char *xml) { strcat(val, (const char*)vncpasswd); xmlFree(vncpasswd); } + if (keymap) { + strcat(val, ",keymap="); + strcat(val, (const char*)keymap); + xmlFree(keymap); + } } } xmlFree(type); diff --git a/src/xml.c b/src/xml.c index 50c939286c..25e7566f6e 100644 --- a/src/xml.c +++ b/src/xml.c @@ -246,6 +246,7 @@ static int virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSE xmlChar *vncport = xmlGetProp(node, BAD_CAST "port"); xmlChar *vnclisten = xmlGetProp(node, BAD_CAST "listen"); xmlChar *vncpasswd = xmlGetProp(node, BAD_CAST "passwd"); + xmlChar *keymap = xmlGetProp(node, BAD_CAST "keymap"); if (vncport != NULL) { long port = strtol((const char *)vncport, NULL, 10); if (port == -1) @@ -262,6 +263,10 @@ static int virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSE virBufferVSprintf(buf, "(vncpasswd %s)", vncpasswd); xmlFree(vncpasswd); } + if (keymap != NULL) { + virBufferVSprintf(buf, "(keymap %s)", keymap); + xmlFree(keymap); + } } } xmlFree(graphics_type); @@ -305,6 +310,7 @@ static int virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED, xmlChar *vncport = xmlGetProp(node, BAD_CAST "port"); xmlChar *vnclisten = xmlGetProp(node, BAD_CAST "listen"); xmlChar *vncpasswd = xmlGetProp(node, BAD_CAST "passwd"); + xmlChar *keymap = xmlGetProp(node, BAD_CAST "keymap"); if (vncport != NULL) { long port = strtol((const char *)vncport, NULL, 10); if (port == -1) @@ -321,6 +327,10 @@ static int virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED, virBufferVSprintf(buf, "(vncpasswd %s)", vncpasswd); xmlFree(vncpasswd); } + if (keymap != NULL) { + virBufferVSprintf(buf, "(keymap %s)", keymap); + xmlFree(keymap); + } } virBufferAdd(buf, "))", 2); xmlFree(graphics_type); diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-v2.sexpr b/tests/sexpr2xmldata/sexpr2xml-fv-v2.sexpr index 3a69b3aabc..019fe47a2e 100644 --- a/tests/sexpr2xmldata/sexpr2xml-fv-v2.sexpr +++ b/tests/sexpr2xmldata/sexpr2xml-fv-v2.sexpr @@ -1 +1 @@ -(domain (domid 3)(name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)(uuid 'b5d70dd275cdaca517769660b059d8bc')(on_poweroff 'destroy')(on_reboot 'restart')(on_crash 'restart')(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(device_model '/usr/lib64/xen/bin/qemu-dm')(boot c)(acpi 1)(vnc 1)))(device (vbd (dev 'hdc:cdrom')(uname 'file:/root/boot.iso')(mode 'r')))(device (vbd (dev 'hda:disk')(uname 'file:/root/foo.img')(mode 'w')))(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')(type ioemu)))) +(domain (domid 3)(name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)(uuid 'b5d70dd275cdaca517769660b059d8bc')(on_poweroff 'destroy')(on_reboot 'restart')(on_crash 'restart')(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(device_model '/usr/lib64/xen/bin/qemu-dm')(boot c)(acpi 1)(vnc 1)(keymap ja)))(device (vbd (dev 'hdc:cdrom')(uname 'file:/root/boot.iso')(mode 'r')))(device (vbd (dev 'hda:disk')(uname 'file:/root/foo.img')(mode 'w')))(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')(type ioemu)))) diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-v2.xml b/tests/sexpr2xmldata/sexpr2xml-fv-v2.xml index b635b72476..45476989d6 100644 --- a/tests/sexpr2xmldata/sexpr2xml-fv-v2.xml +++ b/tests/sexpr2xmldata/sexpr2xml-fv-v2.xml @@ -32,6 +32,6 @@