summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ldap_driver.c24
-rw-r--r--ldap_helper.c5
-rw-r--r--zone_manager.c11
-rw-r--r--zone_manager.h12
4 files changed, 37 insertions, 15 deletions
diff --git a/ldap_driver.c b/ldap_driver.c
index f63cf59..9f80337 100644
--- a/ldap_driver.c
+++ b/ldap_driver.c
@@ -31,6 +31,7 @@
#include <string.h> /* For memcpy */
+#include "cache.h"
#include "ldap_helper.h"
#include "log.h"
#include "rdlist.h"
@@ -52,6 +53,7 @@ typedef struct {
isc_refcount_t refs;
isc_mutex_t lock; /* convert to isc_rwlock_t ? */
ldap_db_t *ldap_db;
+ ldap_cache_t *ldap_cache;
} ldapdb_t;
typedef struct {
@@ -299,11 +301,11 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
REQUIRE(VALID_LDAPDB(ldapdb));
- result = ldapdb_rdatalist_get(ldapdb->common.mctx, ldapdb->ldap_db,
- name, &rdatalist);
+ result = cached_ldap_rdatalist_get(ldapdb->common.mctx,
+ ldapdb->ldap_cache, ldapdb->ldap_db,
+ name, &rdatalist);
INSIST(result != DNS_R_PARTIALMATCH); /* XXX notimp yet */
- /* If ldapdb_rdatalist_get has no memory node creation will fail as well */
if (result == ISC_R_NOMEMORY)
return ISC_R_NOMEMORY;
@@ -359,8 +361,9 @@ find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,
REQUIRE(version == ldapdb_version);
}
- result = ldapdb_rdatalist_get(ldapdb->common.mctx, ldapdb->ldap_db,
- name, &rdatalist);
+ result = cached_ldap_rdatalist_get(ldapdb->common.mctx,
+ ldapdb->ldap_cache, ldapdb->ldap_db,
+ name, &rdatalist);
INSIST(result != DNS_R_PARTIALMATCH); /* XXX Not yet implemented */
if (result != ISC_R_SUCCESS && result != DNS_R_PARTIALMATCH)
@@ -793,7 +796,8 @@ ldapdb_create(isc_mem_t *mctx, dns_name_t *name, dns_dbtype_t type,
if (result != ISC_R_SUCCESS)
goto clean_lock;
- result = manager_get_ldap_db(argv[0], &ldapdb->ldap_db);
+ result = manager_get_ldap_db_and_cache(argv[0], &ldapdb->ldap_db,
+ &ldapdb->ldap_cache);
if (result != ISC_R_SUCCESS)
goto clean_lock;
@@ -823,15 +827,14 @@ dynamic_driver_init(isc_mem_t *mctx, const char *name, const char * const *argv,
dns_view_t *view, dns_zonemgr_t *zmgr)
{
isc_result_t result;
- ldap_db_t *ldap_db;
+ ldap_db_t *ldap_db = NULL;
+ ldap_cache_t *ldap_cache = NULL;
REQUIRE(mctx != NULL);
REQUIRE(name != NULL);
REQUIRE(argv != NULL);
REQUIRE(view != NULL);
- ldap_db = NULL;
-
log_debug(2, "Registering dynamic ldap driver for %s.", name);
/* Test argv. */
@@ -868,7 +871,8 @@ dynamic_driver_init(isc_mem_t *mctx, const char *name, const char * const *argv,
return result;
CHECK(new_ldap_db(mctx, view, &ldap_db, argv));
- CHECK(manager_add_db_instance(mctx, name, ldap_db, zmgr));
+ CHECK(new_ldap_cache(mctx, &ldap_cache, argv));
+ CHECK(manager_add_db_instance(mctx, name, ldap_db, ldap_cache, zmgr));
/*
* XXX now fetch all zones and initialize ldap zone manager
diff --git a/ldap_helper.c b/ldap_helper.c
index 0504da8..062dce0 100644
--- a/ldap_helper.c
+++ b/ldap_helper.c
@@ -621,6 +621,11 @@ ldapdb_rdatalist_get(isc_mem_t *mctx, ldap_db_t *ldap_db, dns_name_t *name,
"(objectClass=idnsRecord)"));
CHECK(cache_query_results(ldap_inst));
+ if (EMPTY(ldap_inst->ldap_entries)) {
+ result = ISC_R_NOTFOUND;
+ goto cleanup;
+ }
+
for (entry = HEAD(ldap_inst->ldap_entries);
entry != NULL;
entry = NEXT(entry, link)) {
diff --git a/zone_manager.c b/zone_manager.c
index e5fee22..9b1ae69 100644
--- a/zone_manager.c
+++ b/zone_manager.c
@@ -35,6 +35,7 @@ struct db_instance {
isc_mem_t *mctx;
char *name;
ldap_db_t *ldap_db;
+ ldap_cache_t *ldap_cache;
dns_zonemgr_t *dns_zone_manager;
LINK(db_instance_t) link;
};
@@ -84,6 +85,7 @@ destroy_db_instance(db_instance_t **db_instp)
db_inst = *db_instp;
destroy_ldap_db(&db_inst->ldap_db);
+ destroy_ldap_cache(&db_inst->ldap_cache);
if (db_inst->name != NULL)
isc_mem_free(db_inst->mctx, db_inst->name);
@@ -94,7 +96,7 @@ destroy_db_instance(db_instance_t **db_instp)
isc_result_t
manager_add_db_instance(isc_mem_t *mctx, const char *name, ldap_db_t *ldap_db,
- dns_zonemgr_t *zmgr)
+ ldap_cache_t *ldap_cache, dns_zonemgr_t *zmgr)
{
isc_result_t result;
db_instance_t *db_inst;
@@ -102,6 +104,7 @@ manager_add_db_instance(isc_mem_t *mctx, const char *name, ldap_db_t *ldap_db,
REQUIRE(mctx != NULL);
REQUIRE(name != NULL);
REQUIRE(ldap_db != NULL);
+ REQUIRE(ldap_cache != NULL);
REQUIRE(zmgr != NULL);
isc_once_do(&initialize_once, initialize_manager);
@@ -123,6 +126,7 @@ manager_add_db_instance(isc_mem_t *mctx, const char *name, ldap_db_t *ldap_db,
db_inst->mctx = NULL;
isc_mem_attach(mctx, &db_inst->mctx);
db_inst->ldap_db = ldap_db;
+ db_inst->ldap_cache = ldap_cache;
db_inst->dns_zone_manager = zmgr;
LOCK(&instance_list_lock);
@@ -157,13 +161,15 @@ manager_refresh_zones(void)
}
isc_result_t
-manager_get_ldap_db(const char *name, ldap_db_t **ldap_db)
+manager_get_ldap_db_and_cache(const char *name, ldap_db_t **ldap_db,
+ ldap_cache_t **ldap_cache)
{
isc_result_t result;
db_instance_t *db_inst;
REQUIRE(name != NULL);
REQUIRE(ldap_db != NULL);
+ REQUIRE(ldap_cache != NULL);
isc_once_do(&initialize_once, initialize_manager);
@@ -171,6 +177,7 @@ manager_get_ldap_db(const char *name, ldap_db_t **ldap_db)
CHECK(find_db_instance(name, &db_inst));
*ldap_db = db_inst->ldap_db;
+ *ldap_cache = db_inst->ldap_cache;
cleanup:
return result;
diff --git a/zone_manager.h b/zone_manager.h
index 930605b..353cb85 100644
--- a/zone_manager.h
+++ b/zone_manager.h
@@ -22,13 +22,19 @@
#include <dns/types.h>
+#include "cache.h"
#include "ldap_helper.h"
typedef struct db_instance db_instance_t;
void destroy_manager(void);
-isc_result_t manager_add_db_instance(isc_mem_t *mctx, const char *name,
- ldap_db_t *ldap_db, dns_zonemgr_t *zmgr);
-isc_result_t manager_get_ldap_db(const char *name, ldap_db_t **ldap_db);
+
+isc_result_t
+manager_add_db_instance(isc_mem_t *mctx, const char *name, ldap_db_t *ldap_db,
+ ldap_cache_t *ldap_cache, dns_zonemgr_t *zmgr);
+
+isc_result_t
+manager_get_ldap_db_and_cache(const char *name, ldap_db_t **ldap_db,
+ ldap_cache_t **ldap_cache);
#endif /* !_LD_ZONE_MANAGER_H_ */