]> xenbits.xensource.com Git - libvirt.git/commitdiff
secret: Introduce secretAssignDef
authorJohn Ferlan <jferlan@redhat.com>
Wed, 24 Feb 2016 15:52:30 +0000 (10:52 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Tue, 1 Mar 2016 11:44:34 +0000 (06:44 -0500)
This new API will allocate the secret, assign the def pointer, and
insert the secret onto the passed list. Whether that's the temporary
list in loadSecrets which gets loaded into the driver list or driver
list during secretDefineXML.

Signed-off-by: John Ferlan <jferlan@redhat.com>
src/secret/secret_driver.c

index dd8062f6e339f3f21a5db65846eca39546082b8f..0b374c16b0a870d6492fc6ce0099b5d7ab41206d 100644 (file)
@@ -168,6 +168,22 @@ secretFindByUsage(int usageType,
     return NULL;
 }
 
+
+static virSecretObjPtr
+secretAssignDef(virSecretObjPtr *list,
+                virSecretDefPtr def)
+{
+    virSecretObjPtr secret;
+
+    if (VIR_ALLOC(secret) < 0)
+        return NULL;
+
+    listInsert(list, secret);
+    secret->def = def;
+
+    return secret;
+}
+
 /* Permament secret storage */
 
 /* Secrets are stored in virSecretDriverStatePtr->configDir.  Each secret
@@ -374,7 +390,8 @@ listUnlinkSecret(virSecretObjPtr *pptr,
 
 
 static virSecretObjPtr
-secretLoad(const char *file,
+secretLoad(virSecretObjPtr *list,
+           const char *file,
            const char *path,
            const char *base64path)
 {
@@ -387,9 +404,8 @@ secretLoad(const char *file,
     if (secretLoadValidateUUID(def, file) < 0)
         goto cleanup;
 
-    if (VIR_ALLOC(secret) < 0)
+    if (!(secret = secretAssignDef(list, def)))
         goto cleanup;
-    secret->def = def;
     def = NULL;
 
     if (VIR_STRDUP(secret->configFile, path) < 0)
@@ -405,6 +421,7 @@ secretLoad(const char *file,
     secret = NULL;
 
  cleanup:
+    listUnlinkSecret(list, secret);
     secretFree(secret);
     virSecretDefFree(def);
     return ret;
@@ -449,7 +466,7 @@ loadSecrets(virSecretObjPtr *dest)
         }
         VIR_FREE(base64name);
 
-        if (!(secret = secretLoad(de->d_name, path, base64path))) {
+        if (!(secret = secretLoad(&list, de->d_name, path, base64path))) {
             virErrorPtr err = virGetLastError();
 
             VIR_ERROR(_("Error reading secret: %s"),
@@ -462,7 +479,6 @@ loadSecrets(virSecretObjPtr *dest)
 
         VIR_FREE(path);
         VIR_FREE(base64path);
-        listInsert(&list, secret);
     }
     /* Ignore error reported by readdir, if any.  It's better to keep the
        secrets we managed to find. */
@@ -712,7 +728,7 @@ secretDefineXML(virConnectPtr conn,
                 unsigned int flags)
 {
     virSecretPtr ret = NULL;
-    virSecretObjPtr secret;
+    virSecretObjPtr secret = NULL;
     virSecretDefPtr backup = NULL;
     virSecretDefPtr new_attrs;
 
@@ -742,7 +758,7 @@ secretDefineXML(virConnectPtr conn,
         }
 
         /* No existing secret at all, create one */
-        if (VIR_ALLOC(secret) < 0)
+        if (!(secret = secretAssignDef(&driver->secrets, new_attrs)))
             goto cleanup;
 
         virUUIDFormat(secret->def->uuid, uuidstr);
@@ -761,9 +777,6 @@ secretDefineXML(virConnectPtr conn,
             secretFree(secret);
             goto cleanup;
         }
-
-        listInsert(&driver->secrets, secret);
-        secret->def = new_attrs;
     } else {
         const char *newUsageID = secretUsageIDForDef(new_attrs);
         const char *oldUsageID = secretUsageIDForDef(secret->def);