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