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.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/Makefile.am | 3 +-
src/conf/virsecretobj.c | 138 +++++++++++++++++++++++++++++++++++++++++++++
src/conf/virsecretobj.h | 49 ++++++++++++++++
src/secret/secret_driver.c | 12 +---
4 files changed, 190 insertions(+), 12 deletions(-)
create mode 100644 src/conf/virsecretobj.c
create mode 100644 src/conf/virsecretobj.h
diff --git a/src/Makefile.am b/src/Makefile.am
index ad1c0c3..b31f363 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -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
index 0000000..905e138
--- /dev/null
+++ b/src/conf/virsecretobj.c
@@ -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
index 0000000..3fc0844
--- /dev/null
+++ b/src/conf/virsecretobj.h
@@ -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__ */
diff --git a/src/secret/secret_driver.c b/src/secret/secret_driver.c
index 4d15797..9165a9f 100644
--- a/src/secret/secret_driver.c
+++ b/src/secret/secret_driver.c
@@ -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 {
--
2.5.5