[libvirt] [PATCH 1/1] Support for rdp/desktop types in graphics tag

Daniel P. Berrange berrange at redhat.com
Tue May 5 09:46:44 UTC 2009


On Thu, Apr 30, 2009 at 04:15:27PM +0200, Pritesh Kothari wrote:
> Hi All,
> 
> As per the discussion earlier on the list I have modified the rdp type and 
> added a new desktop type and posting the patch for same.

ACK, this looks good to me.

Daniel

> diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
> index 2f784e1..5e4aa5b 100644
> --- a/docs/schemas/domain.rng
> +++ b/docs/schemas/domain.rng
> @@ -711,6 +711,63 @@
>              </attribute>
>            </optional>
>          </group>
> +        <group>
> +          <attribute name="type">
> +            <value>rdp</value>
> +          </attribute>
> +          <optional>
> +            <attribute name="port">
> +              <ref name="PortNumber"/>
> +            </attribute>
> +          </optional>
> +          <optional>
> +            <attribute name="autoport">
> +              <choice>
> +                <value>yes</value>
> +                <value>no</value>
> +              </choice>
> +            </attribute>
> +          </optional>
> +          <optional>
> +            <attribute name="replaceUser">
> +              <choice>
> +                <value>yes</value>
> +                <value>no</value>
> +              </choice>
> +            </attribute>
> +          </optional>
> +          <optional>
> +            <attribute name="multiUser">
> +              <choice>
> +                <value>yes</value>
> +                <value>no</value>
> +              </choice>
> +            </attribute>
> +          </optional>
> +          <optional>
> +            <attribute name="listen">
> +              <ref name="addrIP"/>
> +            </attribute>
> +          </optional>
> +        </group>
> +        <group>
> +          <attribute name="type">
> +            <value>desktop</value>
> +          </attribute>
> +          <optional>
> +            <attribute name="display">
> +              <text/>
> +            </attribute>
> +          </optional>
> +          <optional>
> +            <attribute name="fullscreen">
> +              <choice>
> +                <value>yes</value>
> +                <value>no</value>
> +              </choice>
> +            </attribute>
> +          </optional>
> +        </group>
>        </choice>
>      </element>
>    </define>
> diff --git a/src/domain_conf.c b/src/domain_conf.c
> index ed4b8e5..4030fa0 100644
> --- a/src/domain_conf.c
> +++ b/src/domain_conf.c
> @@ -150,7 +150,9 @@ VIR_ENUM_IMPL(virDomainInputBus, VIR_DOMAIN_INPUT_BUS_LAST,
>  
>  VIR_ENUM_IMPL(virDomainGraphics, VIR_DOMAIN_GRAPHICS_TYPE_LAST,
>                "sdl",
> -              "vnc")
> +              "vnc",
> +              "rdp",
> +              "desktop")
>  
>  VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST,
>                "subsystem",
> @@ -244,6 +246,14 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
>          VIR_FREE(def->data.sdl.display);
>          VIR_FREE(def->data.sdl.xauth);
>          break;
> +
> +    case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
> +        VIR_FREE(def->data.rdp.listenAddr);
> +        break;
> +
> +    case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
> +        VIR_FREE(def->data.desktop.display);
> +        break;
>      }
>  
>      VIR_FREE(def);
> @@ -1501,6 +1511,68 @@ virDomainGraphicsDefParseXML(virConnectPtr conn,
>              def->data.sdl.fullscreen = 0;
>          def->data.sdl.xauth = virXMLPropString(node, "xauth");
>          def->data.sdl.display = virXMLPropString(node, "display");
> +    } else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_RDP) {
> +        char *port = virXMLPropString(node, "port");
> +        char *autoport;
> +        char *replaceUser;
> +        char *multiUser;
> +
> +        if (port) {
> +            if (virStrToLong_i(port, NULL, 10, &def->data.rdp.port) < 0) {
> +                virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                                     _("cannot parse rdp port %s"), port);
> +                VIR_FREE(port);
> +                goto error;
> +            }
> +            VIR_FREE(port);
> +        } else {
> +            def->data.rdp.port = 0;
> +            def->data.rdp.autoport = 1;
> +        }
> +
> +        if ((autoport = virXMLPropString(node, "autoport")) != NULL) {
> +            if (STREQ(autoport, "yes")) {
> +                if (flags & VIR_DOMAIN_XML_INACTIVE)
> +                    def->data.rdp.port = 0;
> +                def->data.rdp.autoport = 1;
> +            }
> +            VIR_FREE(autoport);
> +        }
> +
> +        if ((replaceUser = virXMLPropString(node, "replaceUser")) != NULL) {
> +            if (STREQ(replaceUser, "yes")) {
> +                def->data.rdp.replaceUser = 1;
> +            }
> +            VIR_FREE(replaceUser);
> +        }
> +
> +        if ((multiUser = virXMLPropString(node, "multiUser")) != NULL) {
> +            if (STREQ(multiUser, "yes")) {
> +                def->data.rdp.multiUser = 1;
> +            }
> +            VIR_FREE(multiUser);
> +        }
> +
> +        def->data.rdp.listenAddr = virXMLPropString(node, "listen");
> +    } else if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP) {
> +        char *fullscreen = virXMLPropString(node, "fullscreen");
> +
> +        if (fullscreen != NULL) {
> +            if (STREQ(fullscreen, "yes")) {
> +                def->data.desktop.fullscreen = 1;
> +            } else if (STREQ(fullscreen, "no")) {
> +                def->data.desktop.fullscreen = 0;
> +            } else {
> +                virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                             _("unknown fullscreen value '%s'"), fullscreen);
> +                VIR_FREE(fullscreen);
> +                goto error;
> +            }
> +            VIR_FREE(fullscreen);
> +        } else
> +            def->data.desktop.fullscreen = 0;
> +
> +        def->data.desktop.display = virXMLPropString(node, "display");
>      }
>  
>  cleanup:
> @@ -3269,6 +3341,38 @@ virDomainGraphicsDefFormat(virConnectPtr conn,
>              virBufferAddLit(buf, " fullscreen='yes'");
>  
>          break;
> +
> +    case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
> +        if (def->data.rdp.port)
> +            virBufferVSprintf(buf, " port='%d'",
> +                              def->data.rdp.port);
> +        else if (def->data.rdp.autoport)
> +            virBufferAddLit(buf, " port='0'");
> +
> +        if (def->data.rdp.autoport)
> +            virBufferVSprintf(buf, " autoport='yes'");
> +
> +        if (def->data.rdp.replaceUser)
> +            virBufferVSprintf(buf, " replaceUser='yes'");
> +
> +        if (def->data.rdp.multiUser)
> +            virBufferVSprintf(buf, " multiUser='yes'");
> +
> +        if (def->data.rdp.listenAddr)
> +            virBufferVSprintf(buf, " listen='%s'", def->data.rdp.listenAddr);
> +
> +        break;
> +
> +    case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
> +        if (def->data.desktop.display)
> +            virBufferEscapeString(buf, " display='%s'",
> +                                  def->data.desktop.display);
> +
> +        if (def->data.desktop.fullscreen)
> +            virBufferAddLit(buf, " fullscreen='yes'");
> +
> +        break;
> +
>      }
>  
>      virBufferAddLit(buf, "/>\n");
> diff --git a/src/domain_conf.h b/src/domain_conf.h
> index 84fc477..1d12fea 100644
> --- a/src/domain_conf.h
> +++ b/src/domain_conf.h
> @@ -264,6 +264,8 @@ struct _virDomainSoundDef {
>  enum virDomainGraphicsType {
>      VIR_DOMAIN_GRAPHICS_TYPE_SDL,
>      VIR_DOMAIN_GRAPHICS_TYPE_VNC,
> +    VIR_DOMAIN_GRAPHICS_TYPE_RDP,
> +    VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP,
>  
>      VIR_DOMAIN_GRAPHICS_TYPE_LAST,
>  };
> @@ -285,6 +287,17 @@ struct _virDomainGraphicsDef {
>              char *xauth;
>              int fullscreen;
>          } sdl;
> +        struct {
> +            int port;
> +            char *listenAddr;
> +            int autoport : 1;
> +            int replaceUser : 1;
> +            int multiUser : 1;
> +        } rdp;
> +        struct {
> +            char *display;
> +            int fullscreen : 1;
> +        } desktop;
>      } data;
>  };
>  

> --
> Libvir-list mailing list
> Libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list


-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list