mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-25 12:52:19 +00:00
virDomainNetDefParseXML: Refactor parsing of data for VIR_DOMAIN_NET_TYPE_VHOSTUSER
Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
a2c05f1a03
commit
053b7d3bd7
@ -8964,6 +8964,23 @@ virDomainNetDefParseXMLRequireSource(virDomainNetDef *def,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
VIR_DOMAIN_NET_VHOSTUSER_MODE_NONE,
|
||||||
|
VIR_DOMAIN_NET_VHOSTUSER_MODE_CLIENT,
|
||||||
|
VIR_DOMAIN_NET_VHOSTUSER_MODE_SERVER,
|
||||||
|
|
||||||
|
VIR_DOMAIN_NET_VHOSTUSER_MODE_LAST
|
||||||
|
} virDomainNetVhostuserMode;
|
||||||
|
|
||||||
|
VIR_ENUM_DECL(virDomainNetVhostuserMode);
|
||||||
|
VIR_ENUM_IMPL(virDomainNetVhostuserMode,
|
||||||
|
VIR_DOMAIN_NET_VHOSTUSER_MODE_LAST,
|
||||||
|
"",
|
||||||
|
"client",
|
||||||
|
"server",
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
static virDomainNetDef *
|
static virDomainNetDef *
|
||||||
virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
|
virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
|
||||||
xmlNodePtr node,
|
xmlNodePtr node,
|
||||||
@ -8981,7 +8998,6 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
|
|||||||
xmlNodePtr mac_node = NULL;
|
xmlNodePtr mac_node = NULL;
|
||||||
g_autoptr(GHashTable) filterparams = NULL;
|
g_autoptr(GHashTable) filterparams = NULL;
|
||||||
VIR_XPATH_NODE_AUTORESTORE(ctxt)
|
VIR_XPATH_NODE_AUTORESTORE(ctxt)
|
||||||
virDomainChrSourceReconnectDef reconnect = {0};
|
|
||||||
int rv;
|
int rv;
|
||||||
g_autofree char *macaddr = NULL;
|
g_autofree char *macaddr = NULL;
|
||||||
g_autofree char *dev = NULL;
|
g_autofree char *dev = NULL;
|
||||||
@ -8994,9 +9010,6 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
|
|||||||
g_autofree char *filter = NULL;
|
g_autofree char *filter = NULL;
|
||||||
g_autofree char *linkstate = NULL;
|
g_autofree char *linkstate = NULL;
|
||||||
g_autofree char *addrtype = NULL;
|
g_autofree char *addrtype = NULL;
|
||||||
g_autofree char *vhostuser_mode = NULL;
|
|
||||||
g_autofree char *vhostuser_path = NULL;
|
|
||||||
g_autofree char *vhostuser_type = NULL;
|
|
||||||
g_autofree char *tap = NULL;
|
g_autofree char *tap = NULL;
|
||||||
const char *prefix = xmlopt ? xmlopt->config.netPrefix : NULL;
|
const char *prefix = xmlopt ? xmlopt->config.netPrefix : NULL;
|
||||||
|
|
||||||
@ -9123,12 +9136,53 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
|
case VIR_DOMAIN_NET_TYPE_VHOSTUSER: {
|
||||||
if (source_node) {
|
g_autofree char *vhostuser_type = NULL;
|
||||||
vhostuser_type = virXMLPropString(source_node, "type");
|
virDomainNetVhostuserMode vhostuser_mode;
|
||||||
vhostuser_path = virXMLPropString(source_node, "path");
|
|
||||||
vhostuser_mode = virXMLPropString(source_node, "mode");
|
if (virDomainNetDefParseXMLRequireSource(def, source_node) < 0)
|
||||||
if (virDomainChrSourceReconnectDefParseXML(&reconnect, source_node, ctxt) < 0)
|
return NULL;
|
||||||
|
|
||||||
|
if (!(vhostuser_type = virXMLPropStringRequired(source_node, "type")))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (STRNEQ_NULLABLE(vhostuser_type, "unix")) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("Type='%s' unsupported for <interface type='vhostuser'>"),
|
||||||
|
vhostuser_type);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(def->data.vhostuser = virDomainChrSourceDefNew(xmlopt)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
def->data.vhostuser->type = VIR_DOMAIN_CHR_TYPE_UNIX;
|
||||||
|
|
||||||
|
if (!(def->data.vhostuser->data.nix.path = virXMLPropStringRequired(source_node, "path")))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (virXMLPropEnum(source_node, "mode",
|
||||||
|
virDomainNetVhostuserModeTypeFromString,
|
||||||
|
VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
|
||||||
|
&vhostuser_mode) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
switch (vhostuser_mode) {
|
||||||
|
case VIR_DOMAIN_NET_VHOSTUSER_MODE_CLIENT:
|
||||||
|
def->data.vhostuser->data.nix.listen = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_NET_VHOSTUSER_MODE_SERVER:
|
||||||
|
def->data.vhostuser->data.nix.listen = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_NET_VHOSTUSER_MODE_NONE:
|
||||||
|
case VIR_DOMAIN_NET_VHOSTUSER_MODE_LAST:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virDomainChrSourceReconnectDefParseXML(&def->data.vhostuser->data.nix.reconnect,
|
||||||
|
source_node, ctxt) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -9268,58 +9322,10 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (STRNEQ_NULLABLE(vhostuser_type, "unix")) {
|
if (def->data.vhostuser->data.nix.listen &&
|
||||||
if (vhostuser_type)
|
def->data.vhostuser->data.nix.reconnect.enabled == VIR_TRISTATE_BOOL_YES) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
_("Type='%s' unsupported for"
|
|
||||||
" <interface type='vhostuser'>"),
|
|
||||||
vhostuser_type);
|
|
||||||
else
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("No <source> 'type' attribute "
|
_("'reconnect' attribute unsupported 'server' mode for <interface type='vhostuser'>"));
|
||||||
"specified for <interface "
|
|
||||||
"type='vhostuser'>"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vhostuser_path == NULL) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("No <source> 'path' attribute "
|
|
||||||
"specified with <interface "
|
|
||||||
"type='vhostuser'/>"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vhostuser_mode == NULL) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("No <source> 'mode' attribute "
|
|
||||||
"specified with <interface "
|
|
||||||
"type='vhostuser'/>"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(def->data.vhostuser = virDomainChrSourceDefNew(xmlopt)))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
def->data.vhostuser->type = VIR_DOMAIN_CHR_TYPE_UNIX;
|
|
||||||
def->data.vhostuser->data.nix.path = g_steal_pointer(&vhostuser_path);
|
|
||||||
|
|
||||||
if (STREQ(vhostuser_mode, "server")) {
|
|
||||||
def->data.vhostuser->data.nix.listen = true;
|
|
||||||
if (reconnect.enabled == VIR_TRISTATE_BOOL_YES) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
_("'reconnect' attribute unsupported "
|
|
||||||
"'server' mode for <interface type='vhostuser'>"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
} else if (STREQ(vhostuser_mode, "client")) {
|
|
||||||
def->data.vhostuser->data.nix.listen = false;
|
|
||||||
def->data.vhostuser->data.nix.reconnect = reconnect;
|
|
||||||
} else {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
_("Wrong <source> 'mode' attribute "
|
|
||||||
"specified with <interface "
|
|
||||||
"type='vhostuser'/>"));
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user