libhydra can be initialized more than once

This commit is contained in:
Martin Willi
2012-11-14 10:14:34 +01:00
parent 1e5e1fb685
commit 8edb6248f8
2 changed files with 30 additions and 3 deletions
+27 -3
View File
@@ -28,12 +28,22 @@ struct private_hydra_t {
* Public members of hydra_t.
*/
hydra_t public;
/**
* Integrity check failed?
*/
bool integrity_failed;
/**
* Number of times we have been initialized
*/
refcount_t ref;
};
/**
* Single instance of hydra_t.
*/
hydra_t *hydra;
hydra_t *hydra = NULL;
/**
* Described in header.
@@ -41,6 +51,12 @@ hydra_t *hydra;
void libhydra_deinit()
{
private_hydra_t *this = (private_hydra_t*)hydra;
if (!this || !ref_put(&this->ref))
{ /* have more users */
return;
}
this->public.attributes->destroy(this->public.attributes);
this->public.kernel_interface->destroy(this->public.kernel_interface);
free((void*)this->public.daemon);
@@ -55,11 +71,19 @@ bool libhydra_init(const char *daemon)
{
private_hydra_t *this;
if (hydra)
{ /* already initialized, increase refcount */
this = (private_hydra_t*)hydra;
ref_get(&this->ref);
return !this->integrity_failed;
}
INIT(this,
.public = {
.attributes = attribute_manager_create(),
.daemon = strdup(daemon ?: "libhydra"),
},
.ref = 1,
);
hydra = &this->public;
@@ -69,8 +93,8 @@ bool libhydra_init(const char *daemon)
!lib->integrity->check(lib->integrity, "libhydra", libhydra_init))
{
DBG1(DBG_LIB, "integrity check of libhydra failed");
return FALSE;
this->integrity_failed = TRUE;
}
return TRUE;
return !this->integrity_failed;
}
+3
View File
@@ -72,6 +72,9 @@ extern hydra_t *hydra;
*
* The daemon's name is used to load daemon-specific settings.
*
* libhydra_init() may be called multiple times in a single process, but each
* caller should call libhydra_deinit() for each call to libhydra_init().
*
* @param daemon name of the daemon that initializes the library
* @return FALSE if integrity check failed
*/