diff options
Diffstat (limited to 'source4/lib/ldb')
-rw-r--r-- | source4/lib/ldb/ldb_ildap/ldb_ildap.c | 139 |
1 files changed, 80 insertions, 59 deletions
diff --git a/source4/lib/ldb/ldb_ildap/ldb_ildap.c b/source4/lib/ldb/ldb_ildap/ldb_ildap.c index de32c10ba4..a5f4ab67fd 100644 --- a/source4/lib/ldb/ldb_ildap/ldb_ildap.c +++ b/source4/lib/ldb/ldb_ildap/ldb_ildap.c @@ -24,10 +24,22 @@ */ /* - This is a ldb backend for the internal ldap client library in - Samba4. By using this backend we are independent of a system ldap - library -*/ + * Name: ldb_ildap + * + * Component: ldb ildap backend + * + * Description: This is a ldb backend for the internal ldap + * client library in Samba4. By using this backend we are + * independent of a system ldap library + * + * Author: Andrew Tridgell + * + * Modifications: + * + * - description: make the module use asyncronous calls + * date: Feb 2006 + * author: Simo Sorce + */ #include "includes.h" @@ -141,7 +153,7 @@ static void ildb_async_callback(struct ldap_request *req) { struct ldb_async_handle *handle = talloc_get_type(req->async.private_data, struct ldb_async_handle); struct ildb_async_context *ac = talloc_get_type(handle->private_data, struct ildb_async_context); - struct ildb_private *ildb = ac->module->private_data; + struct ildb_private *ildb = talloc_get_type(ac->module->private_data, struct ildb_private); NTSTATUS status; int i; @@ -166,6 +178,10 @@ static void ildb_async_callback(struct ldap_request *req) } status = ldap_check_response(req->conn, &req->replies[0]->r.GeneralResult); handle->status = ildb_map_error(ildb, status); + if (ac->callback && handle->status == LDB_SUCCESS) { + /* FIXME: build a corresponding ares to pass on */ + handle->status = ac->callback(ac->module->ldb, ac->context, NULL); + } handle->state = LDB_ASYNC_DONE; break; @@ -176,6 +192,10 @@ static void ildb_async_callback(struct ldap_request *req) } status = ldap_check_response(req->conn, &req->replies[0]->r.GeneralResult); handle->status = ildb_map_error(ildb, status); + if (ac->callback && handle->status == LDB_SUCCESS) { + /* FIXME: build a corresponding ares to pass on */ + handle->status = ac->callback(ac->module->ldb, ac->context, NULL); + } handle->state = LDB_ASYNC_DONE; break; @@ -186,6 +206,10 @@ static void ildb_async_callback(struct ldap_request *req) } status = ldap_check_response(req->conn, &req->replies[0]->r.GeneralResult); handle->status = ildb_map_error(ildb, status); + if (ac->callback && handle->status == LDB_SUCCESS) { + /* FIXME: build a corresponding ares to pass on */ + handle->status = ac->callback(ac->module->ldb, ac->context, NULL); + } handle->state = LDB_ASYNC_DONE; break; @@ -196,6 +220,10 @@ static void ildb_async_callback(struct ldap_request *req) } status = ldap_check_response(req->conn, &req->replies[0]->r.GeneralResult); handle->status = ildb_map_error(ildb, status); + if (ac->callback && handle->status == LDB_SUCCESS) { + /* FIXME: build a corresponding ares to pass on */ + handle->status = ac->callback(ac->module->ldb, ac->context, NULL); + } handle->state = LDB_ASYNC_DONE; break; @@ -302,7 +330,7 @@ static int ildb_request_send(struct ldb_module *module, struct ldap_message *msg int timeout, struct ldb_async_handle **handle) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ildb_async_context *ildb_ac; struct ldb_async_handle *h; struct ldap_request *req; @@ -362,7 +390,7 @@ static int ildb_search_async(struct ldb_module *module, const struct ldb_dn *bas int timeout, struct ldb_async_handle **handle) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldap_message *msg; int n; @@ -422,12 +450,6 @@ static int ildb_search_async(struct ldb_module *module, const struct ldb_dn *bas return ildb_request_send(module, msg, context, callback, timeout, handle); } -struct ildb_sync_context { - struct ldb_result *res; - int status; - int done; -}; - static int ildb_search_sync_callback(struct ldb_context *ldb, void *context, struct ldb_async_result *ares) { struct ldb_result *res; @@ -476,12 +498,10 @@ static int ildb_search_sync_callback(struct ldb_context *ldb, void *context, str res->refs[n + 1] = NULL; } - if (ares->type == LDB_REPLY_DONE) { - if (ares->controls) { - res->controls = talloc_steal(res, ares->controls); - if (! res->controls) { - goto error; - } + if (ares->controls) { + res->controls = talloc_steal(res, ares->controls); + if (! res->controls) { + goto error; } } @@ -504,7 +524,7 @@ static int ildb_search_bytree(struct ldb_module *module, const struct ldb_dn *ba struct ldb_control **control_req, struct ldb_result **res) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldb_async_handle *handle; int ret; @@ -531,7 +551,7 @@ static int ildb_add_async(struct ldb_module *module, const struct ldb_message *l int timeout, struct ldb_async_handle **handle) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldap_message *msg; struct ldap_mod **mods; int i,n; @@ -578,7 +598,7 @@ static int ildb_add_async(struct ldb_module *module, const struct ldb_message *l static int ildb_add(struct ldb_module *module, const struct ldb_message *msg) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldb_async_handle *handle; int ret; @@ -600,7 +620,7 @@ static int ildb_modify_async(struct ldb_module *module, const struct ldb_message int timeout, struct ldb_async_handle **handle) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldap_message *msg; struct ldap_mod **mods; int i,n; @@ -647,7 +667,7 @@ static int ildb_modify_async(struct ldb_module *module, const struct ldb_message static int ildb_modify(struct ldb_module *module, const struct ldb_message *msg) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldb_async_handle *handle; int ret; @@ -669,7 +689,7 @@ static int ildb_delete_async(struct ldb_module *module, const struct ldb_dn *dn, int timeout, struct ldb_async_handle **handle) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldap_message *msg; *handle = NULL; @@ -697,7 +717,7 @@ static int ildb_delete_async(struct ldb_module *module, const struct ldb_dn *dn, static int ildb_delete(struct ldb_module *module, const struct ldb_dn *dn) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldb_async_handle *handle; int ret; @@ -720,7 +740,7 @@ static int ildb_rename_async(struct ldb_module *module, int timeout, struct ldb_async_handle **handle) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldap_message *msg; *handle = NULL; @@ -766,7 +786,7 @@ static int ildb_rename_async(struct ldb_module *module, static int ildb_rename(struct ldb_module *module, const struct ldb_dn *olddn, const struct ldb_dn *newdn) { - struct ildb_private *ildb = module->private_data; + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); struct ldb_async_handle *handle; int ret; @@ -878,36 +898,6 @@ static int ildb_request(struct ldb_module *module, struct ldb_request *req) } } -/* - fetch the rootDSE for later use -*/ -static int ildb_init_2(struct ldb_module *module) -{ - struct ildb_private *ildb = module->private_data; - struct ldb_result *res = NULL; - struct ldb_dn *empty_dn = ldb_dn_new(ildb); - int ret; - ret = ildb_search_bytree(module, empty_dn, LDB_SCOPE_BASE, - ldb_parse_tree(empty_dn, "dn=dc=rootDSE"), - NULL, NULL, &res); - if (ret == LDB_SUCCESS && res->count == 1) { - ildb->rootDSE = talloc_steal(ildb, res->msgs[0]); - } - if (ret == LDB_SUCCESS) talloc_free(res); - talloc_free(empty_dn); - - return LDB_SUCCESS; -} - -static const struct ldb_module_ops ildb_ops = { - .name = "ldap", - .request = ildb_request, - .start_transaction = ildb_start_trans, - .end_transaction = ildb_end_trans, - .del_transaction = ildb_del_trans, - .second_stage_init = ildb_init_2 -}; - static int ildb_async_wait(struct ldb_async_handle *handle, enum ldb_async_wait_type type) { @@ -917,6 +907,8 @@ static int ildb_async_wait(struct ldb_async_handle *handle, enum ldb_async_wait_ return LDB_ERR_OPERATIONS_ERROR; } + handle->state = LDB_ASYNC_INIT; + switch(type) { case LDB_WAIT_NONE: if (event_loop_once(ac->req->conn->event.event_ctx) != 0) { @@ -924,7 +916,6 @@ static int ildb_async_wait(struct ldb_async_handle *handle, enum ldb_async_wait_ } break; case LDB_WAIT_ONCE: - handle->state = LDB_ASYNC_INIT; while (handle->status == LDB_SUCCESS && handle->state == LDB_ASYNC_INIT) { if (event_loop_once(ac->req->conn->event.event_ctx) != 0) { return LDB_ERR_OTHER; @@ -946,6 +937,36 @@ static int ildb_async_wait(struct ldb_async_handle *handle, enum ldb_async_wait_ } /* + fetch the rootDSE for later use +*/ +static int ildb_init_2(struct ldb_module *module) +{ + struct ildb_private *ildb = talloc_get_type(module->private_data, struct ildb_private); + struct ldb_result *res = NULL; + struct ldb_dn *empty_dn = ldb_dn_new(ildb); + int ret; + ret = ildb_search_bytree(module, empty_dn, LDB_SCOPE_BASE, + ldb_parse_tree(empty_dn, "dn=dc=rootDSE"), + NULL, NULL, &res); + if (ret == LDB_SUCCESS && res->count == 1) { + ildb->rootDSE = talloc_steal(ildb, res->msgs[0]); + } + if (ret == LDB_SUCCESS) talloc_free(res); + talloc_free(empty_dn); + + return LDB_SUCCESS; +} + +static const struct ldb_module_ops ildb_ops = { + .name = "ldap", + .request = ildb_request, + .start_transaction = ildb_start_trans, + .end_transaction = ildb_end_trans, + .del_transaction = ildb_del_trans, + .second_stage_init = ildb_init_2 +}; + +/* connect to the database */ int ildb_connect(struct ldb_context *ldb, const char *url, |