targetType only tracks the actual <target> format we are parsing.
TYPE_DEFAULT is the typical serial/parallel format, NONE is for the
<monitor> device which prints nothing.
Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
---
src/conf/domain_conf.c | 108 ++++++++++++++++++++++++-----------------------
src/conf/domain_conf.h | 19 ++++++--
src/qemu/qemu_conf.c | 6 +-
3 files changed, 72 insertions(+), 61 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c9140fe..e4d52ff 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -161,14 +161,18 @@ VIR_ENUM_IMPL(virDomainNet, VIR_DOMAIN_NET_TYPE_LAST,
"internal",
"direct")
+VIR_ENUM_IMPL(virDomainChrTarget, VIR_DOMAIN_CHR_TARGET_TYPE_LAST,
+ "none",
+ "default",
+ "guestfwd",
+ "virtio")
+
VIR_ENUM_IMPL(virDomainChrDevice, VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
- "null",
"monitor",
"parallel",
"serial",
"console",
- "guestfwd",
- "virtio")
+ "channel")
VIR_ENUM_IMPL(virDomainChr, VIR_DOMAIN_CHR_TYPE_LAST,
"null",
@@ -516,12 +520,12 @@ void virDomainChrDefFree(virDomainChrDefPtr def)
if (!def)
return;
- switch (def->deviceType) {
- case VIR_DOMAIN_CHR_DEVICE_TYPE_GUESTFWD:
+ switch (def->targetType) {
+ case VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD:
VIR_FREE(def->target.addr);
break;
- case VIR_DOMAIN_CHR_DEVICE_TYPE_VIRTIO:
+ case VIR_DOMAIN_CHR_TARGET_TYPE_VIRTIO:
VIR_FREE(def->target.name);
break;
}
@@ -2379,7 +2383,7 @@ virDomainChrDefParseXML(xmlNodePtr node,
char *mode = NULL;
char *protocol = NULL;
const char *nodeName;
- const char *deviceType = NULL;
+ const char *targetType = NULL;
const char *addrStr = NULL;
const char *portStr = NULL;
virDomainChrDefPtr def;
@@ -2397,15 +2401,9 @@ virDomainChrDefParseXML(xmlNodePtr node,
nodeName = (const char *) node->name;
if ((def->deviceType = virDomainChrDeviceTypeFromString(nodeName)) < 0) {
- /* channel is handled below */
- if (STRNEQ(nodeName, "channel")) {
- virDomainReportError(VIR_ERR_XML_ERROR,
- _("unknown target type for character device:
%s"),
- nodeName);
- VIR_FREE(def);
- return NULL;
- }
- def->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_NULL;
+ virDomainReportError(VIR_ERR_XML_ERROR,
+ _("unknown character device type: %s"),
+ nodeName);
}
cur = node->children;
@@ -2454,31 +2452,36 @@ virDomainChrDefParseXML(xmlNodePtr node,
if (protocol == NULL)
protocol = virXMLPropString(cur, "type");
} else if (xmlStrEqual(cur->name, BAD_CAST "target")) {
- /* If target type isn't set yet, expect it to be set here */
- if (def->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_NULL) {
- deviceType = virXMLPropString(cur, "type");
- if (deviceType == NULL) {
+ def->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_DEFAULT;
+
+ if (def->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_MONITOR) {
+ /* Don't target <target> info for monitor device */
+ def->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_NONE;
+
+ } else if (def->deviceType ==
+ VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL) {
+ targetType = virXMLPropString(cur, "type");
+ if (targetType == NULL) {
virDomainReportError(VIR_ERR_XML_ERROR, "%s",
_("character device target does "
"not define a type"));
goto error;
}
- if ((def->deviceType =
- virDomainChrDeviceTypeFromString(deviceType)) < 0)
+
+ if ((def->targetType =
+ virDomainChrTargetTypeFromString(targetType)) < 0)
{
virDomainReportError(VIR_ERR_XML_ERROR,
_("unknown target type for "
"character device: %s"),
- deviceType);
+ targetType);
goto error;
}
}
unsigned int port;
- switch (def->deviceType) {
- case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
- case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
- case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
+ switch (def->targetType) {
+ case VIR_DOMAIN_CHR_TARGET_TYPE_DEFAULT:
portStr = virXMLPropString(cur, "port");
if (portStr == NULL) {
/* Not required. It will be assigned automatically
@@ -2494,7 +2497,7 @@ virDomainChrDefParseXML(xmlNodePtr node,
}
break;
- case VIR_DOMAIN_CHR_DEVICE_TYPE_GUESTFWD:
+ case VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD:
addrStr = virXMLPropString(cur, "address");
portStr = virXMLPropString(cur, "port");
@@ -2538,14 +2541,17 @@ virDomainChrDefParseXML(xmlNodePtr node,
virSocketSetPort(def->target.addr, port);
break;
- case VIR_DOMAIN_CHR_DEVICE_TYPE_VIRTIO:
+ case VIR_DOMAIN_CHR_TARGET_TYPE_VIRTIO:
def->target.name = virXMLPropString(cur, "name");
break;
+ case VIR_DOMAIN_CHR_TARGET_TYPE_NONE:
+ break;
+
default:
virDomainReportError(VIR_ERR_XML_ERROR,
- _("unexpected target type type %u"),
- def->deviceType);
+ _("unexpected target type %u"),
+ def->targetType);
}
}
}
@@ -2678,7 +2684,7 @@ cleanup:
VIR_FREE(connectHost);
VIR_FREE(connectService);
VIR_FREE(path);
- VIR_FREE(deviceType);
+ VIR_FREE(targetType);
VIR_FREE(addrStr);
VIR_FREE(portStr);
@@ -4422,7 +4428,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
def->channels[def->nchannels++] = chr;
- if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_VIRTIO &&
+ if (chr->targetType == VIR_DOMAIN_CHR_TARGET_TYPE_VIRTIO &&
chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
chr->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL;
@@ -4891,7 +4897,7 @@ static int
virDomainDefMaybeAddVirtioSerialController(virDomainDefPtr def)
for (i = 0 ; i < def->nchannels ; i++) {
virDomainChrDefPtr channel = def->channels[i];
- if (channel->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_VIRTIO) {
+ if (channel->targetType == VIR_DOMAIN_CHR_TARGET_TYPE_VIRTIO) {
int idx = 0;
if (channel->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL)
idx = channel->info.addr.vioserial.controller;
@@ -5473,28 +5479,23 @@ virDomainChrDefFormat(virBufferPtr buf,
int flags)
{
const char *type = virDomainChrTypeToString(def->type);
- const char *targetName = virDomainChrDeviceTypeToString(def->deviceType);
- const char *elementName;
+ const char *elementName = virDomainChrDeviceTypeToString(def->deviceType);
int ret = 0;
- switch (def->deviceType) {
- /* channel types are in a common channel element */
- case VIR_DOMAIN_CHR_DEVICE_TYPE_GUESTFWD:
- case VIR_DOMAIN_CHR_DEVICE_TYPE_VIRTIO:
- elementName = "channel";
- break;
-
- default:
- elementName = targetName;
- }
-
if (!type) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected char type %d"), def->type);
return -1;
}
+ if (!elementName) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unexpected char device type %d"),
+ def->deviceType);
+ return -1;
+ }
+
/* Compat with legacy <console tty='/dev/pts/5'/> syntax */
virBufferVSprintf(buf, " <%s type='%s'",
elementName, type);
@@ -5573,8 +5574,8 @@ virDomainChrDefFormat(virBufferPtr buf,
break;
}
- switch (def->deviceType) {
- case VIR_DOMAIN_CHR_DEVICE_TYPE_GUESTFWD:
+ switch (def->targetType) {
+ case VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD:
{
int port = virSocketGetPort(def->target.addr);
if (port < 0) {
@@ -5595,7 +5596,7 @@ virDomainChrDefFormat(virBufferPtr buf,
break;
}
- case VIR_DOMAIN_CHR_DEVICE_TYPE_VIRTIO:
+ case VIR_DOMAIN_CHR_TARGET_TYPE_VIRTIO:
virBufferAddLit(buf, " <target type='virtio'");
if (def->target.name) {
virBufferEscapeString(buf, " name='%s'",
def->target.name);
@@ -5603,12 +5604,13 @@ virDomainChrDefFormat(virBufferPtr buf,
virBufferAddLit(buf, "/>\n");
break;
- case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
- case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
- case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
+ case VIR_DOMAIN_CHR_TARGET_TYPE_DEFAULT:
virBufferVSprintf(buf, " <target port='%d'/>\n",
def->target.port);
break;
+ case VIR_DOMAIN_CHR_TARGET_TYPE_NONE:
+ break;
+
default:
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected character destination type %d"),
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index b4e756a..75dc29a 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -312,15 +312,22 @@ struct _virDomainNetDef {
};
enum virDomainChrDeviceType {
- VIR_DOMAIN_CHR_DEVICE_TYPE_NULL = 0,
- VIR_DOMAIN_CHR_DEVICE_TYPE_MONITOR,
+ VIR_DOMAIN_CHR_DEVICE_TYPE_MONITOR = 0,
VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL,
VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL,
VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE,
- VIR_DOMAIN_CHR_DEVICE_TYPE_GUESTFWD,
- VIR_DOMAIN_CHR_DEVICE_TYPE_VIRTIO,
+ VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL,
- VIR_DOMAIN_CHR_DEVICE_TYPE_LAST
+ VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
+};
+
+enum virDomainChrTargetType {
+ VIR_DOMAIN_CHR_TARGET_TYPE_DEFAULT = 0,
+ VIR_DOMAIN_CHR_TARGET_TYPE_NONE,
+ VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD,
+ VIR_DOMAIN_CHR_TARGET_TYPE_VIRTIO,
+
+ VIR_DOMAIN_CHR_TARGET_TYPE_LAST,
};
enum virDomainChrType {
@@ -349,6 +356,7 @@ typedef struct _virDomainChrDef virDomainChrDef;
typedef virDomainChrDef *virDomainChrDefPtr;
struct _virDomainChrDef {
int deviceType;
+ int targetType;
union {
int port; /* parallel, serial, console */
virSocketAddrPtr addr; /* guestfwd */
@@ -1096,6 +1104,7 @@ VIR_ENUM_DECL(virDomainControllerModel)
VIR_ENUM_DECL(virDomainFS)
VIR_ENUM_DECL(virDomainNet)
VIR_ENUM_DECL(virDomainChrDevice)
+VIR_ENUM_DECL(virDomainChrTarget)
VIR_ENUM_DECL(virDomainChr)
VIR_ENUM_DECL(virDomainSoundModel)
VIR_ENUM_DECL(virDomainWatchdogModel)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 1c4e934..62b4fb7 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -4382,8 +4382,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
virDomainChrDefPtr channel = def->channels[i];
char *devstr;
- switch(channel->deviceType) {
- case VIR_DOMAIN_CHR_DEVICE_TYPE_GUESTFWD:
+ switch(channel->targetType) {
+ case VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD:
if (!(qemuCmdFlags & QEMUD_CMD_FLAG_CHARDEV) ||
!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
qemuReportError(VIR_ERR_NO_SUPPORT,
@@ -4409,7 +4409,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
ADD_ARG(devstr);
break;
- case VIR_DOMAIN_CHR_DEVICE_TYPE_VIRTIO:
+ case VIR_DOMAIN_CHR_TARGET_TYPE_VIRTIO:
if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
qemuReportError(VIR_ERR_NO_SUPPORT, "%s",
_("virtio channel requires QEMU to support -device"));
--
1.6.6.1