]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
libcharon can be initialized more than once
authorMartin Willi <martin@revosec.ch>
Thu, 25 Oct 2012 12:50:30 +0000 (14:50 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 14 Nov 2012 09:14:37 +0000 (10:14 +0100)
src/libcharon/daemon.c
src/libcharon/daemon.h

index 9ab857fe8212553d906de45151215dac44465e3d..b27e1776a9728a93b21791ca650e7a9b6f671283 100644 (file)
@@ -71,6 +71,16 @@ struct private_daemon_t {
         * Mutex for configured loggers
         */
        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(),
                .mutex = mutex_create(MUTEX_TYPE_DEFAULT),
+               .ref = 1,
        );
        charon = &this->public;
        this->public.caps = capabilities_create();
@@ -592,7 +603,14 @@ private_daemon_t *daemon_create(const char *name)
  */
 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;
 }
 
@@ -601,7 +619,16 @@ void libcharon_deinit()
  */
 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 */
        srandom(time(NULL) + getpid());
@@ -619,8 +646,7 @@ bool libcharon_init(const char *name)
                !lib->integrity->check(lib->integrity, "libcharon", libcharon_init))
        {
                dbg(DBG_DMN, 1, "integrity check of libcharon failed");
-               return FALSE;
+               this->integrity_failed = TRUE;
        }
-
-       return TRUE;
+       return !this->integrity_failed;
 }
index 06aa4ab7253e27ea5d2c7d61db453267b9630f85..2926d945bd11b17bc64e9b15f36cd519af04d0c7 100644 (file)
@@ -329,6 +329,9 @@ extern daemon_t *charon;
  * This function initializes the bus, listeners can be registered before
  * 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
  * @return             FALSE if integrity check failed
  */