[PATCH v3 08/14] domain_conf: move all ChrSource checks to domain_validate.c

Daniel Henrique Barboza danielhb413 at gmail.com
Tue Dec 8 22:20:24 UTC 2020


Next patch will move a validation to virDomainSmartcardDefValidate(),
but this function can't be moved alone to domain_validate.c without
making virDomainChrSourceDefValidate(), from domain_conf.c, public.

Given that the idea is to eventually move all validations to domain_validate.c
anyways, let's move all ChrSource related validations in a single punch.

Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
---
 src/conf/domain_conf.c     | 161 -------------------------------------
 src/conf/domain_validate.c | 161 +++++++++++++++++++++++++++++++++++++
 src/conf/domain_validate.h |   8 ++
 3 files changed, 169 insertions(+), 161 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6578055119..a301ab5c74 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6058,137 +6058,6 @@ virDomainDefHasUSB(const virDomainDef *def)
 }
 
 
-#define SERIAL_CHANNEL_NAME_CHARS \
-    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-."
-
-
-static int
-virDomainChrSourceDefValidate(const virDomainChrSourceDef *src_def,
-                              const virDomainChrDef *chr_def,
-                              const virDomainDef *def)
-{
-    switch ((virDomainChrType) src_def->type) {
-    case VIR_DOMAIN_CHR_TYPE_NULL:
-    case VIR_DOMAIN_CHR_TYPE_PTY:
-    case VIR_DOMAIN_CHR_TYPE_VC:
-    case VIR_DOMAIN_CHR_TYPE_STDIO:
-    case VIR_DOMAIN_CHR_TYPE_SPICEVMC:
-    case VIR_DOMAIN_CHR_TYPE_LAST:
-        break;
-
-    case VIR_DOMAIN_CHR_TYPE_FILE:
-    case VIR_DOMAIN_CHR_TYPE_DEV:
-    case VIR_DOMAIN_CHR_TYPE_PIPE:
-        if (!src_def->data.file.path) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Missing source path attribute for char device"));
-            return -1;
-        }
-        break;
-
-    case VIR_DOMAIN_CHR_TYPE_NMDM:
-        if (!src_def->data.nmdm.master) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Missing master path attribute for nmdm device"));
-            return -1;
-        }
-
-        if (!src_def->data.nmdm.slave) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Missing slave path attribute for nmdm device"));
-            return -1;
-        }
-        break;
-
-    case VIR_DOMAIN_CHR_TYPE_TCP:
-        if (!src_def->data.tcp.host) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Missing source host attribute for char device"));
-            return -1;
-        }
-
-        if (!src_def->data.tcp.service) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Missing source service attribute for char device"));
-            return -1;
-        }
-
-        if (src_def->data.tcp.listen && src_def->data.tcp.reconnect.enabled) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("chardev reconnect is possible only for connect mode"));
-            return -1;
-        }
-        break;
-
-    case VIR_DOMAIN_CHR_TYPE_UDP:
-        if (!src_def->data.udp.connectService) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Missing source service attribute for char device"));
-            return -1;
-        }
-        break;
-
-    case VIR_DOMAIN_CHR_TYPE_UNIX:
-        /* The source path can be auto generated for certain specific
-         * types of channels, but in most cases we should report an
-         * error if the user didn't provide it */
-        if (!src_def->data.nix.path &&
-            !(chr_def &&
-              chr_def->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
-              (chr_def->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN ||
-               chr_def->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO))) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Missing source path attribute for char device"));
-            return -1;
-        }
-
-        if (src_def->data.nix.listen && src_def->data.nix.reconnect.enabled) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("chardev reconnect is possible only for connect mode"));
-            return -1;
-        }
-        break;
-
-    case VIR_DOMAIN_CHR_TYPE_SPICEPORT:
-        if (!src_def->data.spiceport.channel) {
-            virReportError(VIR_ERR_XML_ERROR, "%s",
-                           _("Missing source channel attribute for char device"));
-            return -1;
-        }
-        if (strspn(src_def->data.spiceport.channel,
-                   SERIAL_CHANNEL_NAME_CHARS) < strlen(src_def->data.spiceport.channel)) {
-            virReportError(VIR_ERR_INVALID_ARG, "%s",
-                           _("Invalid character in source channel for char device"));
-            return -1;
-        }
-        break;
-    }
-
-    if (virSecurityDeviceLabelDefValidate(src_def->seclabels,
-                                          src_def->nseclabels,
-                                          def->seclabels,
-                                          def->nseclabels) < 0)
-        return -1;
-
-    return 0;
-}
-
-
-static int
-virDomainRedirdevDefValidate(const virDomainDef *def,
-                             const virDomainRedirdevDef *redirdev)
-{
-    if (redirdev->bus == VIR_DOMAIN_REDIRDEV_BUS_USB &&
-        !virDomainDefHasUSB(def)) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("cannot add redirected USB device: "
-                         "USB is disabled for this domain"));
-        return -1;
-    }
-
-    return virDomainChrSourceDefValidate(redirdev->source, NULL, def);
-}
-
 
 static int
 virDomainNetDefValidatePortOptions(const char *macstr,
@@ -6379,36 +6248,6 @@ virDomainControllerDefValidate(const virDomainControllerDef *controller)
 }
 
 
-static int
-virDomainChrDefValidate(const virDomainChrDef *chr,
-                        const virDomainDef *def)
-{
-    return virDomainChrSourceDefValidate(chr->source, chr, def);
-}
-
-
-static int
-virDomainSmartcardDefValidate(const virDomainSmartcardDef *smartcard,
-                              const virDomainDef *def)
-{
-    if (smartcard->type == VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH)
-        return virDomainChrSourceDefValidate(smartcard->data.passthru, NULL, def);
-
-    return 0;
-}
-
-
-static int
-virDomainRNGDefValidate(const virDomainRNGDef *rng,
-                        const virDomainDef *def)
-{
-    if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD)
-        return virDomainChrSourceDefValidate(rng->source.chardev, NULL, def);
-
-    return 0;
-}
-
-
 static int
 virDomainHostdevDefValidate(const virDomainHostdevDef *hostdev)
 {
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index e9427cffa8..882fbdac57 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -328,3 +328,164 @@ virDomainDiskDefValidate(const virDomainDef *def,
 
     return 0;
 }
+
+
+#define SERIAL_CHANNEL_NAME_CHARS \
+    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-."
+
+static int
+virDomainChrSourceDefValidate(const virDomainChrSourceDef *src_def,
+                              const virDomainChrDef *chr_def,
+                              const virDomainDef *def)
+{
+    switch ((virDomainChrType) src_def->type) {
+    case VIR_DOMAIN_CHR_TYPE_NULL:
+    case VIR_DOMAIN_CHR_TYPE_PTY:
+    case VIR_DOMAIN_CHR_TYPE_VC:
+    case VIR_DOMAIN_CHR_TYPE_STDIO:
+    case VIR_DOMAIN_CHR_TYPE_SPICEVMC:
+    case VIR_DOMAIN_CHR_TYPE_LAST:
+        break;
+
+    case VIR_DOMAIN_CHR_TYPE_FILE:
+    case VIR_DOMAIN_CHR_TYPE_DEV:
+    case VIR_DOMAIN_CHR_TYPE_PIPE:
+        if (!src_def->data.file.path) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Missing source path attribute for char device"));
+            return -1;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_TYPE_NMDM:
+        if (!src_def->data.nmdm.master) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Missing master path attribute for nmdm device"));
+            return -1;
+        }
+
+        if (!src_def->data.nmdm.slave) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Missing slave path attribute for nmdm device"));
+            return -1;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_TYPE_TCP:
+        if (!src_def->data.tcp.host) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Missing source host attribute for char device"));
+            return -1;
+        }
+
+        if (!src_def->data.tcp.service) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Missing source service attribute for char device"));
+            return -1;
+        }
+
+        if (src_def->data.tcp.listen && src_def->data.tcp.reconnect.enabled) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("chardev reconnect is possible only for connect mode"));
+            return -1;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_TYPE_UDP:
+        if (!src_def->data.udp.connectService) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Missing source service attribute for char device"));
+            return -1;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_TYPE_UNIX:
+        /* The source path can be auto generated for certain specific
+         * types of channels, but in most cases we should report an
+         * error if the user didn't provide it */
+        if (!src_def->data.nix.path &&
+            !(chr_def &&
+              chr_def->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
+              (chr_def->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN ||
+               chr_def->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO))) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Missing source path attribute for char device"));
+            return -1;
+        }
+
+        if (src_def->data.nix.listen && src_def->data.nix.reconnect.enabled) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("chardev reconnect is possible only for connect mode"));
+            return -1;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_TYPE_SPICEPORT:
+        if (!src_def->data.spiceport.channel) {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("Missing source channel attribute for char device"));
+            return -1;
+        }
+        if (strspn(src_def->data.spiceport.channel,
+                   SERIAL_CHANNEL_NAME_CHARS) < strlen(src_def->data.spiceport.channel)) {
+            virReportError(VIR_ERR_INVALID_ARG, "%s",
+                           _("Invalid character in source channel for char device"));
+            return -1;
+        }
+        break;
+    }
+
+    if (virSecurityDeviceLabelDefValidate(src_def->seclabels,
+                                          src_def->nseclabels,
+                                          def->seclabels,
+                                          def->nseclabels) < 0)
+        return -1;
+
+    return 0;
+}
+
+
+int
+virDomainRedirdevDefValidate(const virDomainDef *def,
+                             const virDomainRedirdevDef *redirdev)
+{
+    if (redirdev->bus == VIR_DOMAIN_REDIRDEV_BUS_USB &&
+        !virDomainDefHasUSB(def)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("cannot add redirected USB device: "
+                         "USB is disabled for this domain"));
+        return -1;
+    }
+
+    return virDomainChrSourceDefValidate(redirdev->source, NULL, def);
+}
+
+
+int
+virDomainChrDefValidate(const virDomainChrDef *chr,
+                        const virDomainDef *def)
+{
+    return virDomainChrSourceDefValidate(chr->source, chr, def);
+}
+
+
+int
+virDomainRNGDefValidate(const virDomainRNGDef *rng,
+                        const virDomainDef *def)
+{
+    if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD)
+        return virDomainChrSourceDefValidate(rng->source.chardev, NULL, def);
+
+    return 0;
+}
+
+
+int
+virDomainSmartcardDefValidate(const virDomainSmartcardDef *smartcard,
+                              const virDomainDef *def)
+{
+    if (smartcard->type == VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH)
+        return virDomainChrSourceDefValidate(smartcard->data.passthru, NULL, def);
+
+    return 0;
+}
diff --git a/src/conf/domain_validate.h b/src/conf/domain_validate.h
index aef169a4c9..d65de50422 100644
--- a/src/conf/domain_validate.h
+++ b/src/conf/domain_validate.h
@@ -34,3 +34,11 @@ int virSecurityDeviceLabelDefValidate(virSecurityDeviceLabelDefPtr *seclabels,
                                       size_t nvmSeclabels);
 int virDomainDiskDefValidate(const virDomainDef *def,
                              const virDomainDiskDef *disk);
+int virDomainRedirdevDefValidate(const virDomainDef *def,
+                                 const virDomainRedirdevDef *redirdev);
+int virDomainChrDefValidate(const virDomainChrDef *chr,
+                            const virDomainDef *def);
+int virDomainRNGDefValidate(const virDomainRNGDef *rng,
+                            const virDomainDef *def);
+int virDomainSmartcardDefValidate(const virDomainSmartcardDef *smartcard,
+                                  const virDomainDef *def);
-- 
2.26.2




More information about the libvir-list mailing list