Move to virsecret.c and rename to virSecretParseSecret. Also convert to
usage xmlNodePtr and virXMLPropString rather than virXPathString.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
po/POTFILES.in | 1 +
src/libvirt_private.syms | 1 +
src/util/virsecret.c | 44 +++++++++++++++++++++++++++++
src/util/virsecret.h | 5 +++-
src/util/virstoragefile.c | 71 ++++++++++++-----------------------------------
5 files changed, 67 insertions(+), 55 deletions(-)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 822cfbc..67838f5 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -233,6 +233,7 @@ src/util/virqemu.c
src/util/virrandom.c
src/util/virrotatingfile.c
src/util/virscsi.c
+src/util/virsecret.c
src/util/virsexpr.c
src/util/virsocketaddr.c
src/util/virstats.c
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 8664e05..d06e754 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2213,6 +2213,7 @@ virSecurityLabelDefNew;
# util/virsecret.h
virSecretLookupDefClear;
virSecretLookupDefCopy;
+virSecretParseSecretLookup;
# util/virsexpr.h
diff --git a/src/util/virsecret.c b/src/util/virsecret.c
index 45ad996..a4eb22f 100644
--- a/src/util/virsecret.c
+++ b/src/util/virsecret.c
@@ -26,6 +26,7 @@
#include "virlog.h"
#include "virsecret.h"
#include "virstring.h"
+#include "viruuid.h"
#define VIR_FROM_THIS VIR_FROM_NONE
@@ -55,3 +56,46 @@ virSecretLookupDefCopy(virSecretLookupTypeDefPtr dst,
}
return 0;
}
+
+
+int
+virSecretParseSecretLookup(xmlNodePtr secretnode,
+ virSecretLookupTypeDefPtr def)
+{
+ char *uuid;
+ char *usage;
+ int ret = -1;
+
+ uuid = virXMLPropString(secretnode, "uuid");
+ usage = virXMLPropString(secretnode, "usage");
+ if (uuid == NULL && usage == NULL) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("missing secret uuid or usage attribute"));
+ goto cleanup;
+ }
+
+ if (uuid && usage) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("either secret uuid or usage expected"));
+ goto cleanup;
+ }
+
+ if (uuid) {
+ if (virUUIDParse(uuid, def->u.uuid) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("invalid secret uuid '%s'"), uuid);
+ goto cleanup;
+ }
+ def->type = VIR_SECRET_LOOKUP_TYPE_UUID;
+ } else {
+ def->u.usage = usage;
+ usage = NULL;
+ def->type = VIR_SECRET_LOOKUP_TYPE_USAGE;
+ }
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(uuid);
+ VIR_FREE(usage);
+ return ret;
+}
diff --git a/src/util/virsecret.h b/src/util/virsecret.h
index fb3adb3..3c22be3 100644
--- a/src/util/virsecret.h
+++ b/src/util/virsecret.h
@@ -24,6 +24,8 @@
# include "internal.h"
+# include "virxml.h"
+
typedef enum {
VIR_SECRET_LOOKUP_TYPE_NONE,
VIR_SECRET_LOOKUP_TYPE_UUID,
@@ -46,5 +48,6 @@ struct _virSecretLookupTypeDef {
void virSecretLookupDefClear(virSecretLookupTypeDefPtr def);
int virSecretLookupDefCopy(virSecretLookupTypeDefPtr dst,
const virSecretLookupTypeDef *src);
-
+int virSecretParseSecretLookup(xmlNodePtr secretnode,
+ virSecretLookupTypeDefPtr def);
#endif /* __VIR_SECRET_H__ */
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index 27b54a2..963318f 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -1537,62 +1537,11 @@ virStorageAuthDefCopy(const virStorageAuthDef *src)
}
-static int
-virStorageAuthDefParseSecret(xmlXPathContextPtr ctxt,
- virStorageAuthDefPtr authdef)
-{
- char *uuid;
- char *usage;
- int ret = -1;
-
- /* Used by the domain disk xml parsing in order to ensure the
- * <secret type='%s' value matches the expected secret type for
- * the style of disk (iscsi is chap, nbd is ceph). For some reason
- * the virSecretUsageType{From|To}String() cannot be linked here
- * and because only the domain parsing code cares - just keep
- * it as a string.
- */
- authdef->secrettype = virXPathString("string(./secret/@type)", ctxt);
-
- uuid = virXPathString("string(./secret/@uuid)", ctxt);
- usage = virXPathString("string(./secret/@usage)", ctxt);
- if (uuid == NULL && usage == NULL) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("missing auth secret uuid or usage attribute"));
- goto cleanup;
- }
-
- if (uuid && usage) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("either auth secret uuid or usage expected"));
- goto cleanup;
- }
-
- if (uuid) {
- if (virUUIDParse(uuid, authdef->seclookupdef.u.uuid) < 0) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("invalid auth secret uuid"));
- goto cleanup;
- }
- authdef->seclookupdef.type = VIR_SECRET_LOOKUP_TYPE_UUID;
- } else {
- authdef->seclookupdef.u.usage = usage;
- usage = NULL;
- authdef->seclookupdef.type = VIR_SECRET_LOOKUP_TYPE_USAGE;
- }
- ret = 0;
-
- cleanup:
- VIR_FREE(uuid);
- VIR_FREE(usage);
- return ret;
-}
-
-
static virStorageAuthDefPtr
virStorageAuthDefParseXML(xmlXPathContextPtr ctxt)
{
virStorageAuthDefPtr authdef = NULL;
+ xmlNodePtr secretnode = NULL;
char *username = NULL;
char *authtype = NULL;
@@ -1621,8 +1570,22 @@ virStorageAuthDefParseXML(xmlXPathContextPtr ctxt)
VIR_FREE(authtype);
}
- authdef->seclookupdef.type = VIR_SECRET_LOOKUP_TYPE_NONE;
- if (virStorageAuthDefParseSecret(ctxt, authdef) < 0)
+ if (!(secretnode = virXPathNode("./secret ", ctxt))) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("Missing <secret> element in auth"));
+ goto error;
+ }
+
+ /* Used by the domain disk xml parsing in order to ensure the
+ * <secret type='%s' value matches the expected secret type for
+ * the style of disk (iscsi is chap, nbd is ceph). For some reason
+ * the virSecretUsageType{From|To}String() cannot be linked here
+ * and because only the domain parsing code cares - just keep
+ * it as a string.
+ */
+ authdef->secrettype = virXMLPropString(secretnode, "type");
+
+ if (virSecretParseSecretLookup(secretnode, &authdef->seclookupdef) < 0)
goto error;
return authdef;
--
2.5.5