]> xenbits.xensource.com Git - libvirt.git/commitdiff
secret: Create virsecretobj.c and virsecretconf.h
authorJohn Ferlan <jferlan@redhat.com>
Sat, 27 Feb 2016 11:49:12 +0000 (06:49 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Mon, 25 Apr 2016 19:45:29 +0000 (15:45 -0400)
Move virSecretObj from secret_driver.c to virsecretobj.h

To support being able to create a hashed secrets list, move the
virSecretObj to virsecretobj.h so that the code can at least find
the definition.

This should be a temporary situation while the virsecretobj.c code
is patched in order to support a hashed secret object while still
having the linked list support in secret_driver.c. Eventually, the
goal is to move the virSecretObj into virsecretobj.c, although it
is notable that the existing model from which virSecretObj was
derived has virDomainObj in src/conf/domain_conf.h and virNetworkObj
in src/conf/network_conf.h, so virSecretObj wouldn't be unique if
it were to remain in virsecretobj.h  Still adding accessors to fetch
and store hashed object data will be the end goal.

Add definitions and infrastucture in virsecretobj.c to create and
handle a hashed virSecretObj and virSecretObjList including the class,
object, lock setup, and disposal API's. Nothing will call these yet.

This infrastructure will replace the forward linked list logic
within the secret_driver, eventually.

src/Makefile.am
src/conf/virsecretobj.c [new file with mode: 0644]
src/conf/virsecretobj.h [new file with mode: 0644]
src/secret/secret_driver.c

index d0d1f41db8051f9ab481b7863c802529e1870d87..314f6df960426fb855087d49e60f34f6dfb4a2f2 100644 (file)
@@ -365,7 +365,8 @@ INTERFACE_CONF_SOURCES =                                       \
 
 # Secret driver generic impl APIs
 SECRET_CONF_SOURCES =                                          \
-               conf/secret_conf.h conf/secret_conf.c
+               conf/secret_conf.h conf/secret_conf.c          \
+               conf/virsecretobj.h conf/virsecretobj.c
 
 # Network driver generic impl APIs
 NODE_DEVICE_CONF_SOURCES =                                     \
diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c
new file mode 100644 (file)
index 0000000..905e138
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * virsecretobj.c: internal <secret> objects handling
+ *
+ * Copyright (C) 2009-2016 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include "datatypes.h"
+#include "virsecretobj.h"
+#include "viralloc.h"
+#include "virhash.h"
+
+
+static virClassPtr virSecretObjClass;
+static virClassPtr virSecretObjListClass;
+static void virSecretObjDispose(void *obj);
+static void virSecretObjListDispose(void *obj);
+
+struct _virSecretObjList {
+    virObjectLockable parent;
+
+    /* uuid string -> virSecretObj  mapping
+     * for O(1), lockless lookup-by-uuid */
+    virHashTable *objs;
+};
+
+struct virSecretSearchData {
+    int usageType;
+    const char *usageID;
+};
+
+
+static int
+virSecretObjOnceInit(void)
+{
+    if (!(virSecretObjClass = virClassNew(virClassForObjectLockable(),
+                                          "virSecretObj",
+                                          sizeof(virSecretObj),
+                                          virSecretObjDispose)))
+        return -1;
+
+    if (!(virSecretObjListClass = virClassNew(virClassForObjectLockable(),
+                                              "virSecretObjList",
+                                              sizeof(virSecretObjList),
+                                              virSecretObjListDispose)))
+        return -1;
+
+    return 0;
+}
+
+
+VIR_ONCE_GLOBAL_INIT(virSecretObj)
+
+virSecretObjPtr
+virSecretObjNew(void)
+{
+    virSecretObjPtr secret;
+
+    if (virSecretObjInitialize() < 0)
+        return NULL;
+
+    if (!(secret = virObjectLockableNew(virSecretObjClass)))
+        return NULL;
+
+    return secret;
+}
+
+
+void
+virSecretObjEndAPI(virSecretObjPtr *secret)
+{
+    if (!*secret)
+        return;
+
+    virObjectUnlock(*secret);
+    virObjectUnref(*secret);
+    *secret = NULL;
+}
+
+
+virSecretObjListPtr
+virSecretObjListNew(void)
+{
+    virSecretObjListPtr secrets;
+
+    if (virSecretObjInitialize() < 0)
+        return NULL;
+
+    if (!(secrets = virObjectLockableNew(virSecretObjListClass)))
+        return NULL;
+
+    if (!(secrets->objs = virHashCreate(50, virObjectFreeHashData))) {
+        virObjectUnref(secrets);
+        return NULL;
+    }
+
+    return secrets;
+}
+
+
+static void
+virSecretObjDispose(void *obj)
+{
+    virSecretObjPtr secret = obj;
+
+    virSecretDefFree(secret->def);
+    if (secret->value) {
+        /* Wipe before free to ensure we don't leave a secret on the heap */
+        memset(secret->value, 0, secret->value_size);
+        VIR_FREE(secret->value);
+    }
+    VIR_FREE(secret->configFile);
+    VIR_FREE(secret->base64File);
+}
+
+
+static void
+virSecretObjListDispose(void *obj)
+{
+    virSecretObjListPtr secrets = obj;
+
+    virHashFree(secrets->objs);
+}
diff --git a/src/conf/virsecretobj.h b/src/conf/virsecretobj.h
new file mode 100644 (file)
index 0000000..3fc0844
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * virsecretobj.h: internal <secret> objects handling
+ *
+ * Copyright (C) 2009-2010, 2013-2014, 2016 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __VIRSECRETOBJ_H__
+# define __VIRSECRETOBJ_H__
+
+# include "internal.h"
+
+# include "secret_conf.h"
+
+typedef struct _virSecretObj virSecretObj;
+typedef virSecretObj *virSecretObjPtr;
+struct _virSecretObj {
+    virSecretObjPtr next;
+    char *configFile;
+    char *base64File;
+    virSecretDefPtr def;
+    unsigned char *value;       /* May be NULL */
+    size_t value_size;
+};
+
+
+virSecretObjPtr virSecretObjNew(void);
+
+void virSecretObjEndAPI(virSecretObjPtr *secret);
+
+typedef struct _virSecretObjList virSecretObjList;
+typedef virSecretObjList *virSecretObjListPtr;
+
+virSecretObjListPtr virSecretObjListNew(void);
+
+#endif /* __VIRSECRETOBJ_H__ */
index 4d157973d4df0bbb1406b4b3752134e0bb028cce..9165a9f23d67cae67d78de44f85d561bc41980be 100644 (file)
@@ -35,6 +35,7 @@
 #include "virlog.h"
 #include "viralloc.h"
 #include "secret_conf.h"
+#include "virsecretobj.h"
 #include "secret_driver.h"
 #include "virthread.h"
 #include "viruuid.h"
@@ -52,17 +53,6 @@ enum { SECRET_MAX_XML_FILE = 10*1024*1024 };
 
 /* Internal driver state */
 
-typedef struct _virSecretObj virSecretObj;
-typedef virSecretObj *virSecretObjPtr;
-struct _virSecretObj {
-    virSecretObjPtr next;
-    char *configFile;
-    char *base64File;
-    virSecretDefPtr def;
-    unsigned char *value;       /* May be NULL */
-    size_t value_size;
-};
-
 typedef struct _virSecretDriverState virSecretDriverState;
 typedef virSecretDriverState *virSecretDriverStatePtr;
 struct _virSecretDriverState {