The virDomainDefineXML method is one of the few that still lacks
a 'unsigned int flags' parameter. This will be needed for adding
XML validation to this API. virDomainCreateXML fortunately already
has flags.
---
include/libvirt/libvirt-domain.h | 4 ++++
src/driver-hypervisor.h | 5 +++++
src/libvirt-domain.c | 48 ++++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 5 +++++
src/qemu/qemu_driver.c | 10 ++++++++-
src/remote/remote_driver.c | 1 +
src/remote/remote_protocol.x | 19 +++++++++++++++-
7 files changed, 90 insertions(+), 2 deletions(-)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 1fac2a3..864c16c 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -1415,6 +1415,10 @@ int virDomainMemoryPeek (virDomainPtr dom,
*/
virDomainPtr virDomainDefineXML (virConnectPtr conn,
const char *xml);
+
+virDomainPtr virDomainDefineXMLFlags (virConnectPtr conn,
+ const char *xml,
+ unsigned int flags);
int virDomainUndefine (virDomainPtr domain);
typedef enum {
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index ad66629..f73d40b 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -314,6 +314,10 @@ typedef int
typedef virDomainPtr
(*virDrvDomainDefineXML)(virConnectPtr conn,
const char *xml);
+typedef virDomainPtr
+(*virDrvDomainDefineXMLFlags)(virConnectPtr conn,
+ const char *xml,
+ unsigned int flags);
typedef int
(*virDrvDomainUndefine)(virDomainPtr dom);
@@ -1260,6 +1264,7 @@ struct _virHypervisorDriver {
virDrvDomainCreateWithFlags domainCreateWithFlags;
virDrvDomainCreateWithFiles domainCreateWithFiles;
virDrvDomainDefineXML domainDefineXML;
+ virDrvDomainDefineXMLFlags domainDefineXMLFlags;
virDrvDomainUndefine domainUndefine;
virDrvDomainUndefineFlags domainUndefineFlags;
virDrvDomainAttachDevice domainAttachDevice;
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 2b0defc..e9d3608 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -6473,6 +6473,54 @@ virDomainDefineXML(virConnectPtr conn, const char *xml)
/**
+ * virDomainDefineXMLFlags:
+ * @conn: pointer to the hypervisor connection
+ * @xml: the XML description for the domain, preferably in UTF-8
+ * @flags: bitwise OR of virDomainDefineFlags
+ *
+ * Define a domain, but does not start it.
+ * This definition is persistent, until explicitly undefined with
+ * virDomainUndefine(). A previous definition for this domain would be
+ * overridden if it already exists.
+ *
+ * Some hypervisors may prevent this operation if there is a current
+ * block copy operation on a transient domain with the same id as the
+ * domain being defined; in that case, use virDomainBlockJobAbort() to
+ * stop the block copy first.
+ *
+ * virDomainFree should be used to free the resources after the
+ * domain object is no longer needed.
+ *
+ * Returns NULL in case of error, a pointer to the domain otherwise
+ */
+virDomainPtr
+virDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags)
+{
+ VIR_DEBUG("conn=%p, xml=%s flags=%x", conn, xml, flags);
+
+ virResetLastError();
+
+ virCheckConnectReturn(conn, NULL);
+ virCheckReadOnlyGoto(conn->flags, error);
+ virCheckNonNullArgGoto(xml, error);
+
+ if (conn->driver->domainDefineXMLFlags) {
+ virDomainPtr ret;
+ ret = conn->driver->domainDefineXMLFlags(conn, xml, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virReportUnsupportedError();
+
+ error:
+ virDispatchError(conn);
+ return NULL;
+}
+
+
+/**
* virDomainUndefine:
* @domain: pointer to a defined domain
*
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 5f95802..4d9973e 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -684,4 +684,9 @@ LIBVIRT_1.2.9 {
virNodeAllocPages;
} LIBVIRT_1.2.8;
+LIBVIRT_1.2.11 {
+ global:
+ virDomainDefineXMLFlags;
+} LIBVIRT_1.2.9;
+
# .... define new API here using predicted next version number ....
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a84fd47..a877b75 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6651,7 +6651,7 @@ qemuDomainCreate(virDomainPtr dom)
return qemuDomainCreateWithFlags(dom, 0);
}
-static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const char *xml)
+static virDomainPtr qemuDomainDefineXMLFlags(virConnectPtr conn, const char *xml,
unsigned int flags)
{
virQEMUDriverPtr driver = conn->privateData;
virDomainDefPtr def = NULL;
@@ -6663,6 +6663,8 @@ static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const
char *xml)
virQEMUDriverConfigPtr cfg;
virCapsPtr caps = NULL;
+ virCheckFlags(0, NULL);
+
cfg = virQEMUDriverGetConfig(driver);
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
@@ -6745,6 +6747,11 @@ static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const
char *xml)
return dom;
}
+static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const char *xml)
+{
+ return qemuDomainDefineXMLFlags(conn, xml, 0);
+}
+
static int
qemuDomainUndefineFlags(virDomainPtr dom,
unsigned int flags)
@@ -18838,6 +18845,7 @@ static virHypervisorDriver qemuDriver = {
.domainCreate = qemuDomainCreate, /* 0.2.0 */
.domainCreateWithFlags = qemuDomainCreateWithFlags, /* 0.8.2 */
.domainDefineXML = qemuDomainDefineXML, /* 0.2.0 */
+ .domainDefineXMLFlags = qemuDomainDefineXMLFlags, /* 1.2.11 */
.domainUndefine = qemuDomainUndefine, /* 0.2.0 */
.domainUndefineFlags = qemuDomainUndefineFlags, /* 0.9.4 */
.domainAttachDevice = qemuDomainAttachDevice, /* 0.4.1 */
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 04e5360..c8e4d06 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -8038,6 +8038,7 @@ static virHypervisorDriver hypervisor_driver = {
.domainCreateWithFlags = remoteDomainCreateWithFlags, /* 0.8.2 */
.domainCreateWithFiles = remoteDomainCreateWithFiles, /* 1.1.1 */
.domainDefineXML = remoteDomainDefineXML, /* 0.3.0 */
+ .domainDefineXMLFlags = remoteDomainDefineXMLFlags, /* 1.2.11 */
.domainUndefine = remoteDomainUndefine, /* 0.3.0 */
.domainUndefineFlags = remoteDomainUndefineFlags, /* 0.9.4 */
.domainAttachDevice = remoteDomainAttachDevice, /* 0.3.0 */
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index ebf4530..6a7d3e0 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -1056,6 +1056,15 @@ struct remote_domain_define_xml_ret {
remote_nonnull_domain dom;
};
+struct remote_domain_define_xml_flags_args {
+ remote_nonnull_string xml;
+ unsigned int flags;
+};
+
+struct remote_domain_define_xml_flags_ret {
+ remote_nonnull_domain dom;
+};
+
struct remote_domain_undefine_args {
remote_nonnull_domain dom;
};
@@ -5506,5 +5515,13 @@ enum remote_procedure {
* @generate: none
* @acl: connect:write
*/
- REMOTE_PROC_NODE_ALLOC_PAGES = 347
+ REMOTE_PROC_NODE_ALLOC_PAGES = 347,
+
+ /**
+ * @generate: both
+ * @priority: high
+ * @acl: domain:write
+ * @acl: domain:save
+ */
+ REMOTE_PROC_DOMAIN_DEFINE_XML_FLAGS = 348
};
--
2.1.0