diff options
-rw-r--r-- | ldap_driver.c | 24 | ||||
-rw-r--r-- | ldap_helper.c | 5 | ||||
-rw-r--r-- | zone_manager.c | 11 | ||||
-rw-r--r-- | zone_manager.h | 12 |
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_ */ |