1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

s4:dsdb - add a new dsdb delete function which understands the tree delete control

This commit is contained in:
Matthias Dieter Wallnöfer 2010-06-20 12:43:49 +02:00
parent ad5e19f29e
commit 87d0f63632
3 changed files with 62 additions and 2 deletions

View File

@ -3479,6 +3479,13 @@ int dsdb_request_add_controls(struct ldb_request *req, uint32_t dsdb_flags)
}
}
if (dsdb_flags & DSDB_TREE_DELETE) {
ret = ldb_request_add_control(req, LDB_CONTROL_TREE_DELETE_OID, false, NULL);
if (ret != LDB_SUCCESS) {
return ret;
}
}
return LDB_SUCCESS;
}

View File

@ -31,5 +31,5 @@
#define DSDB_MODIFY_RELAX 0x0020
#define DSDB_MODIFY_PERMISSIVE 0x0040
#define DSDB_FLAG_AS_SYSTEM 0x0080
#define DSDB_SEARCH_ONE_ONLY 0x0020 /* give an error unless 1 record */
#define DSDB_TREE_DELETE 0x0100
#define DSDB_SEARCH_ONE_ONLY 0x0200 /* give an error unless 1 record */

View File

@ -407,6 +407,59 @@ int dsdb_module_add(struct ldb_module *module,
return ret;
}
/*
a ldb_delete request operating on modules below the
current module
*/
int dsdb_module_del(struct ldb_module *module,
struct ldb_dn *dn,
uint32_t dsdb_flags)
{
struct ldb_request *req;
int ret;
struct ldb_context *ldb = ldb_module_get_ctx(module);
TALLOC_CTX *tmp_ctx = talloc_new(module);
struct ldb_result *res;
res = talloc_zero(tmp_ctx, struct ldb_result);
if (!res) {
talloc_free(tmp_ctx);
return LDB_ERR_OPERATIONS_ERROR;
}
ret = ldb_build_del_req(&req, ldb, tmp_ctx,
dn,
NULL,
res,
ldb_modify_default_callback,
NULL);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
}
ret = dsdb_request_add_controls(req, dsdb_flags);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
}
/* Run the new request */
if (dsdb_flags & DSDB_FLAG_OWN_MODULE) {
const struct ldb_module_ops *ops = ldb_module_get_ops(module);
ret = ops->del(module, req);
} else if (dsdb_flags & DSDB_FLAG_TOP_MODULE) {
ret = ldb_request(ldb_module_get_ctx(module), req);
} else {
ret = ldb_next_request(module, req);
}
if (ret == LDB_SUCCESS) {
ret = ldb_wait(req->handle, LDB_WAIT_ALL);
}
talloc_free(tmp_ctx);
return ret;
}
const struct dsdb_class * get_last_structural_class(const struct dsdb_schema *schema,const struct ldb_message_element *element)
{