]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: xml: Expose all arguments of virXMLParseHelper in virXMLParse macro
authorPeter Krempa <pkrempa@redhat.com>
Thu, 22 Sep 2022 12:30:53 +0000 (14:30 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 6 Oct 2022 08:54:24 +0000 (10:54 +0200)
The generic helper also has helper code to validate the root element and
create an XPath context. Many places in the code duplicate code for
doing these operations.

Extend the helper to provide all arguments and fix all callers.

In many cases this patch refactors the passing of the 'validate'
field into a separate variable to avoid quirky looking arguments.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
18 files changed:
src/conf/backup_conf.c
src/conf/checkpoint_conf.c
src/conf/domain_conf.c
src/conf/interface_conf.c
src/conf/network_conf.c
src/conf/node_device_conf.c
src/conf/nwfilter_conf.c
src/conf/secret_conf.c
src/conf/snapshot_conf.c
src/conf/storage_conf.c
src/conf/virnetworkportdef.c
src/conf/virnwfilterbindingdef.c
src/conf/virnwfilterbindingobj.c
src/test/test_driver.c
src/util/virxml.h
src/vbox/vbox_snapshot_conf.c
src/vz/vz_sdk.c
tests/qemuxml2argvtest.c

index 0f2fba115d5f39bdbda1db0c91f5a310a04f04a7..7dfc8ee63504a54b6fcd102b6aa0dc62eb9a440e 100644 (file)
@@ -277,9 +277,10 @@ virDomainBackupDefParseString(const char *xmlStr,
     virDomainBackupDef *ret = NULL;
     g_autoptr(xmlDoc) xml = NULL;
     int keepBlanksDefault = xmlKeepBlanksDefault(0);
+    bool validate = !(flags & VIR_DOMAIN_BACKUP_PARSE_INTERNAL);
 
-    if ((xml = virXMLParse(NULL, xmlStr, _("(domain_backup)"), "domainbackup.rng",
-                           !(flags & VIR_DOMAIN_BACKUP_PARSE_INTERNAL)))) {
+    if ((xml = virXMLParse(NULL, xmlStr, _("(domain_backup)"),
+                           NULL, NULL, "domainbackup.rng", validate))) {
         xmlKeepBlanksDefault(keepBlanksDefault);
         ret = virDomainBackupDefParseNode(xml, xmlDocGetRootElement(xml),
                                           xmlopt, flags);
index 338cf10d12348d1079471dd7f075daaa1160d962..0d2d2050da7bb150f5257826d219d157c8614390 100644 (file)
@@ -212,7 +212,7 @@ virDomainCheckpointDefParseString(const char *xmlStr,
     g_autoptr(xmlDoc) xml = NULL;
     int keepBlanksDefault = xmlKeepBlanksDefault(0);
 
-    if ((xml = virXMLParse(NULL, xmlStr, _("(domain_checkpoint)"),
+    if ((xml = virXMLParse(NULL, xmlStr, _("(domain_checkpoint)"), NULL, NULL,
                            "domaincheckpoint.rng", true))) {
         xmlKeepBlanksDefault(keepBlanksDefault);
         ret = virDomainCheckpointDefParseNode(xml, xmlDocGetRootElement(xml),
index a609cc4f684ea44bc1f03466c4010e8888d1661a..b3202c9f7671f1dc723e153aa55a20e14f3052c5 100644 (file)
@@ -19083,8 +19083,10 @@ virDomainDefParse(const char *xmlStr,
     virDomainDef *def = NULL;
     int keepBlanksDefault = xmlKeepBlanksDefault(0);
     xmlNodePtr root;
-    if (!(xml = virXMLParse(filename, xmlStr, _("(domain_definition)"), "domain.rng",
-                            flags & VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA)))
+    bool validate = flags & VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA;
+
+    if (!(xml = virXMLParse(filename, xmlStr, _("(domain_definition)"),
+                            NULL, NULL, "domain.rng", validate)))
         goto cleanup;
 
     root = xmlDocGetRootElement(xml);
index dc61b378b94d8f4aecb8de28166faf2754b6c0e2..a3f6b6bed6a4f0cf8076bb7230bc0a52279900a7 100644 (file)
@@ -700,9 +700,10 @@ virInterfaceDefParse(const char *xmlStr,
                      unsigned int flags)
 {
     g_autoptr(xmlDoc) xml = NULL;
+    bool validate = flags & VIR_INTERFACE_DEFINE_VALIDATE;
 
     xml = virXMLParse(filename, xmlStr, _("(interface_definition)"),
-                      "interface.rng", flags & VIR_INTERFACE_DEFINE_VALIDATE);
+                      NULL, NULL, "interface.rng", validate);
     if (!xml)
         return NULL;
 
index b8450b75a96dd83955dd89314f3ef7b99ae2e96c..b1d77a80c3bfa6e7c9e98aa24a280562694f5003 100644 (file)
@@ -2036,7 +2036,7 @@ virNetworkDefParse(const char *xmlStr,
     int keepBlanksDefault = xmlKeepBlanksDefault(0);
 
     if ((xml = virXMLParse(filename, xmlStr, _("(network_definition)"),
-                           "network.rng", validate)))
+                           NULL, NULL, "network.rng", validate)))
         def = virNetworkDefParseNode(xml, xmlDocGetRootElement(xml), xmlopt);
 
     xmlKeepBlanksDefault(keepBlanksDefault);
index d5bfc098b2113c159d6e5512e8703116efeb153b..1db9a3240a14b9ff6d2ddae636c2dd662821510c 100644 (file)
@@ -2508,7 +2508,8 @@ virNodeDeviceDefParse(const char *str,
     g_autoptr(xmlDoc) xml = NULL;
     g_autoptr(virNodeDeviceDef) def = NULL;
 
-    if (!(xml = virXMLParse(filename, str, _("(node_device_definition)"), NULL, false)) ||
+    if (!(xml = virXMLParse(filename, str, _("(node_device_definition)"),
+                            NULL, NULL, NULL, false)) ||
         !(def = virNodeDeviceDefParseNode(xml, xmlDocGetRootElement(xml),
                                           create, virt_type)))
         return NULL;
index b5fd26645713082270a476ca879eb30ff8a7d60a..44ea056823ea5d113aa2c490dc0879fa67f6e187 100644 (file)
@@ -2713,9 +2713,10 @@ virNWFilterDefParse(const char *xmlStr,
 {
     virNWFilterDef *def = NULL;
     g_autoptr(xmlDoc) xml = NULL;
+    bool validate = flags & VIR_NWFILTER_DEFINE_VALIDATE;
 
-    if ((xml = virXMLParse(filename, xmlStr, _("(nwfilter_definition)"), "nwfilter.rng",
-                           flags & VIR_NWFILTER_DEFINE_VALIDATE))) {
+    if ((xml = virXMLParse(filename, xmlStr, _("(nwfilter_definition)"),
+                           NULL, NULL, "nwfilter.rng", validate))) {
         def = virNWFilterDefParseNode(xml, xmlDocGetRootElement(xml));
     }
 
index 011fdaa12b1d01e7108a3ae6b0d29f9f29ba35d4..02c2e38964c1ab2f1e986f5dd09d905ff413f0da 100644 (file)
@@ -193,9 +193,10 @@ virSecretDefParse(const char *xmlStr,
 {
     g_autoptr(xmlDoc) xml = NULL;
     virSecretDef *ret = NULL;
+    bool validate = flags & VIR_SECRET_DEFINE_VALIDATE;
 
-    if ((xml = virXMLParse(filename, xmlStr, _("(definition_of_secret)"), "secret.rng",
-                           flags & VIR_SECRET_DEFINE_VALIDATE))) {
+    if ((xml = virXMLParse(filename, xmlStr, _("(definition_of_secret)"),
+                           NULL, NULL, "secret.rng", validate))) {
         ret = secretXMLParseNode(xml, xmlDocGetRootElement(xml));
     }
 
index ae635edd089266897c8ded05c8256966b89c68f6..a5974053f49c298a5260b354f8db0a531d0fd925 100644 (file)
@@ -421,9 +421,10 @@ virDomainSnapshotDefParseString(const char *xmlStr,
     virDomainSnapshotDef *ret = NULL;
     g_autoptr(xmlDoc) xml = NULL;
     int keepBlanksDefault = xmlKeepBlanksDefault(0);
+    bool validate = flags & VIR_DOMAIN_SNAPSHOT_PARSE_VALIDATE;
 
-    if ((xml = virXMLParse(NULL, xmlStr, _("(domain_snapshot)"), "domainsnapshot.rng",
-                           flags & VIR_DOMAIN_SNAPSHOT_PARSE_VALIDATE))) {
+    if ((xml = virXMLParse(NULL, xmlStr, _("(domain_snapshot)"),
+                           NULL, NULL, "domainsnapshot.rng", validate))) {
         xmlKeepBlanksDefault(keepBlanksDefault);
         ret = virDomainSnapshotDefParseNode(xml, xmlDocGetRootElement(xml),
                                             xmlopt, parseOpaque,
index 79f16aadf330925d234f3eea14a30b5fa81f660f..d7375a51603aefa01a10a01400671ecb6003b1a7 100644 (file)
@@ -1001,9 +1001,10 @@ virStoragePoolDefParse(const char *xmlStr,
 {
     virStoragePoolDef *ret = NULL;
     g_autoptr(xmlDoc) xml = NULL;
+    bool validate = flags & VIR_STORAGE_POOL_DEFINE_VALIDATE;
 
     if ((xml = virXMLParse(filename, xmlStr, _("(storage_pool_definition)"),
-                           "storagepool.rng", flags & VIR_STORAGE_POOL_DEFINE_VALIDATE))) {
+                           NULL, NULL, "storagepool.rng", validate))) {
         ret = virStoragePoolDefParseNode(xml, xmlDocGetRootElement(xml));
     }
 
@@ -1470,7 +1471,8 @@ virStorageVolDefParse(virStoragePoolDef *pool,
     virStorageVolDef *ret = NULL;
     g_autoptr(xmlDoc) xml = NULL;
 
-    if ((xml = virXMLParse(filename, xmlStr, _("(storage_volume_definition)"), NULL, false))) {
+    if ((xml = virXMLParse(filename, xmlStr, _("(storage_volume_definition)"),
+                           NULL, NULL, NULL, false))) {
         ret = virStorageVolDefParseNode(pool, xml, xmlDocGetRootElement(xml), flags);
     }
 
index 39fa895fae43ca2b67b8d5eaf731e89fc5846a91..40cadc4ae81d8a3c1e7de6e8df37fedaa55182ba 100644 (file)
@@ -279,10 +279,10 @@ virNetworkPortDefParse(const char *xmlStr,
 {
     virNetworkPortDef *def = NULL;
     g_autoptr(xmlDoc) xml = NULL;
+    bool validate = flags & VIR_NETWORK_PORT_CREATE_VALIDATE;
 
     if ((xml = virXMLParse(filename, xmlStr, _("(networkport_definition)"),
-                           "networkport.rng",
-                           flags & VIR_NETWORK_PORT_CREATE_VALIDATE))) {
+                           NULL, NULL, "networkport.rng", validate))) {
         def = virNetworkPortDefParseNode(xml, xmlDocGetRootElement(xml));
     }
 
index cc50ba944a26e860a407079e4427a81923596e14..e58bab3f08b9e795b70f455f83882ec24ea66b09 100644 (file)
@@ -182,10 +182,10 @@ virNWFilterBindingDefParse(const char *xmlStr,
 {
     virNWFilterBindingDef *def = NULL;
     g_autoptr(xmlDoc) xml = NULL;
+    bool validate = flags & VIR_NWFILTER_BINDING_CREATE_VALIDATE;
 
     if ((xml = virXMLParse(filename, xmlStr, _("(nwfilterbinding_definition)"),
-                           "nwfilterbinding.rng",
-                           flags & VIR_NWFILTER_BINDING_CREATE_VALIDATE))) {
+                           NULL, NULL, "nwfilterbinding.rng", validate))) {
         def = virNWFilterBindingDefParseNode(xml, xmlDocGetRootElement(xml));
     }
 
index 47455c7e350fd5dbcdb2186fcf792b24d3c1a12e..cc6009d1f2b72915fee4fef6d75667771293051c 100644 (file)
@@ -257,7 +257,8 @@ virNWFilterBindingObjParse(const char *xmlStr,
     virNWFilterBindingObj *obj = NULL;
     g_autoptr(xmlDoc) xml = NULL;
 
-    if ((xml = virXMLParse(filename, xmlStr, _("(nwfilterbinding_status)"), NULL, false))) {
+    if ((xml = virXMLParse(filename, xmlStr, _("(nwfilterbinding_status)"),
+                           NULL, NULL, NULL, false))) {
         obj = virNWFilterBindingObjParseNode(xml, xmlDocGetRootElement(xml));
     }
 
index 686ff051a8f1d158cfdec6d8e9d0a11b06ba1a6d..1c101245641d80124898700aecd83521f8fae330 100644 (file)
@@ -851,7 +851,7 @@ testParseXMLDocFromFile(xmlNodePtr node, const char *file, const char *type)
     if ((relFile = virXMLPropString(node, "file"))) {
         absFile = testBuildFilename(file, relFile);
 
-        if (!(doc = virXMLParse(absFile, NULL, type, NULL, false)))
+        if (!(doc = virXMLParse(absFile, NULL, type, NULL, NULL, NULL, false)))
             return NULL;
 
         ret = xmlCopyNode(xmlDocGetRootElement(doc), 1);
index 65db46ca98abf10a10dcbb9372f4f04bfd24555f..0a5759fd45836a7b2408fe4344118b04dbf3c728 100644 (file)
@@ -204,13 +204,17 @@ virXMLPickShellSafeComment(const char *str1,
  * @filename: file to parse, or NULL for string parsing
  * @xmlStr: if @filename is NULL, a string to parse
  * @url: if @filename is NULL, an optional filename to attribute the parse to
+ * @rootelement: if non-NULL, validate that the root element name equals to this parameter
+ * @ctxt: if non-NULL, filled with a new XPath context including populating the root node
+ * @schemafile: name of the appropriate schema file for the parsed XML for validation (may be NULL)
+ * @validate: if true and @schemafile is non-NULL, validate the XML against @schemafile
  *
  * Parse xml from either a file or a string.
  *
  * Return the parsed document object, or NULL on failure.
  */
-#define virXMLParse(filename, xmlStr, url, schemafile, validate) \
-    virXMLParseHelper(VIR_FROM_THIS, filename, xmlStr, url, NULL, NULL, schemafile, validate)
+#define virXMLParse(filename, xmlStr, url, rootelement, ctxt, schemafile, validate) \
+    virXMLParseHelper(VIR_FROM_THIS, filename, xmlStr, url, rootelement, ctxt, schemafile, validate)
 
 /**
  * virXMLParseString:
index 90afac179eb46a04783c11e1a040d7aa63391315..6dce9cdf0fbcc3c698206c5c620909916ddffdaf 100644 (file)
@@ -584,7 +584,7 @@ virVBoxSnapshotConfLoadVboxFile(const char *filePath,
 
     machineDescription = g_new0(virVBoxSnapshotConfMachine, 1);
 
-    xml = virXMLParse(filePath, NULL, NULL, NULL, false);
+    xml = virXMLParse(filePath, NULL, NULL, NULL, NULL, NULL, false);
     if (xml == NULL) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("Unable to parse the xml"));
@@ -1214,7 +1214,7 @@ virVBoxSnapshotConfGetRWDisksPathsFromLibvirtXML(const char *filePath,
                        _("filePath is null"));
         goto cleanup;
     }
-    xml = virXMLParse(filePath, NULL, NULL, NULL, false);
+    xml = virXMLParse(filePath, NULL, NULL, NULL, NULL, NULL, false);
     if (xml == NULL) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("Unable to parse the xml"));
@@ -1271,7 +1271,7 @@ virVBoxSnapshotConfGetRODisksPathsFromLibvirtXML(const char *filePath,
                        _("filePath is null"));
         goto cleanup;
     }
-    xml = virXMLParse(filePath, NULL, NULL, NULL, false);
+    xml = virXMLParse(filePath, NULL, NULL, NULL, NULL, NULL, false);
     if (xml == NULL) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("Unable to parse the xml"));
index ecf610d7dbe9f1ab084077446277028a32873b8b..8fb7a9948d01cb5b3dd55a1c723fe98cfef63f42 100644 (file)
@@ -4581,7 +4581,8 @@ prlsdkParseSnapshotTree(const char *treexml)
     if (*treexml == '\0')
         return snapshots;
 
-    if (!(xml = virXMLParse(NULL, treexml, _("(snapshot_tree)"), NULL, false)))
+    if (!(xml = virXMLParse(NULL, treexml, _("(snapshot_tree)"),
+                            NULL, NULL, NULL, false)))
         goto cleanup;
 
     root = xmlDocGetRootElement(xml);
index b96ec69fa736bf113738dd9895242b9ff04e0b25..825273c8c6ac5c05ca25f22cbc273aaf14510f06 100644 (file)
@@ -672,7 +672,8 @@ testCompareXMLToArgv(const void *data)
     if (testCheckExclusiveFlags(info->flags) < 0)
         goto cleanup;
 
-    if (!(xml = virXMLParse(info->infile, NULL, "(domain_definition)", NULL, false)))
+    if (!(xml = virXMLParse(info->infile, NULL, "(domain_definition)",
+                            NULL, NULL, NULL, false)))
         goto cleanup;
 
     root = xmlDocGetRootElement(xml);