libcharon can be initialized more than once

This commit is contained in:
Martin Willi
2012-11-14 10:14:37 +01:00
parent 8edb6248f8
commit de4c1def83
2 changed files with 34 additions and 5 deletions
+31 -5
View File
@@ -71,6 +71,16 @@ struct private_daemon_t {
* Mutex for configured loggers * Mutex for configured loggers
*/ */
mutex_t *mutex; mutex_t *mutex;
/**
* Integrity check failed?
*/
bool integrity_failed;
/**
* Number of times we have been initialized
*/
refcount_t ref;
}; };
/** /**
@@ -570,6 +580,7 @@ private_daemon_t *daemon_create(const char *name)
}, },
.loggers = linked_list_create(), .loggers = linked_list_create(),
.mutex = mutex_create(MUTEX_TYPE_DEFAULT), .mutex = mutex_create(MUTEX_TYPE_DEFAULT),
.ref = 1,
); );
charon = &this->public; charon = &this->public;
this->public.caps = capabilities_create(); this->public.caps = capabilities_create();
@@ -592,7 +603,14 @@ private_daemon_t *daemon_create(const char *name)
*/ */
void libcharon_deinit() void libcharon_deinit()
{ {
destroy((private_daemon_t*)charon); private_daemon_t *this = (private_daemon_t*)charon;
if (!this || !ref_put(&this->ref))
{ /* have more users */
return;
}
destroy(this);
charon = NULL; charon = NULL;
} }
@@ -601,7 +619,16 @@ void libcharon_deinit()
*/ */
bool libcharon_init(const char *name) bool libcharon_init(const char *name)
{ {
daemon_create(name); private_daemon_t *this;
if (charon)
{ /* already initialized, increase refcount */
this = (private_daemon_t*)charon;
ref_get(&this->ref);
return !this->integrity_failed;
}
this = daemon_create(name);
/* for uncritical pseudo random numbers */ /* for uncritical pseudo random numbers */
srandom(time(NULL) + getpid()); srandom(time(NULL) + getpid());
@@ -619,8 +646,7 @@ bool libcharon_init(const char *name)
!lib->integrity->check(lib->integrity, "libcharon", libcharon_init)) !lib->integrity->check(lib->integrity, "libcharon", libcharon_init))
{ {
dbg(DBG_DMN, 1, "integrity check of libcharon failed"); dbg(DBG_DMN, 1, "integrity check of libcharon failed");
return FALSE; this->integrity_failed = TRUE;
} }
return !this->integrity_failed;
return TRUE;
} }
+3
View File
@@ -329,6 +329,9 @@ extern daemon_t *charon;
* This function initializes the bus, listeners can be registered before * This function initializes the bus, listeners can be registered before
* calling initialize(). * calling initialize().
* *
* libcharon_init() may be called multiple times in a single process, but each
* caller should call libcharon_deinit() for each call to libcharon_init().
*
* @param name name of the binary that uses the library * @param name name of the binary that uses the library
* @return FALSE if integrity check failed * @return FALSE if integrity check failed
*/ */