[libvirt] [PATCH v2 08/25] backup: Parse and output backup XML
Ján Tomko
jtomko at redhat.com
Mon Dec 9 15:21:02 UTC 2019
On Tue, Dec 03, 2019 at 06:17:30PM +0100, Peter Krempa wrote:
>From: Eric Blake <eblake at redhat.com>
>
>Accept XML describing a generic block job, and output it again as
>needed.
>This may still need a few tweaks to match the documented XML
>and RNG schema.
>
A leftover from earlier versions? This essentially says: there might be
bugs
>Signed-off-by: Eric Blake <eblake at redhat.com>
>---
> po/POTFILES.in | 1 +
> src/conf/Makefile.inc.am | 2 +
> src/conf/backup_conf.c | 499 +++++++++++++++++++++++++++++++++++++++
> src/conf/backup_conf.h | 101 ++++++++
> src/conf/virconftypes.h | 3 +
> src/libvirt_private.syms | 8 +
> 6 files changed, 614 insertions(+)
> create mode 100644 src/conf/backup_conf.c
> create mode 100644 src/conf/backup_conf.h
[...]
>+static int
>+virDomainBackupDiskDefParseXML(xmlNodePtr node,
>+ xmlXPathContextPtr ctxt,
>+ virDomainBackupDiskDefPtr def,
>+ bool push,
>+ unsigned int flags,
>+ virDomainXMLOptionPtr xmlopt)
>+{
>+ VIR_XPATH_NODE_AUTORESTORE(ctxt);
>+ g_autofree char *type = NULL;
>+ g_autofree char *driver = NULL;
>+ g_autofree char *backup = NULL;
>+ g_autofree char *state = NULL;
>+ int tmp;
>+ xmlNodePtr srcNode;
>+ unsigned int storageSourceParseFlags = 0;
>+ bool internal = flags & VIR_DOMAIN_BACKUP_PARSE_INTERNAL;
>+
>+ if (internal)
>+ storageSourceParseFlags = VIR_DOMAIN_DEF_PARSE_STATUS;
>+
>+ ctxt->node = node;
>+
>+ if (!(def->name = virXMLPropString(node, "name"))) {
>+ virReportError(VIR_ERR_XML_ERROR, "%s",
>+ _("missing name from disk backup element"));
>+ return -1;
>+ }
>+
>+ def->backup = VIR_TRISTATE_BOOL_YES;
>+
>+ if ((backup = virXMLPropString(node, "backup"))) {
>+ if ((tmp = virTristateBoolTypeFromString(backup)) <= 0) {
>+ virReportError(VIR_ERR_XML_ERROR,
>+ _("invalid disk 'backup' state '%s'"), backup);
>+ return -1;
>+ }
>+
>+ def->backup = tmp;
>+ }
>+
>+ /* don't parse anything else if backup is disabled */
>+ if (def->backup == VIR_TRISTATE_BOOL_NO)
>+ return 0;
>+
>+ if (internal) {
>+ tmp = 0;
This should not be necessary - either the condition below returns, or
tmp gets overwritten.
>+ if (!(state = virXMLPropString(node, "state")) ||
>+ (tmp = virDomainBackupDiskStateTypeFromString(state)) < 0) {
>+ virReportError(VIR_ERR_INTERNAL_ERROR,
>+ _("disk '%s' backup state wrong or missing'"), def->name);
>+ return -1;
>+ }
>+
>+ def->state = tmp;
>+ }
>+
>+ if (!(def->store = virStorageSourceNew()))
>+ return -1;
>+
>+ if ((type = virXMLPropString(node, "type"))) {
>+ if ((def->store->type = virStorageTypeFromString(type)) <= 0 ||
>+ def->store->type == VIR_STORAGE_TYPE_VOLUME ||
>+ def->store->type == VIR_STORAGE_TYPE_DIR) {
The schema whitelists file and block, while a blacklist is used here.
>+ virReportError(VIR_ERR_XML_ERROR,
>+ _("unknown disk backup type '%s'"), type);
Also, technically they are known, just unsupported.
>+ return -1;
>+ }
>+ } else {
>+ def->store->type = VIR_STORAGE_TYPE_FILE;
>+ }
>+
>+ if (push)
>+ srcNode = virXPathNode("./target", ctxt);
>+ else
>+ srcNode = virXPathNode("./scratch", ctxt);
>+
>+ if (srcNode &&
>+ virDomainStorageSourceParse(srcNode, ctxt, def->store,
>+ storageSourceParseFlags, xmlopt) < 0)
>+ return -1;
>+
If you make sure that this does not accept unwanted types:
Reviewed-by: Ján Tomko <jtomko at redhat.com>
Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20191209/971cf26b/attachment-0001.sig>
More information about the libvir-list
mailing list