]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: RDP graphics parse refactor
authorKirill Shchetiniuk <kshcheti@redhat.com>
Wed, 4 Jun 2025 12:24:14 +0000 (14:24 +0200)
committerJán Tomko <jtomko@redhat.com>
Wed, 4 Jun 2025 14:59:07 +0000 (16:59 +0200)
Previously, the RDP graphics definition parsing were implemented by
string parsing, the virDomainGraphicsDefParseXMLRDP function is
refactored to use the appropriate virXMLProp* utility functions.
Overall parsing logic was not changed and results the same output as
before.

Moreover, 'replaceUser' and 'mutliUser' params type was changed from
bool to tristate type, to avoid unnecessary type convertions.

Signed-off-by: Kirill Shchetiniuk <kshcheti@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_validate.c
src/vbox/vbox_common.c

index 32a358d72c569b74dd9a91c0497ff39c818824aa..201a4ded8bc8f2687875a413c9bad26da63b6a6f 100644 (file)
@@ -11917,40 +11917,41 @@ virDomainGraphicsDefParseXMLRDP(virDomainGraphicsDef *def,
                                 xmlXPathContextPtr ctxt,
                                 unsigned int flags)
 {
-    g_autofree char *port = virXMLPropString(node, "port");
-    g_autofree char *autoport = virXMLPropString(node, "autoport");
-    g_autofree char *replaceUser = virXMLPropString(node, "replaceUser");
-    g_autofree char *multiUser = virXMLPropString(node, "multiUser");
+    virTristateBool autoport;
 
     if (virDomainGraphicsListensParseXML(def, node, ctxt, flags) < 0)
         return -1;
 
-    if (port) {
-        if (virStrToLong_i(port, NULL, 10, &def->data.rdp.port) < 0) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("cannot parse rdp port %1$s"), port);
-            return -1;
-        }
-        /* Legacy compat syntax, used -1 for auto-port */
-        if (def->data.rdp.port == -1)
-            def->data.rdp.autoport = true;
+    if (virXMLPropInt(node, "port", 10, VIR_XML_PROP_NONE,
+                      &def->data.rdp.port, 0) < 0)
+        return -1;
 
-    } else {
-        def->data.rdp.port = 0;
+    if (def->data.rdp.port == -1) {
+        /* Legacy compat syntax, used -1 for auto-port */
         def->data.rdp.autoport = true;
     }
 
-    if (STREQ_NULLABLE(autoport, "yes"))
+    if (def->data.rdp.port == 0) {
+        /* No port specified */
         def->data.rdp.autoport = true;
+    }
+
+    if (virXMLPropTristateBool(node, "autoport", VIR_XML_PROP_NONE,
+                               &autoport) < 0)
+        return -1;
+
+    virTristateBoolToBool(autoport, &def->data.rdp.autoport);
 
     if (def->data.rdp.autoport && (flags & VIR_DOMAIN_DEF_PARSE_INACTIVE))
         def->data.rdp.port = 0;
 
-    if (STREQ_NULLABLE(replaceUser, "yes"))
-        def->data.rdp.replaceUser = true;
+    if (virXMLPropTristateBool(node, "replaceUser", VIR_XML_PROP_NONE,
+                               &def->data.rdp.replaceUser))
+        return -1;
 
-    if (STREQ_NULLABLE(multiUser, "yes"))
-        def->data.rdp.multiUser = true;
+    if (virXMLPropTristateBool(node, "multiUser", VIR_XML_PROP_NONE,
+                               &def->data.rdp.replaceUser))
+        return -1;
 
     if (virDomainGraphicsAuthDefParseXML(node, &def->data.rdp.auth,
                                          def->type) < 0)
@@ -26977,11 +26978,13 @@ virDomainGraphicsDefFormatRDP(virBuffer *attrBuf,
     if (def->data.rdp.autoport)
         virBufferAddLit(attrBuf, " autoport='yes'");
 
-    if (def->data.rdp.replaceUser)
-        virBufferAddLit(attrBuf, " replaceUser='yes'");
+    if (def->data.rdp.replaceUser != VIR_TRISTATE_BOOL_ABSENT)
+        virBufferAsprintf(attrBuf, " replaceUser='%s'",
+                          virTristateBoolTypeToString(def->data.rdp.replaceUser));
 
-    if (def->data.rdp.multiUser)
-        virBufferAddLit(attrBuf, " multiUser='yes'");
+    if (def->data.rdp.multiUser != VIR_TRISTATE_BOOL_ABSENT)
+        virBufferAsprintf(attrBuf, " multiUser='%s'",
+                          virTristateBoolTypeToString(def->data.rdp.multiUser));
 
     virDomainGraphicsListenDefFormatAddr(attrBuf, glisten, flags);
 
index 8df404dc42498533d1f80ffe440ffa09c59b26f2..c909cfba3f12fec6f384b16e115455126ad2c6b7 100644 (file)
@@ -2043,8 +2043,8 @@ struct _virDomainGraphicsDef {
             int port;
             bool portReserved;
             bool autoport;
-            bool replaceUser;
-            bool multiUser;
+            virTristateBool replaceUser;
+            virTristateBool multiUser;
             virDomainGraphicsAuthDef auth;
         } rdp;
         struct {
index de391ce34df8c642cd93299912dbec78801cc4f0..2cc52ff3bc409c81f548b380b69596f61e19b2b1 100644 (file)
@@ -4533,12 +4533,12 @@ qemuValidateDomainDeviceDefRDPGraphics(const virDomainGraphicsDef *graphics,
         return -1;
     }
 
-    if (graphics->data.rdp.replaceUser) {
+    if (graphics->data.rdp.replaceUser == VIR_TRISTATE_BOOL_YES) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("RDP doesn't support 'replaceUser'"));
         return -1;
     }
-    if (graphics->data.rdp.multiUser) {
+    if (graphics->data.rdp.multiUser == VIR_TRISTATE_BOOL_YES) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("RDP doesn't support 'multiUser'"));
         return -1;
index 349ac832dc0a6b2bc2ba7291764d1dc7ed0d2015..929d452abdb4d0a378c39b50ce3e7ea83d60d9b0 100644 (file)
@@ -1703,13 +1703,13 @@ vboxAttachDisplay(virDomainDef *def, struct _vboxDriver *data, IMachine *machine
 
                 gVBoxAPI.UIVRDEServer.SetPorts(data, VRDEServer, def->graphics[i]);
 
-                if (def->graphics[i]->data.rdp.replaceUser) {
+                if (def->graphics[i]->data.rdp.replaceUser == VIR_TRISTATE_BOOL_YES) {
                     gVBoxAPI.UIVRDEServer.SetReuseSingleConnection(VRDEServer,
                                                                    PR_TRUE);
                     VIR_DEBUG("VRDP set to reuse single connection");
                 }
 
-                if (def->graphics[i]->data.rdp.multiUser) {
+                if (def->graphics[i]->data.rdp.multiUser == VIR_TRISTATE_BOOL_YES) {
                     gVBoxAPI.UIVRDEServer.SetAllowMultiConnection(VRDEServer,
                                                                   PR_TRUE);
                     VIR_DEBUG("VRDP set to allow multiple connection");
@@ -3611,11 +3611,11 @@ vboxDumpDisplay(virDomainDef *def, struct _vboxDriver *data, IMachine *machine)
 
         gVBoxAPI.UIVRDEServer.GetAllowMultiConnection(VRDEServer, &allowMultiConnection);
         if (allowMultiConnection)
-            graphics->data.rdp.multiUser = true;
+            graphics->data.rdp.multiUser = VIR_TRISTATE_BOOL_YES;
 
         gVBoxAPI.UIVRDEServer.GetReuseSingleConnection(VRDEServer, &reuseSingleConnection);
         if (reuseSingleConnection)
-            graphics->data.rdp.replaceUser = true;
+            graphics->data.rdp.replaceUser = VIR_TRISTATE_BOOL_YES;
 
         VIR_APPEND_ELEMENT(def->graphics, def->ngraphics, graphics);
     }