library: Add option to register additional namespaces before calling library_init()
authorTobias Brunner <tobias@strongswan.org>
Thu, 3 Mar 2016 17:12:06 +0000 (18:12 +0100)
committerTobias Brunner <tobias@strongswan.org>
Tue, 8 Mar 2016 09:56:19 +0000 (10:56 +0100)
Because settings are already accessed in library_init(), calling
add_fallback() externally after calling library_init() is not ideal.
This way namespaces already serve as fallback while library_init() is
executed and they are also in the correct order so that libstrongswan is
always the last root section.

src/libstrongswan/library.c
src/libstrongswan/library.h

index dc73ccc..e130b93 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Tobias Brunner
+ * Copyright (C) 2009-2016 Tobias Brunner
  * Copyright (C) 2008 Martin Willi
  * Hochschule fuer Technik Rapperswil
  *
@@ -61,6 +61,31 @@ struct private_library_t {
        refcount_t ref;
 };
 
+#define MAX_NAMESPACES 5
+
+/**
+ * Additional namespaces registered using __atrribute__((constructor))
+ */
+static char *namespaces[MAX_NAMESPACES];
+static int ns_count;
+
+/**
+ * Described in header
+ */
+void library_add_namespace(char *ns)
+{
+       if (ns_count < MAX_NAMESPACES - 1)
+       {
+               namespaces[ns_count] = ns;
+               ns_count++;
+       }
+       else
+       {
+               fprintf(stderr, "failed to register additional namespace alias, please "
+                               "increase MAX_NAMESPACES");
+       }
+}
+
 /**
  * library instance
  */
@@ -248,6 +273,7 @@ bool library_init(char *settings, const char *namespace)
 {
        private_library_t *this;
        printf_hook_t *pfh;
+       int i;
 
        if (lib)
        {       /* already initialized, increase refcount */
@@ -311,6 +337,11 @@ bool library_init(char *settings, const char *namespace)
                                                                         (hashtable_equals_t)equals, 4);
 
        this->public.settings = settings_create(this->public.conf);
+       /* add registered aliases */
+       for (i = 0; i < ns_count; ++i)
+       {
+               lib->settings->add_fallback(lib->settings, lib->ns, namespaces[i]);
+       }
        /* all namespace settings may fall back to libstrongswan */
        lib->settings->add_fallback(lib->settings, lib->ns, "libstrongswan");
 
index 3a6dd1b..08316fd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2014 Tobias Brunner
+ * Copyright (C) 2010-2016 Tobias Brunner
  * Copyright (C) 2008 Martin Willi
  * Hochschule fuer Technik Rapperswil
  *
@@ -276,4 +276,14 @@ void library_deinit();
  */
 extern library_t *lib;
 
+/**
+ * Add additional names used as alias for the namespace registered with
+ * library_init().
+ *
+ * To be called from __attribute__((constructor)) functions.
+ *
+ * @param ns                   additional namespace
+ */
+void library_add_namespace(char *ns);
+
 #endif /** LIBRARY_H_ @}*/