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@xxxxxxxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list