struct _virDomainXMLOption {
virObject parent;
+ /* XML parser callbacks and defaults */
+ virDomainDefParserConfig config;
+
/* domain private data management callbacks */
virDomainXMLPrivateDataCallbacks privateData;
static virClassPtr virDomainXMLOptionClass;
static void virDomainObjDispose(void *obj);
static void virDomainObjListDispose(void *obj);
+static void virDomainXMLOptionClassDispose(void *obj);
static int virDomainObjOnceInit(void)
{
if (!(virDomainXMLOptionClass = virClassNew(virClassForObject(),
"virDomainXMLOption",
sizeof(virDomainXMLOption),
- NULL)))
+ virDomainXMLOptionClassDispose)))
return -1;
return 0;
VIR_ONCE_GLOBAL_INIT(virDomainObj)
+static void
+virDomainXMLOptionClassDispose(void *obj)
+{
+ virDomainXMLOptionPtr xmlopt = obj;
+
+ if (xmlopt->config.privFree)
+ (xmlopt->config.privFree)(xmlopt->config.priv);
+}
+
+
/**
* virDomainXMLOptionNew:
*
* Allocate a new domain XML configuration
*/
virDomainXMLOptionPtr
-virDomainXMLOptionNew(virDomainXMLPrivateDataCallbacksPtr priv,
+virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
+ virDomainXMLPrivateDataCallbacksPtr priv,
virDomainXMLNamespacePtr xmlns)
{
virDomainXMLOptionPtr xmlopt;
if (priv)
xmlopt->privateData = *priv;
+ if (config)
+ xmlopt->config = *config;
+
if (xmlns)
xmlopt->ns = *xmlns;
}
+static int
+virDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
+ virDomainDefPtr def,
+ virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt)
+{
+ int ret;
+
+ if (xmlopt && xmlopt->config.devicesPostParseCallback) {
+ ret = xmlopt->config.devicesPostParseCallback(dev, def, caps,
+ xmlopt->config.priv);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
+}
+
+
+struct virDomainDefPostParseDeviceIteratorData {
+ virDomainDefPtr def;
+ virCapsPtr caps;
+ virDomainXMLOptionPtr xmlopt;
+};
+
+
+static int
+virDomainDefPostParseDeviceIterator(virDomainDefPtr def ATTRIBUTE_UNUSED,
+ virDomainDeviceDefPtr dev,
+ virDomainDeviceInfoPtr info ATTRIBUTE_UNUSED,
+ void *opaque)
+{
+ struct virDomainDefPostParseDeviceIteratorData *data = opaque;
+ return virDomainDeviceDefPostParse(dev, data->def, data->caps, data->xmlopt);
+}
+
+
+static int
+virDomainDefPostParse(virDomainDefPtr def,
+ virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt)
+{
+ int ret;
+ struct virDomainDefPostParseDeviceIteratorData data = {
+ .def = def,
+ .caps = caps,
+ .xmlopt = xmlopt,
+ };
+
+ /* call the domain config callback */
+ if (xmlopt && xmlopt->config.domainPostParseCallback) {
+ ret = xmlopt->config.domainPostParseCallback(def, caps,
+ xmlopt->config.priv);
+ if (ret < 0)
+ return ret;
+ }
+
+ /* iterate the devices */
+ if ((ret = virDomainDeviceInfoIterate(def,
+ virDomainDefPostParseDeviceIterator,
+ &data)) < 0)
+ return ret;
+
+ return 0;
+}
+
+
void virDomainDefClearPCIAddresses(virDomainDefPtr def)
{
virDomainDeviceInfoIterate(def, virDomainDeviceInfoClearPCIAddress, NULL);
virDomainDeviceDefPtr
virDomainDeviceDefParse(virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt,
virDomainDefPtr def,
const char *xmlStr,
unsigned int flags)
goto error;
}
+ /* callback to fill driver specific device aspects */
+ if (virDomainDeviceDefPostParse(dev, def, caps, xmlopt) < 0)
+ goto error;
+
cleanup:
xmlFreeDoc(xml);
xmlXPathFreeContext(ctxt);
if (virDomainDefAddImplicitControllers(def) < 0)
goto error;
+ /* callback to fill driver specific domain aspects */
+ if (virDomainDefPostParse(def, caps, xmlopt) < 0)
+ goto error;
+
virBitmapFree(bootMap);
return def;
*/
virDomainDeviceDefPtr
virDomainDeviceDefCopy(virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt,
const virDomainDefPtr def,
virDomainDeviceDefPtr src)
{
goto cleanup;
xmlStr = virBufferContentAndReset(&buf);
- ret = virDomainDeviceDefParse(caps, def, xmlStr, flags);
+ ret = virDomainDeviceDefParse(caps, xmlopt, def, xmlStr, flags);
cleanup:
VIR_FREE(xmlStr);
typedef int (*virDomainXMLPrivateDataFormatFunc)(virBufferPtr, void *);
typedef int (*virDomainXMLPrivateDataParseFunc)(xmlXPathContextPtr, void *);
+typedef int (*virDomainDefPostParseCallback)(virDomainDefPtr def,
+ virCapsPtr caps,
+ void *opaque);
+typedef int (*virDomainDeviceDefPostParseCallback)(virDomainDeviceDefPtr dev,
+ virDomainDefPtr def,
+ virCapsPtr caps,
+ void *opaque);
+
+typedef struct _virDomainDefParserConfig virDomainDefParserConfig;
+typedef virDomainDefParserConfig *virDomainDefParserConfigPtr;
+struct _virDomainDefParserConfig {
+ virDomainDefPostParseCallback domainPostParseCallback;
+ virDomainDeviceDefPostParseCallback devicesPostParseCallback;
+
+ void *priv;
+ virFreeCallback privFree;
+};
+
typedef struct _virDomainXMLPrivateDataCallbacks virDomainXMLPrivateDataCallbacks;
typedef virDomainXMLPrivateDataCallbacks *virDomainXMLPrivateDataCallbacksPtr;
struct _virDomainXMLPrivateDataCallbacks {
virDomainXMLPrivateDataParseFunc parse;
};
-virDomainXMLOptionPtr
-virDomainXMLOptionNew(virDomainXMLPrivateDataCallbacksPtr priv,
- virDomainXMLNamespacePtr xmlns);
+virDomainXMLOptionPtr virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
+ virDomainXMLPrivateDataCallbacksPtr priv,
+ virDomainXMLNamespacePtr xmlns);
virDomainXMLNamespacePtr
virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr xmlopt)
void virDomainRedirFilterDefFree(virDomainRedirFilterDefPtr def);
void virDomainDeviceDefFree(virDomainDeviceDefPtr def);
virDomainDeviceDefPtr virDomainDeviceDefCopy(virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt,
const virDomainDefPtr def,
virDomainDeviceDefPtr src);
int virDomainDeviceAddressIsValid(virDomainDeviceInfoPtr info,
virDomainObjPtr dom);
virDomainDeviceDefPtr virDomainDeviceDefParse(virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt,
virDomainDefPtr def,
const char *xmlStr,
unsigned int flags);
goto cleanup;
}
- if (!(priv->xmlopt = virDomainXMLOptionNew(NULL, NULL)))
+ if (!(priv->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
goto cleanup;
conn->privateData = priv;
goto error;
}
- if (!(libxl_driver->xmlopt = virDomainXMLOptionNew(&libxlDomainXMLPrivateDataCallbacks,
- NULL)))
+ if (!(libxl_driver->xmlopt = virDomainXMLOptionNew(NULL,
+ &libxlDomainXMLPrivateDataCallbacks,
+ NULL)))
goto error;
/* Load running domains first. */
priv = vm->privateData;
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
- if (!(dev = virDomainDeviceDefParse(driver->caps, vm->def, xml,
+ if (!(dev = virDomainDeviceDefParse(driver->caps, driver->xmlopt,
+ vm->def, xml,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) {
/* If dev exists it was created to modify the domain config. Free it. */
virDomainDeviceDefFree(dev);
- if (!(dev = virDomainDeviceDefParse(driver->caps, vm->def, xml,
+ if (!(dev = virDomainDeviceDefParse(driver->caps, driver->xmlopt,
+ vm->def, xml,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
virDomainXMLOptionPtr
lxcDomainXMLConfInit(void)
{
- return virDomainXMLOptionNew(&virLXCDriverPrivateDataCallbacks, NULL);
+ return virDomainXMLOptionNew(NULL,
+ &virLXCDriverPrivateDataCallbacks,
+ NULL);
}
int lxcLoadDriverConfig(virLXCDriverPtr driver)
goto cleanup;
}
- dev = dev_copy = virDomainDeviceDefParse(driver->caps, vm->def, xml,
+ dev = dev_copy = virDomainDeviceDefParse(driver->caps, driver->xmlopt,
+ vm->def, xml,
VIR_DOMAIN_XML_INACTIVE);
if (dev == NULL)
goto cleanup;
* create a deep copy of device as adding
* to CONFIG takes one instance.
*/
- dev_copy = virDomainDeviceDefCopy(driver->caps, vm->def, dev);
+ dev_copy = virDomainDeviceDefCopy(driver->caps, driver->xmlopt,
+ vm->def, dev);
if (!dev_copy)
goto cleanup;
}
return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_OPENVZ;
}
+
virCapsPtr openvzCapsInit(void)
{
virCapsPtr caps;
if (!(driver->caps = openvzCapsInit()))
goto cleanup;
- if (!(driver->xmlopt = virDomainXMLOptionNew(NULL, NULL)))
+ if (!(driver->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
goto cleanup;
if (openvzLoadDomains(driver) < 0)
&vmdef) < 0)
goto cleanup;
- dev = virDomainDeviceDefParse(driver->caps, vmdef, xml,
- VIR_DOMAIN_XML_INACTIVE);
+ dev = virDomainDeviceDefParse(driver->caps, driver->xmlopt,
+ vmdef, xml, VIR_DOMAIN_XML_INACTIVE);
if (!dev)
goto cleanup;
if (!(privconn->caps = parallelsBuildCapabilities()))
goto error;
- if (!(privconn->xmlopt = virDomainXMLOptionNew(NULL, NULL)))
+ if (!(privconn->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
goto error;
if (!(privconn->domains = virDomainObjListNew()))
goto failure;
}
- if (!(phyp_driver->xmlopt = virDomainXMLOptionNew(NULL, NULL)))
+ if (!(phyp_driver->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
goto failure;
conn->privateData = phyp_driver;
goto cleanup;
}
- dev = virDomainDeviceDefParse(phyp_driver->caps, def, xml,
- VIR_DOMAIN_XML_INACTIVE);
+ dev = virDomainDeviceDefParse(phyp_driver->caps, NULL,
+ def, xml, VIR_DOMAIN_XML_INACTIVE);
if (!dev) {
goto cleanup;
}
virDomainXMLOptionPtr
virQEMUDriverCreateXMLConf(void)
{
- return virDomainXMLOptionNew(&virQEMUDriverPrivateDataCallbacks,
- &virQEMUDriverDomainXMLNamespace);
+ return virDomainXMLOptionNew(NULL,
+ &virQEMUDriverPrivateDataCallbacks,
+ &virQEMUDriverDomainXMLNamespace);
}
tmp = dev->data.disk;
dev->data.disk = orig_disk;
- if (!(dev_copy = virDomainDeviceDefCopy(caps, vm->def, dev))) {
+ if (!(dev_copy = virDomainDeviceDefCopy(caps, driver->xmlopt,
+ vm->def, dev))) {
dev->data.disk = tmp;
goto end;
}
tmp = dev->data.disk;
dev->data.disk = orig_disk;
- if (!(dev_copy = virDomainDeviceDefCopy(caps, vm->def, dev))) {
+ if (!(dev_copy = virDomainDeviceDefCopy(caps, driver->xmlopt,
+ vm->def, dev))) {
dev->data.disk = tmp;
goto end;
}
goto endjob;
}
- dev = dev_copy = virDomainDeviceDefParse(caps, vm->def, xml,
+ dev = dev_copy = virDomainDeviceDefParse(caps, driver->xmlopt,
+ vm->def, xml,
VIR_DOMAIN_XML_INACTIVE);
if (dev == NULL)
goto endjob;
* create a deep copy of device as adding
* to CONFIG takes one instance.
*/
- dev_copy = virDomainDeviceDefCopy(caps, vm->def, dev);
+ dev_copy = virDomainDeviceDefCopy(caps, driver->xmlopt, vm->def, dev);
if (!dev_copy)
goto endjob;
}
goto exit;
}
- if (!(ctl->xmlopt = virDomainXMLOptionNew(NULL, NULL))) {
+ if (!(ctl->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL))) {
vah_error(ctl, 0, _("Failed to create XML config object"));
goto exit;
}
{
virDomainXMLPrivateDataCallbacks priv = { .alloc = testDomainObjPrivateAlloc,
.free = testDomainObjPrivateFree };
- return virDomainXMLOptionNew(&priv, NULL);
+ return virDomainXMLOptionNew(NULL, &priv, NULL);
}
if ((uml_driver->caps = umlCapsInit()) == NULL)
goto out_of_memory;
- if (!(uml_driver->xmlopt = virDomainXMLOptionNew(&privcb,
- NULL)))
+ if (!(uml_driver->xmlopt = virDomainXMLOptionNew(NULL, &privcb, NULL)))
goto error;
if ((uml_driver->inotifyFD = inotify_init()) < 0) {
goto cleanup;
}
- dev = virDomainDeviceDefParse(driver->caps, vm->def, xml,
+ dev = virDomainDeviceDefParse(driver->caps, driver->xmlopt, vm->def, xml,
VIR_DOMAIN_XML_INACTIVE);
if (dev == NULL)
goto cleanup;
}
- dev = virDomainDeviceDefParse(driver->caps, vm->def, xml,
+ dev = virDomainDeviceDefParse(driver->caps, driver->xmlopt, vm->def, xml,
VIR_DOMAIN_XML_INACTIVE);
if (dev == NULL)
goto cleanup;
static virDomainXMLOptionPtr
vboxXMLConfInit(void)
{
- return virDomainXMLOptionNew(NULL, NULL);
+ return virDomainXMLOptionNew(NULL, NULL, NULL);
}
goto cleanup;
}
- dev = virDomainDeviceDefParse(data->caps, def, xml,
- VIR_DOMAIN_XML_INACTIVE);
+ dev = virDomainDeviceDefParse(data->caps, data->xmlopt,
+ def, xml, VIR_DOMAIN_XML_INACTIVE);
if (dev == NULL)
goto cleanup;
goto cleanup;
}
- dev = virDomainDeviceDefParse(data->caps, def, xml,
- VIR_DOMAIN_XML_INACTIVE);
+ dev = virDomainDeviceDefParse(data->caps, data->xmlopt,
+ def, xml, VIR_DOMAIN_XML_INACTIVE);
if (dev == NULL)
goto cleanup;
virDomainXMLPrivateDataCallbacks priv = { .alloc = vmwareDataAllocFunc,
.free = vmwareDataFreeFunc };
- return virDomainXMLOptionNew(&priv, NULL);
+ return virDomainXMLOptionNew(NULL, &priv, NULL);
}
static virDrvOpenStatus
goto fail;
}
- if (!(priv->xmlopt = virDomainXMLOptionNew(NULL, NULL)))
+ if (!(priv->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
goto fail;
#if WITH_XEN_INOTIFY
NULL)))
goto cleanup;
- if (!(dev = virDomainDeviceDefParse(priv->caps,
+ if (!(dev = virDomainDeviceDefParse(priv->caps, priv->xmlopt,
def, xml, VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
NULL)))
goto cleanup;
- if (!(dev = virDomainDeviceDefParse(priv->caps,
+ if (!(dev = virDomainDeviceDefParse(priv->caps, priv->xmlopt,
def, xml, VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
NULL)))
goto cleanup;
- if (!(dev = virDomainDeviceDefParse(priv->caps,
+ if (!(dev = virDomainDeviceDefParse(priv->caps, priv->xmlopt,
def, xml, VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
def = entry->def;
if (!(dev = virDomainDeviceDefParse(priv->caps,
+ priv->xmlopt,
entry->def,
xml, VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
def = entry->def;
if (!(dev = virDomainDeviceDefParse(priv->caps,
+ priv->xmlopt,
entry->def,
xml, VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
goto error;
}
- if (!(privP->xmlopt = virDomainXMLOptionNew(NULL, NULL))) {
+ if (!(privP->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL))) {
xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR,
_("Failed to create XML conf object"));
goto error;
virDomainXMLOptionPtr
testXenXMLConfInit(void)
{
- return virDomainXMLOptionNew(NULL, NULL);
+ return virDomainXMLOptionNew(NULL, NULL, NULL);
}
virCapsPtr testXenCapsInit(void) {
return EXIT_FAILURE;
}
- if (!(xmlopt = virDomainXMLOptionNew(NULL, NULL)))
+ if (!(xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
return EXIT_FAILURE;
ctx.opaque = NULL;