aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2012-10-25 14:33:09 +0200
committerMartin Willi <martin@revosec.ch>2012-11-14 10:14:31 +0100
commit1e5e1fb6851962aaebd7a2fb3ceb928a8993b717 (patch)
tree6c7146557625e3b62ba136a116972004b16e3723
parentcbd52e7ddc368dbbc88d236c3f2ce856ce96a6b3 (diff)
downloadstrongswan-1e5e1fb6851962aaebd7a2fb3ceb928a8993b717.tar.bz2
strongswan-1e5e1fb6851962aaebd7a2fb3ceb928a8993b717.tar.xz
libstrongswan can be initialized more than once
-rw-r--r--src/libstrongswan/library.c31
-rw-r--r--src/libstrongswan/library.h3
2 files changed, 30 insertions, 4 deletions
diff --git a/src/libstrongswan/library.c b/src/libstrongswan/library.c
index 2a8dda7e1..30a7774df 100644
--- a/src/libstrongswan/library.c
+++ b/src/libstrongswan/library.c
@@ -44,12 +44,22 @@ struct private_library_t {
* Hashtable with registered objects (name => object)
*/
hashtable_t *objects;
+
+ /**
+ * Integrity check failed?
+ */
+ bool integrity_failed;
+
+ /**
+ * Number of times we have been initialized
+ */
+ refcount_t ref;
};
/**
* library instance
*/
-library_t *lib;
+library_t *lib = NULL;
/**
* Deinitialize library
@@ -59,6 +69,11 @@ void library_deinit()
private_library_t *this = (private_library_t*)lib;
bool detailed;
+ if (!this || !ref_put(&this->ref))
+ { /* have more users */
+ return;
+ }
+
detailed = lib->settings->get_bool(lib->settings,
"libstrongswan.leak_detective.detailed", TRUE);
@@ -142,11 +157,19 @@ bool library_init(char *settings)
private_library_t *this;
printf_hook_t *pfh;
+ if (lib)
+ { /* already initialized, increase refcount */
+ this = (private_library_t*)lib;
+ ref_get(&this->ref);
+ return !this->integrity_failed;
+ }
+
INIT(this,
.public = {
.get = _get,
.set = _set,
},
+ .ref = 1,
);
lib = &this->public;
@@ -204,14 +227,14 @@ bool library_init(char *settings)
if (!lib->integrity->check(lib->integrity, "libstrongswan", library_init))
{
DBG1(DBG_LIB, "integrity check of libstrongswan failed");
- return FALSE;
+ this->integrity_failed = TRUE;
}
#else /* !INTEGRITY_TEST */
DBG1(DBG_LIB, "integrity test enabled, but not supported");
- return FALSE;
+ this->integrity_failed = TRUE;
#endif /* INTEGRITY_TEST */
}
- return TRUE;
+ return !this->integrity_failed;
}
diff --git a/src/libstrongswan/library.h b/src/libstrongswan/library.h
index 43c6b33d3..6f455a617 100644
--- a/src/libstrongswan/library.h
+++ b/src/libstrongswan/library.h
@@ -202,6 +202,9 @@ struct library_t {
/**
* Initialize library, creates "lib" instance.
*
+ * library_init() may be called multiple times in a single process, but each
+ * caller should call library_deinit() for each call to library_init().
+ *
* @param settings file to read settings from, may be NULL for default
* @return FALSE if integrity check failed
*/