<html><body>
<p>+1<br>
<br>
Thanks<br>
Sharad Mishra<br>
Open Virtualization<br>
Linux Technology Center<br>
IBM<br>
<br>
<tt>libvirt-cim-bounces@redhat.com wrote on 04/07/2011 02:57:28 PM:<br>
<br>
> Chip Vincent <cvincent@linux.vnet.ibm.com> </tt><br>
<tt>> Sent by: libvirt-cim-bounces@redhat.com<br>
> </tt><br>
<tt>> 04/07/2011 02:57 PM</tt><br>
<tt>> <br>
> Please respond to<br>
> List for discussion and development of libvirt CIM <libvirt-cim@redhat.com></tt><br>
<tt>> <br>
> To</tt><br>
<tt>> <br>
> libvirt-cim@redhat.com</tt><br>
<tt>> <br>
> cc</tt><br>
<tt>> <br>
> Subject</tt><br>
<tt>> <br>
> [Libvirt-cim] [PATCH] (#2) Add support for console/serial grahpics devices</tt><br>
<tt>> <br>
> # HG changeset patch<br>
> # User Chip Vincent <cvincent@us.ibm.com><br>
> # Date 1301520765 14400<br>
> # Node ID 5f1131a99b0846f0e960b4a0f643056b7559fcab<br>
> # Parent a521a11eeec4b41399ca954ab17b874a708eb4b3<br>
> (#2) Add support for console/serial grahpics devices<br>
> <br>
> Add support for Graphics RASD ResourceSubType = console | serial. <br>
> This includes<br>
> support for allowing more than a single graphics RASD instance. Instances can<br>
> be created externally or during DefineSystem. No changes to current level of<br>
> hotswapping.<br>
> <br>
> Signed-off-by: Chip Vincent <cvincent@us.ibm.com><br>
> <br>
> diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c<br>
> --- a/libxkutil/device_parsing.c<br>
> +++ b/libxkutil/device_parsing.c<br>
> @@ -40,7 +40,8 @@<br>
> #define NET_XPATH (xmlChar *)"/domain/devices/interface"<br>
> #define EMU_XPATH (xmlChar *)"/domain/devices/emulator"<br>
> #define MEM_XPATH (xmlChar *)"/domain/memory | /domain/currentMemory"<br>
> -#define GRAPHICS_XPATH (xmlChar *)"/domain/devices/graphics"<br>
> +#define GRAPHICS_XPATH (xmlChar *)"/domain/devices/graphics | "\<br>
> + "/domain/devices/console | /domain/devices/serial"<br>
> #define INPUT_XPATH (xmlChar *)"/domain/devices/input"<br>
> <br>
> #define DEFAULT_BRIDGE "xenbr0"<br>
> @@ -501,6 +502,7 @@<br>
> {<br>
> struct virt_device *vdev = NULL;<br>
> struct graphics_device *gdev = NULL;<br>
> + xmlNode *child = NULL;<br>
> <br>
> vdev = calloc(1, sizeof(*vdev));<br>
> if (vdev == NULL)<br>
> @@ -509,24 +511,51 @@<br>
> gdev = &(vdev->dev.graphics);<br>
> <br>
> gdev->type = get_attr_value(node, "type");<br>
> - gdev->port = get_attr_value(node, "port");<br>
> - gdev->host = get_attr_value(node, "listen");<br>
> - gdev->keymap = get_attr_value(node, "keymap");<br>
> -<br>
> if (gdev->type == NULL)<br>
> goto err;<br>
> <br>
> + CU_DEBUG("graphics device type = %s", gdev->type);<br>
> +<br>
> if (STREQC(gdev->type, "vnc")) {<br>
> - if (gdev->port == NULL)<br>
> + gdev->port = get_attr_value(node, "port");<br>
> + gdev->host = get_attr_value(node, "listen");<br>
> + gdev->keymap = get_attr_value(node, "keymap");<br>
> + <br>
> + if (gdev->port == NULL || gdev->host == NULL)<br>
> + goto err;<br>
> + }<br>
> + else if (STREQC(gdev->type, "pty")) {<br>
> + if (node->name == NULL)<br>
> goto err;<br>
> <br>
> - if (gdev->host == NULL)<br>
> - goto err;<br>
> + /* Change type to serial, console, etc. It will be converted <br>
> + * back in xmlgen.c */<br>
> + free(gdev->type);<br>
> + gdev->type = strdup((char *)node->name);<br>
> +<br>
> + for (child = node->children; child != NULL; <br>
> + child = child->next) {<br>
> + if (XSTREQ(child->name, "source")) <br>
> + gdev->host = get_attr_value(child, "path");<br>
> + else if (XSTREQ(child->name, "target"))<br>
> + gdev->port = get_attr_value(child, "port");<br>
> + }<br>
> + }<br>
> + else {<br>
> + CU_DEBUG("Unknown graphics type %s", gdev->type);<br>
> + goto err;<br>
> }<br>
> <br>
> vdev->type = CIM_RES_TYPE_GRAPHICS;<br>
> vdev->id = strdup("graphics");<br>
> <br>
> + /* FIXME: IDs should be unique, but that breaks existing tests.<br>
> + ret = asprintf(&vdev->id, "graphics:%s", gdev->type);<br>
> + if(ret == -1) {<br>
> + CU_DEBUG("Failed to create graphics is string");<br>
> + goto err;<br>
> + } */<br>
> +<br>
> *vdevs = vdev;<br>
> <br>
> return 1;<br>
> diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c<br>
> --- a/libxkutil/xmlgen.c<br>
> +++ b/libxkutil/xmlgen.c<br>
> @@ -401,43 +401,93 @@<br>
> return NULL;<br>
> }<br>
> <br>
> +static const char *graphics_vnc_xml(xmlNodePtr root, <br>
> + struct graphics_device *dev)<br>
> +{<br>
> + xmlNodePtr tmp = NULL;<br>
> + <br>
> + tmp = xmlNewChild(root, NULL, BAD_CAST "graphics", NULL);<br>
> + if (tmp == NULL)<br>
> + return XML_ERROR;<br>
> +<br>
> + xmlNewProp(tmp, BAD_CAST "type", BAD_CAST dev->type);<br>
> +<br>
> + if (STREQC(dev->type, "sdl"))<br>
> + return NULL;<br>
> +<br>
> + if (dev->port) {<br>
> + xmlNewProp(tmp, BAD_CAST "port", BAD_CAST dev->port);<br>
> + if (STREQC(dev->port, "-1"))<br>
> + xmlNewProp(tmp, BAD_CAST "autoport", BAD_CAST "yes");<br>
> + else<br>
> + xmlNewProp(tmp, BAD_CAST "autoport", BAD_CAST "no");<br>
> + }<br>
> +<br>
> + if (dev->host) <br>
> + xmlNewProp(tmp, BAD_CAST "listen", BAD_CAST dev->host);<br>
> +<br>
> + if (dev->passwd)<br>
> + xmlNewProp(tmp, BAD_CAST "passwd", BAD_CAST dev->passwd);<br>
> +<br>
> + if (dev->keymap)<br>
> + xmlNewProp(tmp, BAD_CAST "keymap", BAD_CAST dev->keymap);<br>
> +<br>
> + return NULL;<br>
> +}<br>
> +<br>
> +static const char *graphics_pty_xml(xmlNodePtr root, <br>
> + struct graphics_device *dev)<br>
> +{<br>
> + xmlNodePtr pty = NULL;<br>
> + xmlNodePtr tmp = NULL;<br>
> + <br>
> + pty = xmlNewChild(root, NULL, BAD_CAST dev->type, NULL);<br>
> + if (pty == NULL)<br>
> + return XML_ERROR;<br>
> +<br>
> + xmlNewProp(pty, BAD_CAST "type", BAD_CAST "pty");<br>
> + <br>
> + tmp = xmlNewChild(pty, NULL, BAD_CAST "source", NULL);<br>
> + if (tmp == NULL)<br>
> + return XML_ERROR;<br>
> + <br>
> + if(dev->host)<br>
> + xmlNewProp(tmp, BAD_CAST "path", BAD_CAST dev->host);<br>
> + <br>
> + tmp = xmlNewChild(pty, NULL, BAD_CAST "target", NULL);<br>
> + if (tmp == NULL)<br>
> + return XML_ERROR;<br>
> + <br>
> + if(dev->port)<br>
> + xmlNewProp(tmp, BAD_CAST "port", BAD_CAST dev->port);<br>
> +<br>
> + return NULL;<br>
> +}<br>
> +<br>
> static const char *graphics_xml(xmlNodePtr root, struct domain *dominfo)<br>
> {<br>
> + const char *msg = NULL;<br>
> int i;<br>
> <br>
> for (i = 0; i < dominfo->dev_graphics_ct; i++) {<br>
> - xmlNodePtr tmp;<br>
> struct virt_device *_dev = &dominfo->dev_graphics[i];<br>
> if (_dev->type == CIM_RES_TYPE_UNKNOWN)<br>
> continue;<br>
> <br>
> struct graphics_device *dev = &_dev->dev.graphics;<br>
> <br>
> - tmp = xmlNewChild(root, NULL, BAD_CAST "graphics", NULL);<br>
> - if (tmp == NULL)<br>
> - return XML_ERROR;<br>
> -<br>
> - xmlNewProp(tmp, BAD_CAST "type", BAD_CAST dev->type);<br>
> -<br>
> - if (STREQC(dev->type, "sdl"))<br>
> - goto out;<br>
> -<br>
> - if (STREQC(dev->port, "-1"))<br>
> - xmlNewProp(tmp, BAD_CAST "autoport", BAD_CAST "yes");<br>
> - else {<br>
> - xmlNewProp(tmp, BAD_CAST "autoport", BAD_CAST "no");<br>
> - xmlNewProp(tmp, BAD_CAST "port", BAD_CAST dev->port);<br>
> - }<br>
> - xmlNewProp(tmp, BAD_CAST "listen", BAD_CAST dev->host);<br>
> - xmlNewProp(tmp, BAD_CAST "keymap", BAD_CAST dev->keymap);<br>
> -<br>
> - if (dev->passwd != NULL)<br>
> - xmlNewProp(tmp, <br>
> - BAD_CAST "passwd", <br>
> - BAD_CAST dev->passwd);<br>
> + if (STREQC(dev->type, "vnc") || STREQC(dev->type, "sdl"))<br>
> + msg = graphics_vnc_xml(root, dev);<br>
> + else if (STREQC(dev->type, "console") || <br>
> + STREQC(dev->type, "serial")) <br>
> + msg = graphics_pty_xml(root, dev);<br>
> + else<br>
> + continue;<br>
> + <br>
> + if(msg != NULL)<br>
> + return msg;<br>
> }<br>
> <br>
> - out:<br>
> return NULL;<br>
> }<br>
> <br>
> diff --git a/schema/ResourceAllocationSettingData.mof b/schema/<br>
> ResourceAllocationSettingData.mof<br>
> --- a/schema/ResourceAllocationSettingData.mof<br>
> +++ b/schema/ResourceAllocationSettingData.mof<br>
> @@ -216,8 +216,10 @@<br>
> ]<br>
> class Xen_GraphicsResourceAllocationSettingData : <br>
> Xen_ResourceAllocationSettingData<br>
> {<br>
> - [Description ("VNC Address. IPv4 in a.b.c.d:port or"<br>
> - "IPv6 in [ip]:port format")]<br>
> + [Description ("If ResourceSubType is 'vnc', this is a VNC Address. "<br>
> + "IPv4 in a.b.c.d:port or IPv6 in [ip]:port format. If <br>
> ResourceSubType "<br>
> + "is 'console', this is a character device path in "<br>
> + "path:port format (e.g., '/dev/pts/3:0'\)")]<br>
> string Address;<br>
> <br>
> [Description ("Keyboard keymapping")]<br>
> @@ -235,8 +237,10 @@<br>
> ]<br>
> class KVM_GraphicsResourceAllocationSettingData : <br>
> KVM_ResourceAllocationSettingData<br>
> {<br>
> - [Description ("VNC Address. IPv4 in a.b.c.d:port or"<br>
> - "IPv6 in [ip]:port format")]<br>
> + [Description ("If ResourceSubType is 'vnc', this is a VNC Address. "<br>
> + "IPv4 in a.b.c.d:port or IPv6 in [ip]:port format. If <br>
> ResourceSubType "<br>
> + "is 'console', this is a character device path in "<br>
> + "path:port format (e.g., '/dev/pts/3:0'\)")]<br>
> string Address;<br>
> <br>
> [Description ("Keyboard keymapping")]<br>
> @@ -254,8 +258,10 @@<br>
> ]<br>
> class LXC_GraphicsResourceAllocationSettingData : <br>
> LXC_ResourceAllocationSettingData<br>
> {<br>
> - [Description ("VNC Address. IPv4 in a.b.c.d:port or"<br>
> - "IPv6 in [ip]:port format")]<br>
> + [Description ("If ResourceSubType is 'vnc', this is a VNC Address. "<br>
> + "IPv4 in a.b.c.d:port or IPv6 in [ip]:port format. If <br>
> ResourceSubType "<br>
> + "is 'console', this is a character device path in "<br>
> + "path:port format (e.g., '/dev/pts/3:0'\)")]<br>
> string Address;<br>
> <br>
> [Description ("Keyboard keymapping")]<br>
> diff --git a/src/Virt_Device.c b/src/Virt_Device.c<br>
> --- a/src/Virt_Device.c<br>
> +++ b/src/Virt_Device.c<br>
> @@ -189,14 +189,13 @@<br>
> int rc;<br>
> char *vp_str = NULL;<br>
> <br>
> - if (STREQC(dev->type, "vnc"))<br>
> + if (STREQC(dev->type, "sdl"))<br>
> + rc = asprintf(&vp_str, "%s", dev->type);<br>
> + else <br>
> rc = asprintf(&vp_str, "%s/%s:%s", <br>
> dev->type, <br>
> dev->host, <br>
> dev->port);<br>
> - else<br>
> - rc = asprintf(&vp_str, "%s", dev->type); <br>
> -<br>
> if (rc == -1)<br>
> return 0;<br>
> <br>
> diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c<br>
> --- a/src/Virt_RASD.c<br>
> +++ b/src/Virt_RASD.c<br>
> @@ -421,44 +421,56 @@<br>
> CMSetProperty(inst, "ResourceSubType", <br>
> (CMPIValue *)dev->dev.graphics.type, CMPI_chars);<br>
> <br>
> - if (STREQC(dev->dev.graphics.type, "vnc")) {<br>
> + if (STREQC(dev->dev.graphics.type, "sdl"))<br>
> + rc = asprintf(&addr_str, "%s", dev->dev.graphics.type);<br>
> + else {<br>
> rc = asprintf(&addr_str, <br>
> "%s:%s", <br>
> dev->dev.graphics.host, <br>
> dev->dev.graphics.port);<br>
> - if (rc == -1)<br>
> + }<br>
> + <br>
> + CU_DEBUG("graphics Address = %s", addr_str);<br>
> + <br>
> + if (rc == -1)<br>
> + goto out;<br>
> +<br>
> + CMSetProperty(inst, "Address", <br>
> + (CMPIValue *)addr_str, CMPI_chars);<br>
> +<br>
> + if (STREQC(dev->dev.graphics.type, "vnc")) {<br>
> + CMSetProperty(inst, "KeyMap",<br>
> + (CMPIValue *)dev->dev.graphics.keymap,<br>
> CMPI_chars); <br>
> + <br>
> + conn = connect_by_classname(_BROKER, classname, &s);<br>
> + if (conn == NULL)<br>
> goto out;<br>
> <br>
> - CMSetProperty(inst, "Address", <br>
> - (CMPIValue *)addr_str, CMPI_chars);<br>
> + dom = virDomainLookupByName(conn, name);<br>
> + if (dom == NULL) {<br>
> + cu_statusf(_BROKER, &s,<br>
> + CMPI_RC_ERR_NOT_FOUND,<br>
> + "Domain %s not found",<br>
> + name);<br>
> + goto out;<br>
> + }<br>
> <br>
> - CMSetProperty(inst, "KeyMap",<br>
> - (CMPIValue *)dev->dev.graphics.keymap,<br>
> CMPI_chars);<br>
> + infostore = infostore_open(dom);<br>
> + if (infostore != NULL)<br>
> + has_passwd = infostore_get_bool(infostore, <br>
> + "has_vnc_passwd");<br>
> +<br>
> + if (has_passwd) {<br>
> + CU_DEBUG("has password");<br>
> + CMSetProperty(inst, "Password",<br>
> + (CMPIValue *)"********", CMPI_chars);<br>
> + }<br>
> +<br>
> + infostore_close(infostore);<br>
> +<br>
> + /* FIXME: Populate the IsIPv6Only */<br>
> }<br>
> <br>
> - conn = connect_by_classname(_BROKER, classname, &s);<br>
> - if (conn == NULL)<br>
> - goto out;<br>
> -<br>
> - dom = virDomainLookupByName(conn, name);<br>
> - if (dom == NULL) {<br>
> - cu_statusf(_BROKER, &s,<br>
> - CMPI_RC_ERR_NOT_FOUND,<br>
> - "Domain %s not found",<br>
> - name);<br>
> - goto out;<br>
> - }<br>
> -<br>
> - infostore = infostore_open(dom);<br>
> - if (infostore != NULL)<br>
> - has_passwd = infostore_get_bool(infostore, "has_vnc_passwd");<br>
> -<br>
> - if (has_passwd)<br>
> - CMSetProperty(inst, "Password",<br>
> - (CMPIValue *)"********", CMPI_chars);<br>
> -<br>
> - infostore_close(infostore);<br>
> -<br>
> out:<br>
> free(addr_str);<br>
> virDomainFree(dom);<br>
> diff --git a/src/Virt_SettingsDefineCapabilities.c b/src/<br>
> Virt_SettingsDefineCapabilities.c<br>
> --- a/src/Virt_SettingsDefineCapabilities.c<br>
> +++ b/src/Virt_SettingsDefineCapabilities.c<br>
> @@ -1694,10 +1694,9 @@<br>
> inst = sdc_rasd_inst(&s, ref, CIM_RES_TYPE_GRAPHICS, DEVICE_RASD);<br>
> <br>
> CMSetProperty(inst, "InstanceID", (CMPIValue *)id, CMPI_chars);<br>
> -<br>
> + CMSetProperty(inst, "Address", (CMPIValue *)addr, CMPI_chars);<br>
> + <br>
> if (STREQC(type, "vnc")) {<br>
> - CMSetProperty(inst, "Address", (CMPIValue *)addr, <br>
> CMPI_chars);<br>
> -<br>
> CMSetProperty(inst, "KeyMap", (CMPIValue *)"en-us",<br>
> CMPI_chars);<br>
> }<br>
> <br>
> diff --git a/src/Virt_VirtualSystemManagementService.c b/src/<br>
> Virt_VirtualSystemManagementService.c<br>
> --- a/src/Virt_VirtualSystemManagementService.c<br>
> +++ b/src/Virt_VirtualSystemManagementService.c<br>
> @@ -405,7 +405,7 @@<br>
> <br>
> static bool add_default_devs(struct domain *domain)<br>
> {<br>
> - if (domain->dev_graphics_ct != 1) {<br>
> + if (domain->dev_graphics_ct < 1) {<br>
> if (!default_graphics_device(domain)) <br>
> return false;<br>
> }<br>
> @@ -1027,6 +1027,38 @@<br>
> return NULL;<br>
> }<br>
> <br>
> +static int parse_console_address(const char *id,<br>
> + char **path,<br>
> + char **port)<br>
> +{<br>
> + int ret;<br>
> + char *tmp_path = NULL;<br>
> + char *tmp_port = NULL;<br>
> +<br>
> + CU_DEBUG("Entering parse_console_address, address is %s", id);<br>
> +<br>
> + ret = sscanf(id, "%a[^:]:%as", &tmp_path, &tmp_port);<br>
> +<br>
> + if (ret != 2) {<br>
> + ret = 0;<br>
> + goto out;<br>
> + }<br>
> +<br>
> + if (path)<br>
> + *path = strdup(tmp_path);<br>
> +<br>
> + if (port)<br>
> + *port = strdup(tmp_port);<br>
> +<br>
> + ret = 1;<br>
> +<br>
> + out: <br>
> + CU_DEBUG("Exiting parse_console_address, ip is %s, port is %s", <br>
> + *path, *port);<br>
> +<br>
> + return ret;<br>
> +}<br>
> +<br>
> static int parse_vnc_address(const char *id,<br>
> char **ip,<br>
> char **port)<br>
> @@ -1058,9 +1090,8 @@<br>
> ret = 1;<br>
> <br>
> out:<br>
> - CU_DEBUG("Exiting parse_vnc_address, ip is %s, port is %s",<br>
> *ip, *port);<br>
> - free(tmp_ip);<br>
> - free(tmp_port);<br>
> + CU_DEBUG("Exiting parse_vnc_address, ip is %s, port is %s", <br>
> + *ip, *port);<br>
> <br>
> return ret;<br>
> }<br>
> @@ -1068,9 +1099,8 @@<br>
> static const char *graphics_rasd_to_vdev(CMPIInstance *inst,<br>
> struct virt_device *dev)<br>
> {<br>
> - const char *val;<br>
> + const char *val = NULL;<br>
> const char *msg = NULL;<br>
> - const char *keymap;<br>
> bool ipv6 = false;<br>
> int ret;<br>
> <br>
> @@ -1080,36 +1110,69 @@<br>
> }<br>
> dev->dev.graphics.type = strdup(val);<br>
> <br>
> + CU_DEBUG("graphics type = %s", dev->dev.graphics.type);<br>
> +<br>
> /* FIXME: Add logic to prevent address:port collisions */<br>
> - if (cu_get_str_prop(inst, "Address", &val) != CMPI_RC_OK) {<br>
> - CU_DEBUG("no graphics port defined, giving default");<br>
> - if (cu_get_bool_prop(inst, "IsIPv6Only", &ipv6) != <br>
> CMPI_RC_OK)<br>
> - ipv6 = false;<br>
> - if (ipv6)<br>
> - dev->dev.graphics.host = strdup("[::1]");<br>
> - else<br>
> - dev->dev.graphics.host = strdup("127.0.0.1");<br>
> - dev->dev.graphics.port = strdup("-1");<br>
> - } else {<br>
> - ret = parse_vnc_address(val,<br>
> - &dev->dev.graphics.host, <br>
> - &dev->dev.graphics.port); <br>
> + if (STREQC(dev->dev.graphics.type, "vnc")) {<br>
> + if (cu_get_str_prop(inst, "Address", &val) != CMPI_RC_OK) {<br>
> + CU_DEBUG("graphics Address empty, using default");<br>
> +<br>
> + if (cu_get_bool_prop(inst, "IsIPV6Only", &ipv6) != <br>
> + CMPI_RC_OK)<br>
> + ipv6 = false;<br>
> +<br>
> + if(ipv6)<br>
> + val = "[::1]:-1";<br>
> + else<br>
> + val = "127.0.0.1:-1";<br>
> + }<br>
> +<br>
> + ret = parse_vnc_address(val,<br>
> + &dev->dev.graphics.host, <br>
> + &dev->dev.graphics.port); <br>
> if (ret != 1) {<br>
> msg = "GraphicsRASD field Address not valid";<br>
> goto out;<br>
> }<br>
> + <br>
> + if (cu_get_str_prop(inst, "KeyMap", &val) != CMPI_RC_OK)<br>
> + dev->dev.graphics.keymap = strdup("en-us");<br>
> + else<br>
> + dev->dev.graphics.keymap = strdup(val);<br>
> + <br>
> + if (cu_get_str_prop(inst, "Password", &val) != CMPI_RC_OK) {<br>
> + CU_DEBUG("vnc password is not set");<br>
> + dev->dev.graphics.passwd = NULL;<br>
> + } else {<br>
> + CU_DEBUG("vnc password is set");<br>
> + dev->dev.graphics.passwd = strdup(val);<br>
> + }<br>
> }<br>
> -<br>
> - if (cu_get_str_prop(inst, "KeyMap", &keymap) != CMPI_RC_OK)<br>
> - keymap = "en-us";<br>
> - <br>
> - dev->dev.graphics.keymap = strdup(keymap);<br>
> -<br>
> - if (cu_get_str_prop(inst, "Password", &val) != CMPI_RC_OK) {<br>
> - dev->dev.graphics.passwd = NULL;<br>
> - } else {<br>
> - dev->dev.graphics.passwd = strdup(val);<br>
> - }<br>
> + else if (STREQC(dev->dev.graphics.type, "console") ||<br>
> + STREQC(dev->dev.graphics.type, "serial")) {<br>
> + if (cu_get_str_prop(inst, "Address", &val) != CMPI_RC_OK) {<br>
> + CU_DEBUG("graphics Address empty, using default");<br>
> + val = "/dev/pts/0:0";<br>
> + }<br>
> +<br>
> + ret = parse_console_address(val,<br>
> + &dev->dev.graphics.host, <br>
> + &dev->dev.graphics.port); <br>
> + if (ret != 1) {<br>
> + msg = "GraphicsRASD field Address not valid";<br>
> + goto out;<br>
> + }<br>
> + } else { <br>
> + CU_DEBUG("Unsupported graphics type %s", <br>
> + dev->dev.graphics.type);<br>
> + msg = "Unsupported graphics type";<br>
> + goto out;<br>
> + }<br>
> +<br>
> + CU_DEBUG("graphics = %s:%s:%s", <br>
> + dev->dev.graphics.type,<br>
> + dev->dev.graphics.host,<br>
> + dev->dev.graphics.port);<br>
> <br>
> out:<br>
> return msg;<br>
> @@ -1250,6 +1313,9 @@<br>
> "DiskResourceAllocationSettingData <br>
> in a single "<br>
> "guest";<br>
> <br>
> + if (dev->type == CIM_RES_TYPE_GRAPHICS)<br>
> + continue;<br>
> +<br>
> if (STREQC(ptr->id, dev->id)) {<br>
> CU_DEBUG("Overriding device %s from <br>
> refconf", ptr->id);<br>
> cleanup_virt_device(ptr);<br>
> @@ -1358,11 +1424,19 @@<br>
> ncount,<br>
> &domain->dev_net_ct);<br>
> } else if (type == CIM_RES_TYPE_GRAPHICS) {<br>
> - domain->dev_graphics_ct = 1;<br>
> + struct virt_device dev;<br>
> + int ncount = count + domain->dev_graphics_ct;<br>
> +<br>
> + memset(&dev, 0, sizeof(dev));<br>
> msg = rasd_to_vdev(inst,<br>
> domain,<br>
> - &domain->dev_graphics[0],<br>
> + &dev,<br>
> ns);<br>
> + if (msg == NULL)<br>
> + msg = add_device_nodup(&dev,<br>
> + domain->dev_graphics,<br>
> + ncount,<br>
> + &domain->dev_graphics_ct);<br>
> } else if (type == CIM_RES_TYPE_INPUT) {<br>
> domain->dev_input_ct = 1;<br>
> msg = rasd_to_vdev(inst,<br>
> @@ -2318,13 +2392,6 @@<br>
> goto out;<br>
> }<br>
> <br>
> - if ((type == CIM_RES_TYPE_GRAPHICS) && (*count > 0)) {<br>
> - cu_statusf(_BROKER, &s,<br>
> - CMPI_RC_ERR_FAILED,<br>
> - "A resource already exists for type %" <br>
> PRIu16, type);<br>
> - goto out;<br>
> - }<br>
> -<br>
> list = realloc(*_list, ((*count)+1)*sizeof(struct virt_device));<br>
> if (list == NULL) {<br>
> /* No memory */<br>
> <br>
> _______________________________________________<br>
> Libvirt-cim mailing list</tt><br>
<tt>> Libvirt-cim@redhat.com<br>
> <a href="https://www.redhat.com/mailman/listinfo/libvirt-cim">https://www.redhat.com/mailman/listinfo/libvirt-cim</a><br>
</tt></body></html>