Added manager for DNS resolvers
authorReto Guadagnini <rguadagn@hsr.ch>
Fri, 23 Mar 2012 10:36:49 +0000 (11:36 +0100)
committerTobias Brunner <tobias@strongswan.org>
Tue, 19 Feb 2013 10:57:21 +0000 (11:57 +0100)
src/libstrongswan/Makefile.am
src/libstrongswan/library.c
src/libstrongswan/library.h
src/libstrongswan/resolver/resolver_manager.c [new file with mode: 0644]
src/libstrongswan/resolver/resolver_manager.h [new file with mode: 0644]

index 0d455e0..b0dd862 100644 (file)
@@ -26,6 +26,7 @@ networking/host.c networking/host_resolver.c networking/packet.c \
 networking/tun_device.c \
 pen/pen.c plugins/plugin_loader.c plugins/plugin_feature.c processing/jobs/job.c \
 processing/jobs/callback_job.c processing/processor.c processing/scheduler.c \
+resolver/resolver_manager.c \
 selectors/traffic_selector.c threading/thread.c threading/thread_value.c \
 threading/mutex.c threading/semaphore.c threading/rwlock.c threading/spinlock.c \
 utils/utils.c utils/chunk.c utils/debug.c utils/enum.c utils/identification.c \
@@ -64,7 +65,7 @@ fetcher/fetcher_manager.h eap/eap.h pen/pen.h ipsec/ipsec_types.h \
 networking/host.h networking/host_resolver.h networking/packet.h \
 networking/tun_device.h \
 resolver/resolver.h resolver/resolver_response.h resolver/rr_set.h \
-resolver/rr.h \
+resolver/rr.h resolver/resolver_manager.h \
 plugins/plugin_loader.h plugins/plugin.h plugins/plugin_feature.h \
 processing/jobs/job.h processing/jobs/callback_job.h processing/processor.h \
 processing/scheduler.h selectors/traffic_selector.h \
index 30a7774..819c680 100644 (file)
@@ -91,6 +91,7 @@ void library_deinit()
        this->public.crypto->destroy(this->public.crypto);
        this->public.proposal->destroy(this->public.proposal);
        this->public.fetcher->destroy(this->public.fetcher);
+       this->public.resolver->destroy(this->public.resolver);
        this->public.db->destroy(this->public.db);
        this->public.printf_hook->destroy(this->public.printf_hook);
        this->objects->destroy(this->objects);
@@ -214,6 +215,7 @@ bool library_init(char *settings)
        this->public.credmgr = credential_manager_create();
        this->public.encoding = cred_encoding_create();
        this->public.fetcher = fetcher_manager_create();
+       this->public.resolver = resolver_manager_create();
        this->public.db = database_factory_create();
        this->public.processor = processor_create();
        this->public.scheduler = scheduler_create();
index 467bb08..3b6d020 100644 (file)
@@ -95,6 +95,7 @@
 #include "crypto/crypto_factory.h"
 #include "crypto/proposal/proposal_keywords.h"
 #include "fetcher/fetcher_manager.h"
+#include "resolver/resolver_manager.h"
 #include "database/database_factory.h"
 #include "credentials/credential_factory.h"
 #include "credentials/credential_manager.h"
@@ -165,6 +166,11 @@ struct library_t {
        fetcher_manager_t *fetcher;
 
        /**
+        * Manager for DNS resolvers
+        */
+        resolver_manager_t *resolver;
+
+       /**
         * database construction factory
         */
        database_factory_t *db;
diff --git a/src/libstrongswan/resolver/resolver_manager.c b/src/libstrongswan/resolver/resolver_manager.c
new file mode 100644 (file)
index 0000000..6486909
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2011-2012 Reto Guadagnini
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+#include "resolver_manager.h"
+
+#include <utils/debug.h>
+
+typedef struct private_resolver_manager_t private_resolver_manager_t;
+
+/**
+ * private data of resolver_manager
+ */
+struct private_resolver_manager_t {
+
+       /**
+        * public functions
+        */
+       resolver_manager_t public;
+
+       /**
+        * constructor function to create resolver instances
+        */
+       resolver_constructor_t constructor;
+};
+
+METHOD(resolver_manager_t, add_resolver, void,
+       private_resolver_manager_t *this, resolver_constructor_t constructor)
+{
+       if (!this->constructor)
+       {
+               this->constructor = constructor;
+       }
+}
+
+METHOD(resolver_manager_t, remove_resolver, void,
+       private_resolver_manager_t *this, resolver_constructor_t constructor)
+{
+       if (this->constructor == constructor)
+       {
+               this->constructor = NULL;
+       }
+}
+
+METHOD(resolver_manager_t, create, resolver_t*,
+       private_resolver_manager_t *this)
+{
+       char *resolv_conf;
+       char *trust_anchor_file;
+
+       resolv_conf = lib->settings->get_str(lib->settings,
+                                                                                "libstrongswan.plugins.resolver."
+                                                                                "resolv_conf",
+                                                                                "/etc/resolv.conf");
+
+       trust_anchor_file = lib->settings->get_str(lib->settings,
+                                                                                          "libstrongswan.plugins.resolver."
+                                                                                          "trust_anchor",
+                                                                                          "/etc/trust.anchors");
+
+       return this->constructor(resolv_conf, trust_anchor_file);
+}
+
+METHOD(resolver_manager_t, destroy, void,
+       private_resolver_manager_t *this)
+{
+       free(this);
+}
+
+/*
+ * See header
+ */
+resolver_manager_t *resolver_manager_create()
+{
+       private_resolver_manager_t *this;
+
+       INIT(this,
+                       .public = {
+                               .add_resolver = _add_resolver,
+                               .remove_resolver = _remove_resolver,
+                               .create = _create,
+                               .destroy = _destroy,
+                       },
+       );
+
+       return &this->public;
+}
+
diff --git a/src/libstrongswan/resolver/resolver_manager.h b/src/libstrongswan/resolver/resolver_manager.h
new file mode 100644 (file)
index 0000000..6ea22aa
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2011-2012 Reto Guadagnini
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+/**
+* @defgroup resolver_manager resolver_manager
+* @{ @ingroup resolver
+*/
+
+#ifndef RESOLVER_MANAGER_H_
+#define RESOLVER_MANAGER_H_
+
+typedef struct resolver_manager_t resolver_manager_t;
+
+#include <resolver/resolver.h>
+
+/**
+ * The resolver_manager manages the resolver implementations and
+ * creates instances of them.
+ *
+ * A resolver plugin is registered by providing its constructor function
+ * to the manager. The manager creates instances of the resolver plugin
+ * using the registered constructor function.
+ */
+struct resolver_manager_t {
+
+       /**
+        * Register a resolver implementation.
+        *
+        * @param constructor   resolver constructor function
+        */
+       void (*add_resolver)(resolver_manager_t *this,
+                                                resolver_constructor_t constructor);
+
+       /**
+        * Unregister a previously registered resolver implementation.
+        *
+        * @param constructor   resolver constructor function to unregister
+        */
+       void (*remove_resolver)(resolver_manager_t *this,
+                                                       resolver_constructor_t constructor);
+
+       /**
+        * Get a new resolver instance.
+        *
+        * @return                              resolver instance.
+        */
+       resolver_t* (*create)(resolver_manager_t *this);
+
+       /**
+        * Destroy a resolver_manager instance.
+        */
+       void (*destroy)(resolver_manager_t *this);
+};
+
+/**
+ * Create a resolver_manager instance.
+ */
+resolver_manager_t *resolver_manager_create();
+
+#endif /** RESOLVER_MANAGER_H_ @}*/