summaryrefslogtreecommitdiffstats
path: root/ldap_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldap_driver.c')
-rw-r--r--ldap_driver.c85
1 files changed, 49 insertions, 36 deletions
diff --git a/ldap_driver.c b/ldap_driver.c
index 70751ab..b032bf0 100644
--- a/ldap_driver.c
+++ b/ldap_driver.c
@@ -32,6 +32,7 @@
#include "ldap_helper.h"
#include "log.h"
#include "util.h"
+#include "zone_manager.h"
#define LDAPDB_MAGIC ISC_MAGIC('L', 'D', 'P', 'D')
#define VALID_LDAPDB(ldapdb) \
@@ -42,20 +43,10 @@
LDAPDBNODE_MAGIC)
typedef struct {
- ldap_db_t *ldap_db;
-} ldapdb_data_t;
-
-typedef struct {
dns_db_t common;
isc_refcount_t refs;
isc_mutex_t lock; /* convert to isc_rwlock_t ? */
- /*
- * XXX LDAP:
- *
- * Add connection specification here - probably pointer to one shared
- * connection info for multiple zones? Will be used by all
- * ldapdb_methods to take information from LDAP.
- */
+ ldap_db_t *ldap_db;
} ldapdb_t;
typedef struct {
@@ -67,10 +58,10 @@ typedef struct {
static int dummy;
static void *ldapdb_version = &dummy;
-static ldapdb_data_t driver_data;
-static void
-detachnode(dns_db_t *db, dns_dbnode_t **targetp);
+static void free_ldapdb(ldapdb_t *ldapdb);
+static void detachnode(dns_db_t *db, dns_dbnode_t **targetp);
+
/* ldapdbnode_t functions */
static isc_result_t
@@ -133,12 +124,18 @@ detach(dns_db_t **dbp)
isc_refcount_decrement(&ldapdb->refs, &refs);
- if (refs != 0) {
- *dbp = NULL;
- return;
- }
+ if (refs == 0)
+ free_ldapdb(ldapdb);
- /* Clean all ldapdb_t stuff here */
+ *dbp = NULL;
+}
+
+static void
+free_ldapdb(ldapdb_t *ldapdb)
+{
+ DESTROYLOCK(&ldapdb->lock);
+ dns_name_free(&ldapdb->common.origin, ldapdb->common.mctx);
+ isc_mem_putanddetach(&ldapdb->common.mctx, ldapdb, sizeof(*ldapdb));
}
static isc_result_t
@@ -246,6 +243,7 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
ldapdb_rdatalist_t rdatalist;
ldapdbnode_t *node = NULL;
+ log_func_enter_args("name=%s, create=%d", name->ndata, create);
REQUIRE(VALID_LDAPDB(ldapdb));
result = ldapdb_rdatalist_get(ldapdb->common.mctx, name, &rdatalist);
@@ -273,10 +271,15 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
*nodep = node;
+ log_func_exit_result(ISC_R_SUCCESS);
+
return ISC_R_SUCCESS;
cleanup:
ldapdb_rdatalist_destroy(ldapdb->common.mctx, &rdatalist);
+
+ log_func_exit_result(result);
+
return result;
}
@@ -298,6 +301,8 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
UNUSED(options);
UNUSED(sigrdataset);
+ log_func_enter();
+
REQUIRE(VALID_LDAPDB(ldapdb));
/* XXX not yet implemented */
@@ -409,7 +414,10 @@ detachnode(dns_db_t *db, dns_dbnode_t **targetp)
if (refs == 0) {
ldapdb_rdatalist_destroy(ldapdb->common.mctx, &node->rdatalist);
dns_name_free(&node->owner, ldapdb->common.mctx);
+ isc_mem_put(ldapdb->common.mctx, node, sizeof(*node));
}
+
+ *targetp = NULL;
}
static isc_result_t
@@ -691,7 +699,7 @@ ldapdb_create(isc_mem_t *mctx, dns_name_t *name, dns_dbtype_t type,
UNUSED(driverarg); /* Currently we don't need any data */
- /* LDAP server has to be specified at least */
+ /* Database implementation name and name pointing to ldap_db_t */
REQUIRE(argc > 0);
REQUIRE(type == dns_dbtype_zone);
@@ -712,6 +720,7 @@ ldapdb_create(isc_mem_t *mctx, dns_name_t *name, dns_dbtype_t type,
goto clean_ldapdb;
isc_ondestroy_init(&ldapdb->common.ondest);
+ ldapdb->common.mctx = NULL;
isc_mem_attach(mctx, &ldapdb->common.mctx);
result = isc_mutex_init(&ldapdb->lock);
@@ -722,14 +731,9 @@ ldapdb_create(isc_mem_t *mctx, dns_name_t *name, dns_dbtype_t type,
if (result != ISC_R_SUCCESS)
goto clean_lock;
- /*
- * XXX LDAP:
- *
- * Now we have to setup connection info. Parameters passed in
- * configuration file are in arg && argv. So use them and setup
- * per-zone connection (will be used by ldapdb_methods). Parameters were
- * passed by ldap zone manager and by dns_zone_setdbtype method.
- */
+ result = manager_get_ldap_db(argv[0], &ldapdb->ldap_db);
+ if (result != ISC_R_SUCCESS)
+ goto clean_lock;
ldapdb->common.magic = DNS_DB_MAGIC;
ldapdb->common.impmagic = LDAPDB_MAGIC;
@@ -743,22 +747,28 @@ clean_lock:
clean_origin:
dns_name_free(&ldapdb->common.origin, mctx);
clean_ldapdb:
- isc_mem_put(mctx, ldapdb, sizeof(*ldapdb));
+ isc_mem_putanddetach(&ldapdb->common.mctx, ldapdb, sizeof(*ldapdb));
return result;
}
static dns_dbimplementation_t *ldapdb_imp;
-static const char *ldapdb_impname = "dynamic-ldap";
+const char *ldapdb_impname = "dynamic-ldap";
+
isc_result_t
dynamic_driver_init(isc_mem_t *mctx, const char *name, const char * const *argv,
- dns_view_t *view)
+ dns_view_t *view, dns_zonemgr_t *zmgr)
{
isc_result_t result;
+ ldap_db_t *ldap_db;
+ REQUIRE(mctx != NULL);
+ REQUIRE(name != NULL);
REQUIRE(argv != NULL);
- UNUSED(view);
+ REQUIRE(view != NULL);
+
+ ldap_db = NULL;
log_debug(2, "Registering dynamic ldap driver for %s.", name);
@@ -769,6 +779,7 @@ dynamic_driver_init(isc_mem_t *mctx, const char *name, const char * const *argv,
i++;
}
+ /* Register new DNS DB implementation. */
result = dns_db_register(ldapdb_impname, &ldapdb_create, NULL, mctx,
&ldapdb_imp);
if (result == ISC_R_EXISTS)
@@ -777,9 +788,8 @@ dynamic_driver_init(isc_mem_t *mctx, const char *name, const char * const *argv,
if (result != ISC_R_SUCCESS)
return result;
- CHECK(new_ldap_db(mctx, &driver_data.ldap_db, argv));
-
- get_zone_list(driver_data.ldap_db);
+ CHECK(new_ldap_db(mctx, view, &ldap_db, argv));
+ CHECK(manager_add_db_instance(mctx, name, ldap_db, zmgr));
/*
* XXX now fetch all zones and initialize ldap zone manager
@@ -806,6 +816,9 @@ dynamic_driver_init(isc_mem_t *mctx, const char *name, const char * const *argv,
return ISC_R_SUCCESS;
cleanup:
+ if (ldap_db != NULL)
+ destroy_ldap_db(&ldap_db);
+
return result;
}
@@ -813,5 +826,5 @@ void
dynamic_driver_destroy(void)
{
dns_db_unregister(&ldapdb_imp);
- destroy_ldap_db(&driver_data.ldap_db);
+ destroy_manager();
}