<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>