}
+static int
+virDomainChrSourceDefParseTCP(virDomainChrSourceDefPtr def,
+ xmlNodePtr source,
+ unsigned int flags)
+{
+ int mode;
+ char *tmp = NULL;
+ int tmpVal;
+
+ if ((mode = virDomainChrSourceDefParseMode(source)) < 0)
+ goto error;
+
+ def->data.tcp.listen = mode == VIR_DOMAIN_CHR_SOURCE_MODE_BIND;
+ def->data.tcp.host = virXMLPropString(source, "host");
+ def->data.tcp.service = virXMLPropString(source, "service");
+
+ if ((tmp = virXMLPropString(source, "tls"))) {
+ if ((def->data.tcp.haveTLS = virTristateBoolTypeFromString(tmp)) <= 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("unknown chardev 'tls' setting '%s'"),
+ tmp);
+ goto error;
+ }
+ VIR_FREE(tmp);
+ }
+
+ if ((flags & VIR_DOMAIN_DEF_PARSE_STATUS) &&
+ (tmp = virXMLPropString(source, "tlsFromConfig"))) {
+ if (virStrToLong_i(tmp, NULL, 10, &tmpVal) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Invalid tlsFromConfig value: %s"),
+ tmp);
+ goto error;
+ }
+ def->data.tcp.tlsFromConfig = !!tmpVal;
+ VIR_FREE(tmp);
+ }
+
+ return 0;
+
+ error:
+ VIR_FREE(tmp);
+ return -1;
+}
+
+
static int
virDomainChrSourceDefParseProtocol(virDomainChrSourceDefPtr def,
xmlNodePtr protocol)
char *master = NULL;
char *slave = NULL;
char *append = NULL;
- char *haveTLS = NULL;
- char *tlsFromConfig = NULL;
bool logParsed = false;
bool protocolParsed = false;
int sourceParsed = 0;
}
sourceParsed++;
- if (!haveTLS)
- haveTLS = virXMLPropString(cur, "tls");
- if (!tlsFromConfig)
- tlsFromConfig = virXMLPropString(cur, "tlsFromConfig");
-
switch ((virDomainChrType) def->type) {
case VIR_DOMAIN_CHR_TYPE_FILE:
case VIR_DOMAIN_CHR_TYPE_PTY:
break;
case VIR_DOMAIN_CHR_TYPE_UDP:
- case VIR_DOMAIN_CHR_TYPE_TCP:
if ((mode = virDomainChrSourceDefParseMode(cur)) < 0)
goto error;
if (mode == VIR_DOMAIN_CHR_SOURCE_MODE_CONNECT) {
if (!bindService)
bindService = virXMLPropString(cur, "service");
}
+ break;
+ case VIR_DOMAIN_CHR_TYPE_TCP:
+ if (virDomainChrSourceDefParseTCP(def, cur, flags) < 0)
+ goto error;
break;
case VIR_DOMAIN_CHR_TYPE_SPICEPORT:
break;
case VIR_DOMAIN_CHR_TYPE_TCP:
- if (mode == VIR_DOMAIN_CHR_SOURCE_MODE_CONNECT) {
- if (!connectHost) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Missing source host attribute for char device"));
- goto error;
- }
-
- if (!connectService) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Missing source service attribute for char device"));
- goto error;
- }
-
- def->data.tcp.host = connectHost;
- connectHost = NULL;
- def->data.tcp.service = connectService;
- connectService = NULL;
- def->data.tcp.listen = false;
- } else if (mode == VIR_DOMAIN_CHR_SOURCE_MODE_BIND) {
- if (!bindHost) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Missing source host attribute for char device"));
- goto error;
- }
-
- if (!bindService) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Missing source service attribute for char device"));
- goto error;
- }
-
- def->data.tcp.host = bindHost;
- bindHost = NULL;
- def->data.tcp.service = bindService;
- bindService = NULL;
- def->data.tcp.listen = true;
- }
-
- if (haveTLS &&
- (def->data.tcp.haveTLS =
- virTristateBoolTypeFromString(haveTLS)) <= 0) {
- virReportError(VIR_ERR_XML_ERROR,
- _("unknown chardev 'tls' setting '%s'"),
- haveTLS);
+ if (!def->data.tcp.host) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing source host attribute for char device"));
goto error;
}
- if (tlsFromConfig &&
- flags & VIR_DOMAIN_DEF_PARSE_STATUS) {
- int tmp;
- if (virStrToLong_i(tlsFromConfig, NULL, 10, &tmp) < 0) {
- virReportError(VIR_ERR_XML_ERROR,
- _("Invalid tlsFromConfig value: %s"),
- tlsFromConfig);
- goto error;
- }
- def->data.tcp.tlsFromConfig = !!tmp;
+ if (!def->data.tcp.service) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing source service attribute for char device"));
+ goto error;
}
break;
VIR_FREE(path);
VIR_FREE(channel);
VIR_FREE(append);
- VIR_FREE(haveTLS);
- VIR_FREE(tlsFromConfig);
return ret;