summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-rw-r--r--source4/lib/ldb-samba/README7
-rw-r--r--source4/lib/ldb-samba/ldb_ildap.c879
-rw-r--r--source4/lib/ldb-samba/ldb_wrap.c365
-rw-r--r--source4/lib/ldb-samba/ldb_wrap.h70
-rw-r--r--source4/lib/ldb-samba/ldif_handlers.c1416
-rw-r--r--source4/lib/ldb-samba/ldif_handlers.h23
-rw-r--r--source4/lib/ldb-samba/pyldb.c270
-rw-r--r--source4/lib/ldb-samba/samba_extensions.c119
-rw-r--r--source4/lib/ldb-samba/wscript_build42
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.10.sigs218
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.12.sigs219
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.15.sigs226
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.16.sigs228
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.17.sigs229
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.18.sigs240
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.19.sigs245
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.20.sigs245
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.22.sigs245
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.23.sigs247
-rw-r--r--source4/lib/ldb/ABI/ldb-0.9.24.sigs248
-rw-r--r--source4/lib/ldb/ABI/ldb-1.0.0.sigs248
-rw-r--r--source4/lib/ldb/ABI/ldb-1.0.1.sigs248
-rw-r--r--source4/lib/ldb/ABI/ldb-1.0.2.sigs250
-rw-r--r--source4/lib/ldb/ABI/ldb-1.1.0.sigs253
-rw-r--r--source4/lib/ldb/ABI/ldb-ildap-0.9.12.sigs224
-rw-r--r--source4/lib/ldb/ABI/ldb-samba4-0.9.10.sigs223
-rw-r--r--source4/lib/ldb/ABI/ldb-samba4-0.9.11.sigs224
-rw-r--r--source4/lib/ldb/Doxyfile26
-rw-r--r--source4/lib/ldb/Makefile51
-rw-r--r--source4/lib/ldb/README_gcov.txt29
-rw-r--r--source4/lib/ldb/common/attrib_handlers.c496
-rw-r--r--source4/lib/ldb/common/ldb.c1923
-rw-r--r--source4/lib/ldb/common/ldb_attributes.c306
-rw-r--r--source4/lib/ldb/common/ldb_controls.c1043
-rw-r--r--source4/lib/ldb/common/ldb_debug.c142
-rw-r--r--source4/lib/ldb/common/ldb_dn.c2101
-rw-r--r--source4/lib/ldb/common/ldb_ldif.c1026
-rw-r--r--source4/lib/ldb/common/ldb_match.c570
-rw-r--r--source4/lib/ldb/common/ldb_modules.c1146
-rw-r--r--source4/lib/ldb/common/ldb_msg.c1187
-rw-r--r--source4/lib/ldb/common/ldb_options.c72
-rw-r--r--source4/lib/ldb/common/ldb_parse.c903
-rw-r--r--source4/lib/ldb/common/ldb_utf8.c136
-rw-r--r--source4/lib/ldb/common/qsort.c251
-rwxr-xr-xsource4/lib/ldb/configure21
-rwxr-xr-xsource4/lib/ldb/docs/builddocs.sh52
-rw-r--r--source4/lib/ldb/docs/design.txt41
-rwxr-xr-xsource4/lib/ldb/docs/installdocs.sh17
-rw-r--r--source4/lib/ldb/examples.dox16
-rw-r--r--source4/lib/ldb/examples/ldbreader.c122
-rw-r--r--source4/lib/ldb/examples/ldifreader.c125
-rw-r--r--source4/lib/ldb/include/dlinklist.h185
-rw-r--r--source4/lib/ldb/include/ldb.h2254
-rw-r--r--source4/lib/ldb/include/ldb_errors.h312
-rw-r--r--source4/lib/ldb/include/ldb_handlers.h40
-rw-r--r--source4/lib/ldb/include/ldb_module.h344
-rw-r--r--source4/lib/ldb/include/ldb_private.h184
-rw-r--r--source4/lib/ldb/ldb.pc.in16
-rw-r--r--source4/lib/ldb/ldb_ldap/ldb_ldap.c982
-rw-r--r--source4/lib/ldb/ldb_map/ldb_map.c1139
-rw-r--r--source4/lib/ldb/ldb_map/ldb_map.h173
-rw-r--r--source4/lib/ldb/ldb_map/ldb_map_inbound.c837
-rw-r--r--source4/lib/ldb/ldb_map/ldb_map_outbound.c1407
-rw-r--r--source4/lib/ldb/ldb_map/ldb_map_private.h96
-rw-r--r--source4/lib/ldb/ldb_sqlite3/README7
-rw-r--r--source4/lib/ldb/ldb_sqlite3/base160.c154
-rw-r--r--source4/lib/ldb/ldb_sqlite3/ldb_sqlite3.c1940
-rw-r--r--source4/lib/ldb/ldb_sqlite3/schema328
-rw-r--r--source4/lib/ldb/ldb_sqlite3/trees.ps1760
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_cache.c490
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_index.c1599
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_pack.c292
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_search.c618
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_tdb.c1519
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_tdb.h139
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c165
-rw-r--r--source4/lib/ldb/mainpage.dox80
-rw-r--r--source4/lib/ldb/man/ldb.3.xml262
-rw-r--r--source4/lib/ldb/man/ldbadd.1.xml105
-rw-r--r--source4/lib/ldb/man/ldbdel.1.xml105
-rw-r--r--source4/lib/ldb/man/ldbedit.1.xml200
-rw-r--r--source4/lib/ldb/man/ldbmodify.1.xml93
-rw-r--r--source4/lib/ldb/man/ldbrename.1.xml107
-rw-r--r--source4/lib/ldb/man/ldbsearch.1.xml119
-rw-r--r--source4/lib/ldb/modules/asq.c416
-rw-r--r--source4/lib/ldb/modules/paged_results.c438
-rw-r--r--source4/lib/ldb/modules/paged_searches.c386
-rw-r--r--source4/lib/ldb/modules/rdn_name.c453
-rw-r--r--source4/lib/ldb/modules/skel.c147
-rw-r--r--source4/lib/ldb/modules/sort.c360
-rw-r--r--source4/lib/ldb/nssldb/README.txt34
-rw-r--r--source4/lib/ldb/nssldb/ldb-grp.c429
-rw-r--r--source4/lib/ldb/nssldb/ldb-nss.c395
-rw-r--r--source4/lib/ldb/nssldb/ldb-nss.h84
-rw-r--r--source4/lib/ldb/nssldb/ldb-pwd.c242
-rw-r--r--source4/lib/ldb/pyldb-util.pc.in13
-rw-r--r--source4/lib/ldb/pyldb.c3302
-rw-r--r--source4/lib/ldb/pyldb.h105
-rw-r--r--source4/lib/ldb/pyldb_util.c119
-rw-r--r--source4/lib/ldb/tests/init.ldif41
-rwxr-xr-xsource4/lib/ldb/tests/init_slapd.sh41
-rwxr-xr-xsource4/lib/ldb/tests/kill_slapd.sh12
-rwxr-xr-xsource4/lib/ldb/tests/ldapi_url.sh11
-rw-r--r--source4/lib/ldb/tests/photo.ldif5
-rwxr-xr-xsource4/lib/ldb/tests/python/api.py748
-rw-r--r--source4/lib/ldb/tests/samba4.pngbin6239 -> 0 bytes
-rw-r--r--source4/lib/ldb/tests/sample_module.c71
-rw-r--r--source4/lib/ldb/tests/schema-tests/schema-add-test.ldif66
-rw-r--r--source4/lib/ldb/tests/schema-tests/schema-mod-test-1.ldif5
-rw-r--r--source4/lib/ldb/tests/schema-tests/schema-mod-test-2.ldif5
-rw-r--r--source4/lib/ldb/tests/schema-tests/schema-mod-test-3.ldif5
-rw-r--r--source4/lib/ldb/tests/schema-tests/schema-mod-test-4.ldif5
-rw-r--r--source4/lib/ldb/tests/schema-tests/schema-mod-test-5.ldif5
-rw-r--r--source4/lib/ldb/tests/schema-tests/schema.ldif100
-rw-r--r--source4/lib/ldb/tests/slapd.conf26
-rwxr-xr-xsource4/lib/ldb/tests/start_slapd.sh14
-rw-r--r--source4/lib/ldb/tests/test-attribs.ldif6
-rw-r--r--source4/lib/ldb/tests/test-config.ldif67
-rwxr-xr-xsource4/lib/ldb/tests/test-controls.sh45
-rw-r--r--source4/lib/ldb/tests/test-default-config.ldif17
-rwxr-xr-xsource4/lib/ldb/tests/test-extended.sh69
-rwxr-xr-xsource4/lib/ldb/tests/test-generic.sh128
-rw-r--r--source4/lib/ldb/tests/test-index.ldif7
-rwxr-xr-xsource4/lib/ldb/tests/test-ldap.sh54
-rw-r--r--source4/lib/ldb/tests/test-modify-modrdn.ldif12
-rw-r--r--source4/lib/ldb/tests/test-modify.ldif23
-rwxr-xr-xsource4/lib/ldb/tests/test-schema.sh34
-rwxr-xr-xsource4/lib/ldb/tests/test-soloading.sh32
-rwxr-xr-xsource4/lib/ldb/tests/test-sqlite3.sh25
-rw-r--r--source4/lib/ldb/tests/test-tdb-features.sh160
-rwxr-xr-xsource4/lib/ldb/tests/test-tdb.sh33
-rw-r--r--source4/lib/ldb/tests/test-wildcard.ldif5
-rw-r--r--source4/lib/ldb/tests/test-wrong_attributes.ldif3
-rw-r--r--source4/lib/ldb/tests/test.ldif417
-rw-r--r--source4/lib/ldb/tests/testdata.txt8
-rw-r--r--source4/lib/ldb/tests/testsearch.txt5
-rw-r--r--source4/lib/ldb/tools/cmdline.c469
-rw-r--r--source4/lib/ldb/tools/cmdline.h56
-rw-r--r--source4/lib/ldb/tools/ldbadd.c154
-rw-r--r--source4/lib/ldb/tools/ldbdel.c135
-rw-r--r--source4/lib/ldb/tools/ldbedit.c372
-rw-r--r--source4/lib/ldb/tools/ldbmodify.c156
-rw-r--r--source4/lib/ldb/tools/ldbrename.c84
-rw-r--r--source4/lib/ldb/tools/ldbsearch.c317
-rw-r--r--source4/lib/ldb/tools/ldbtest.c434
-rw-r--r--source4/lib/ldb/tools/ldbutil.c219
-rw-r--r--source4/lib/ldb/tools/ldbutil.h46
-rw-r--r--source4/lib/ldb/web/index.html74
-rwxr-xr-xsource4/lib/ldb/wscript287
-rwxr-xr-xsource4/selftest/tests.py4
150 files changed, 2 insertions, 49342 deletions
diff --git a/source4/lib/ldb-samba/README b/source4/lib/ldb-samba/README
deleted file mode 100644
index 3fa47159ca..0000000000
--- a/source4/lib/ldb-samba/README
+++ /dev/null
@@ -1,7 +0,0 @@
-This directory contains Samba specific extensions to ldb. It also
-serves as example code on how to extend ldb for your own application.
-
-The main extension Samba uses is to provide ldif encode/decode
-routines for specific attributes, so users can get nice pretty
-printing of attributes in ldbedit, while the attributes are stored in
-the standard NDR format in the database.
diff --git a/source4/lib/ldb-samba/ldb_ildap.c b/source4/lib/ldb-samba/ldb_ildap.c
deleted file mode 100644
index 3c28690bd6..0000000000
--- a/source4/lib/ldb-samba/ldb_ildap.c
+++ /dev/null
@@ -1,879 +0,0 @@
-/*
- ldb database library - ildap backend
-
- Copyright (C) Andrew Tridgell 2005
- Copyright (C) Simo Sorce 2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * 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 asynchronous calls
- * date: Feb 2006
- * author: Simo Sorce
- */
-
-#include "includes.h"
-#include "ldb_module.h"
-#include "util/dlinklist.h"
-
-#include "libcli/ldap/libcli_ldap.h"
-#include "libcli/ldap/ldap_client.h"
-#include "auth/auth.h"
-#include "auth/credentials/credentials.h"
-
-struct ildb_private {
- struct ldap_connection *ldap;
- struct tevent_context *event_ctx;
-};
-
-struct ildb_context {
- struct ldb_module *module;
- struct ldb_request *req;
-
- struct ildb_private *ildb;
- struct ldap_request *ireq;
-
- /* indicate we are already processing
- * the ldap_request in ildb_callback() */
- bool in_ildb_callback;
-
- bool done;
-
- struct ildb_destructor_ctx *dc;
-};
-
-static void ildb_request_done(struct ildb_context *ctx,
- struct ldb_control **ctrls, int error)
-{
- struct ldb_context *ldb;
- struct ldb_reply *ares;
-
- ldb = ldb_module_get_ctx(ctx->module);
-
- ctx->done = true;
-
- if (ctx->req == NULL) {
- /* if the req has been freed already just return */
- return;
- }
-
- ares = talloc_zero(ctx->req, struct ldb_reply);
- if (!ares) {
- ldb_oom(ldb);
- ctx->req->callback(ctx->req, NULL);
- return;
- }
- ares->type = LDB_REPLY_DONE;
- ares->controls = talloc_steal(ares, ctrls);
- ares->error = error;
-
- ctx->req->callback(ctx->req, ares);
-}
-
-static void ildb_auto_done_callback(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval t,
- void *private_data)
-{
- struct ildb_context *ac;
-
- ac = talloc_get_type(private_data, struct ildb_context);
- ildb_request_done(ac, NULL, LDB_SUCCESS);
-}
-
-/*
- convert a ldb_message structure to a list of ldap_mod structures
- ready for ildap_add() or ildap_modify()
-*/
-static struct ldap_mod **ildb_msg_to_mods(void *mem_ctx, int *num_mods,
- const struct ldb_message *msg,
- int use_flags)
-{
- struct ldap_mod **mods;
- unsigned int i;
- int n = 0;
-
- /* allocate maximum number of elements needed */
- mods = talloc_array(mem_ctx, struct ldap_mod *, msg->num_elements+1);
- if (!mods) {
- errno = ENOMEM;
- return NULL;
- }
- mods[0] = NULL;
-
- for (i = 0; i < msg->num_elements; i++) {
- const struct ldb_message_element *el = &msg->elements[i];
-
- mods[n] = talloc(mods, struct ldap_mod);
- if (!mods[n]) {
- goto failed;
- }
- mods[n + 1] = NULL;
- mods[n]->type = 0;
- mods[n]->attrib = *el;
- if (use_flags) {
- switch (el->flags & LDB_FLAG_MOD_MASK) {
- case LDB_FLAG_MOD_ADD:
- mods[n]->type = LDAP_MODIFY_ADD;
- break;
- case LDB_FLAG_MOD_DELETE:
- mods[n]->type = LDAP_MODIFY_DELETE;
- break;
- case LDB_FLAG_MOD_REPLACE:
- mods[n]->type = LDAP_MODIFY_REPLACE;
- break;
- }
- }
- n++;
- }
-
- *num_mods = n;
- return mods;
-
-failed:
- talloc_free(mods);
- return NULL;
-}
-
-
-/*
- map an ildap NTSTATUS to a ldb error code
-*/
-static int ildb_map_error(struct ldb_module *module, NTSTATUS status)
-{
- struct ildb_private *ildb;
- struct ldb_context *ldb;
- TALLOC_CTX *mem_ctx;
-
- ildb = talloc_get_type(ldb_module_get_private(module), struct ildb_private);
- ldb = ldb_module_get_ctx(module);
-
- if (NT_STATUS_IS_OK(status)) {
- return LDB_SUCCESS;
- }
-
- mem_ctx = talloc_new(ildb);
- if (!mem_ctx) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ldb_set_errstring(ldb,
- ldap_errstr(ildb->ldap, mem_ctx, status));
- talloc_free(mem_ctx);
- if (NT_STATUS_IS_LDAP(status)) {
- return NT_STATUS_LDAP_CODE(status);
- }
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-static void ildb_request_timeout(struct tevent_context *ev, struct tevent_timer *te,
- struct timeval t, void *private_data)
-{
- struct ildb_context *ac = talloc_get_type(private_data, struct ildb_context);
-
- if (ac->ireq->state == LDAP_REQUEST_PENDING) {
- DLIST_REMOVE(ac->ireq->conn->pending, ac->ireq);
- }
-
- ildb_request_done(ac, NULL, LDB_ERR_TIME_LIMIT_EXCEEDED);
-}
-
-static void ildb_callback(struct ldap_request *req)
-{
- struct ldb_context *ldb;
- struct ildb_context *ac;
- NTSTATUS status;
- struct ldap_SearchResEntry *search;
- struct ldap_message *msg;
- struct ldb_control **controls;
- struct ldb_message *ldbmsg;
- char *referral;
- bool callback_failed;
- bool request_done;
- int ret;
- int i;
-
- ac = talloc_get_type(req->async.private_data, struct ildb_context);
- ldb = ldb_module_get_ctx(ac->module);
- callback_failed = false;
- request_done = false;
- controls = NULL;
-
- /* check if we are already processing this request */
- if (ac->in_ildb_callback) {
- return;
- }
- /* mark the request as being in process */
- ac->in_ildb_callback = true;
-
- if (!NT_STATUS_IS_OK(req->status)) {
- ret = ildb_map_error(ac->module, req->status);
- ildb_request_done(ac, NULL, ret);
- return;
- }
-
- if (req->num_replies < 1) {
- ret = LDB_ERR_OPERATIONS_ERROR;
- ildb_request_done(ac, NULL, ret);
- return;
- }
-
- switch (req->type) {
-
- case LDAP_TAG_ModifyRequest:
- if (req->replies[0]->type != LDAP_TAG_ModifyResponse) {
- ret = LDB_ERR_PROTOCOL_ERROR;
- break;
- }
- status = ldap_check_response(ac->ireq->conn, &req->replies[0]->r.GeneralResult);
- ret = ildb_map_error(ac->module, status);
- request_done = true;
- break;
-
- case LDAP_TAG_AddRequest:
- if (req->replies[0]->type != LDAP_TAG_AddResponse) {
- ret = LDB_ERR_PROTOCOL_ERROR;
- return;
- }
- status = ldap_check_response(ac->ireq->conn, &req->replies[0]->r.GeneralResult);
- ret = ildb_map_error(ac->module, status);
- request_done = true;
- break;
-
- case LDAP_TAG_DelRequest:
- if (req->replies[0]->type != LDAP_TAG_DelResponse) {
- ret = LDB_ERR_PROTOCOL_ERROR;
- return;
- }
- status = ldap_check_response(ac->ireq->conn, &req->replies[0]->r.GeneralResult);
- ret = ildb_map_error(ac->module, status);
- request_done = true;
- break;
-
- case LDAP_TAG_ModifyDNRequest:
- if (req->replies[0]->type != LDAP_TAG_ModifyDNResponse) {
- ret = LDB_ERR_PROTOCOL_ERROR;
- return;
- }
- status = ldap_check_response(ac->ireq->conn, &req->replies[0]->r.GeneralResult);
- ret = ildb_map_error(ac->module, status);
- request_done = true;
- break;
-
- case LDAP_TAG_SearchRequest:
- /* loop over all messages */
- for (i = 0; i < req->num_replies; i++) {
-
- msg = req->replies[i];
- switch (msg->type) {
-
- case LDAP_TAG_SearchResultDone:
-
- status = ldap_check_response(ac->ireq->conn, &msg->r.GeneralResult);
- if (!NT_STATUS_IS_OK(status)) {
- ret = ildb_map_error(ac->module, status);
- break;
- }
-
- controls = talloc_steal(ac, msg->controls);
- if (msg->r.SearchResultDone.resultcode) {
- if (msg->r.SearchResultDone.errormessage) {
- ldb_set_errstring(ldb, msg->r.SearchResultDone.errormessage);
- }
- }
-
- ret = msg->r.SearchResultDone.resultcode;
- request_done = true;
- break;
-
- case LDAP_TAG_SearchResultEntry:
-
- ldbmsg = ldb_msg_new(ac);
- if (!ldbmsg) {
- ret = LDB_ERR_OPERATIONS_ERROR;
- break;
- }
-
- search = &(msg->r.SearchResultEntry);
-
- ldbmsg->dn = ldb_dn_new(ldbmsg, ldb, search->dn);
- if ( ! ldb_dn_validate(ldbmsg->dn)) {
- ret = LDB_ERR_OPERATIONS_ERROR;
- break;
- }
- ldbmsg->num_elements = search->num_attributes;
- ldbmsg->elements = talloc_move(ldbmsg, &search->attributes);
-
- controls = talloc_steal(ac, msg->controls);
-
- ret = ldb_module_send_entry(ac->req, ldbmsg, controls);
- if (ret != LDB_SUCCESS) {
- callback_failed = true;
- }
-
- break;
-
- case LDAP_TAG_SearchResultReference:
-
- referral = talloc_strdup(ac, msg->r.SearchResultReference.referral);
-
- ret = ldb_module_send_referral(ac->req, referral);
- if (ret != LDB_SUCCESS) {
- callback_failed = true;
- }
-
- break;
-
- default:
- /* TAG not handled, fail ! */
- ret = LDB_ERR_PROTOCOL_ERROR;
- break;
- }
-
- if (ret != LDB_SUCCESS) {
- break;
- }
- }
-
- talloc_free(req->replies);
- req->replies = NULL;
- req->num_replies = 0;
-
- break;
-
- default:
- ret = LDB_ERR_PROTOCOL_ERROR;
- break;
- }
-
- if (ret != LDB_SUCCESS) {
-
- /* if the callback failed the caller will have freed the
- * request. Just return and don't try to use it */
- if ( ! callback_failed) {
- request_done = true;
- }
- }
-
- /* mark the request as not being in progress */
- ac->in_ildb_callback = false;
-
- if (request_done) {
- ildb_request_done(ac, controls, ret);
- }
-
- return;
-}
-
-static int ildb_request_send(struct ildb_context *ac, struct ldap_message *msg)
-{
- struct ldb_context *ldb;
- struct ldap_request *req;
-
- if (!ac) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ldb = ldb_module_get_ctx(ac->module);
-
- ldb_request_set_state(ac->req, LDB_ASYNC_PENDING);
-
- req = ldap_request_send(ac->ildb->ldap, msg);
- if (req == NULL) {
- ldb_set_errstring(ldb, "async send request failed");
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ac->ireq = talloc_reparent(ac->ildb->ldap, ac, req);
-
- if (!ac->ireq->conn) {
- ldb_set_errstring(ldb, "connection to remote LDAP server dropped?");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- talloc_free(req->time_event);
- req->time_event = NULL;
- if (ac->req->timeout) {
- req->time_event = tevent_add_timer(ac->ildb->event_ctx, ac,
- timeval_current_ofs(ac->req->timeout, 0),
- ildb_request_timeout, ac);
- }
-
- req->async.fn = ildb_callback;
- req->async.private_data = ac;
-
- return LDB_SUCCESS;
-}
-
-/*
- search for matching records using an asynchronous function
- */
-static int ildb_search(struct ildb_context *ac)
-{
- struct ldb_context *ldb;
- struct ldb_request *req = ac->req;
- struct ldap_message *msg;
- int n;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- if (!req->callback || !req->context) {
- ldb_set_errstring(ldb, "Async interface called with NULL callback function or NULL context");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (req->op.search.tree == NULL) {
- ldb_set_errstring(ldb, "Invalid expression parse tree");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg = new_ldap_message(req);
- if (msg == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg->type = LDAP_TAG_SearchRequest;
-
- if (req->op.search.base == NULL) {
- msg->r.SearchRequest.basedn = talloc_strdup(msg, "");
- } else {
- msg->r.SearchRequest.basedn = ldb_dn_get_extended_linearized(msg, req->op.search.base, 0);
- }
- if (msg->r.SearchRequest.basedn == NULL) {
- ldb_set_errstring(ldb, "Unable to determine baseDN");
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (req->op.search.scope == LDB_SCOPE_DEFAULT) {
- msg->r.SearchRequest.scope = LDB_SCOPE_SUBTREE;
- } else {
- msg->r.SearchRequest.scope = req->op.search.scope;
- }
-
- msg->r.SearchRequest.deref = LDAP_DEREFERENCE_NEVER;
- msg->r.SearchRequest.timelimit = 0;
- msg->r.SearchRequest.sizelimit = 0;
- msg->r.SearchRequest.attributesonly = 0;
- msg->r.SearchRequest.tree = discard_const(req->op.search.tree);
-
- for (n = 0; req->op.search.attrs && req->op.search.attrs[n]; n++) /* noop */ ;
- msg->r.SearchRequest.num_attributes = n;
- msg->r.SearchRequest.attributes = req->op.search.attrs;
- msg->controls = req->controls;
-
- return ildb_request_send(ac, msg);
-}
-
-/*
- add a record
-*/
-static int ildb_add(struct ildb_context *ac)
-{
- struct ldb_request *req = ac->req;
- struct ldap_message *msg;
- struct ldap_mod **mods;
- int i,n;
-
- msg = new_ldap_message(req);
- if (msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg->type = LDAP_TAG_AddRequest;
-
- msg->r.AddRequest.dn = ldb_dn_get_extended_linearized(msg, req->op.add.message->dn, 0);
- if (msg->r.AddRequest.dn == NULL) {
- talloc_free(msg);
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- mods = ildb_msg_to_mods(msg, &n, req->op.add.message, 0);
- if (mods == NULL) {
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg->r.AddRequest.num_attributes = n;
- msg->r.AddRequest.attributes = talloc_array(msg, struct ldb_message_element, n);
- if (msg->r.AddRequest.attributes == NULL) {
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- for (i = 0; i < n; i++) {
- msg->r.AddRequest.attributes[i] = mods[i]->attrib;
- }
- msg->controls = req->controls;
-
- return ildb_request_send(ac, msg);
-}
-
-/*
- modify a record
-*/
-static int ildb_modify(struct ildb_context *ac)
-{
- struct ldb_request *req = ac->req;
- struct ldap_message *msg;
- struct ldap_mod **mods;
- int i,n;
-
- msg = new_ldap_message(req);
- if (msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg->type = LDAP_TAG_ModifyRequest;
-
- msg->r.ModifyRequest.dn = ldb_dn_get_extended_linearized(msg, req->op.mod.message->dn, 0);
- if (msg->r.ModifyRequest.dn == NULL) {
- talloc_free(msg);
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- mods = ildb_msg_to_mods(msg, &n, req->op.mod.message, 1);
- if (mods == NULL) {
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg->r.ModifyRequest.num_mods = n;
- msg->r.ModifyRequest.mods = talloc_array(msg, struct ldap_mod, n);
- if (msg->r.ModifyRequest.mods == NULL) {
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- for (i = 0; i < n; i++) {
- msg->r.ModifyRequest.mods[i] = *mods[i];
- }
- msg->controls = req->controls;
- return ildb_request_send(ac, msg);
-}
-
-/*
- delete a record
-*/
-static int ildb_delete(struct ildb_context *ac)
-{
- struct ldb_request *req = ac->req;
- struct ldap_message *msg;
-
- msg = new_ldap_message(req);
- if (msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg->type = LDAP_TAG_DelRequest;
-
- msg->r.DelRequest.dn = ldb_dn_get_extended_linearized(msg, req->op.del.dn, 0);
- if (msg->r.DelRequest.dn == NULL) {
- talloc_free(msg);
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
- msg->controls = req->controls;
-
- return ildb_request_send(ac, msg);
-}
-
-/*
- rename a record
-*/
-static int ildb_rename(struct ildb_context *ac)
-{
- struct ldb_request *req = ac->req;
- struct ldap_message *msg;
- const char *rdn_name;
- const struct ldb_val *rdn_val;
-
- msg = new_ldap_message(req);
- if (msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg->type = LDAP_TAG_ModifyDNRequest;
- msg->r.ModifyDNRequest.dn = ldb_dn_get_extended_linearized(msg, req->op.rename.olddn, 0);
- if (msg->r.ModifyDNRequest.dn == NULL) {
- talloc_free(msg);
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- rdn_name = ldb_dn_get_rdn_name(req->op.rename.newdn);
- rdn_val = ldb_dn_get_rdn_val(req->op.rename.newdn);
-
- if ((rdn_name != NULL) && (rdn_val != NULL)) {
- msg->r.ModifyDNRequest.newrdn =
- talloc_asprintf(msg, "%s=%s", rdn_name,
- rdn_val->length > 0 ? ldb_dn_escape_value(msg, *rdn_val) : "");
- } else {
- msg->r.ModifyDNRequest.newrdn = talloc_strdup(msg, "");
- }
- if (msg->r.ModifyDNRequest.newrdn == NULL) {
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg->r.ModifyDNRequest.newsuperior =
- ldb_dn_alloc_linearized(msg, ldb_dn_get_parent(msg, req->op.rename.newdn));
- if (msg->r.ModifyDNRequest.newsuperior == NULL) {
- talloc_free(msg);
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- msg->r.ModifyDNRequest.deleteolddn = true;
- msg->controls = req->controls;
-
- return ildb_request_send(ac, msg);
-}
-
-static int ildb_start_trans(struct ldb_module *module)
-{
- /* TODO implement a local locking mechanism here */
-
- return LDB_SUCCESS;
-}
-
-static int ildb_end_trans(struct ldb_module *module)
-{
- /* TODO implement a local transaction mechanism here */
-
- return LDB_SUCCESS;
-}
-
-static int ildb_del_trans(struct ldb_module *module)
-{
- /* TODO implement a local locking mechanism here */
-
- return LDB_SUCCESS;
-}
-
-static bool ildb_dn_is_special(struct ldb_request *req)
-{
- struct ldb_dn *dn = NULL;
-
- switch (req->operation) {
- case LDB_ADD:
- dn = req->op.add.message->dn;
- break;
- case LDB_MODIFY:
- dn = req->op.mod.message->dn;
- break;
- case LDB_DELETE:
- dn = req->op.del.dn;
- break;
- case LDB_RENAME:
- dn = req->op.rename.olddn;
- break;
- default:
- break;
- }
-
- if (dn && ldb_dn_is_special(dn)) {
- return true;
- }
- return false;
-}
-
-static int ildb_handle_request(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct ildb_private *ildb;
- struct ildb_context *ac;
- struct tevent_timer *te;
- int ret;
-
- ildb = talloc_get_type(ldb_module_get_private(module), struct ildb_private);
- ldb = ldb_module_get_ctx(module);
-
- if (req->starttime == 0 || req->timeout == 0) {
- ldb_set_errstring(ldb, "Invalid timeout settings");
- return LDB_ERR_TIME_LIMIT_EXCEEDED;
- }
-
- ac = talloc_zero(req, struct ildb_context);
- if (ac == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->module = module;
- ac->req = req;
- ac->ildb = ildb;
-
- if (ildb_dn_is_special(req)) {
-
- te = tevent_add_timer(ac->ildb->event_ctx,
- ac, timeval_zero(),
- ildb_auto_done_callback, ac);
- if (NULL == te) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
- }
-
- switch (ac->req->operation) {
- case LDB_SEARCH:
- ret = ildb_search(ac);
- break;
- case LDB_ADD:
- ret = ildb_add(ac);
- break;
- case LDB_MODIFY:
- ret = ildb_modify(ac);
- break;
- case LDB_DELETE:
- ret = ildb_delete(ac);
- break;
- case LDB_RENAME:
- ret = ildb_rename(ac);
- break;
- default:
- /* no other op supported */
- ret = LDB_ERR_PROTOCOL_ERROR;
- break;
- }
-
- return ret;
-}
-
-static const struct ldb_module_ops ildb_ops = {
- .name = "ldap",
- .search = ildb_handle_request,
- .add = ildb_handle_request,
- .modify = ildb_handle_request,
- .del = ildb_handle_request,
- .rename = ildb_handle_request,
-/* .request = ildb_handle_request, */
- .start_transaction = ildb_start_trans,
- .end_transaction = ildb_end_trans,
- .del_transaction = ildb_del_trans,
-};
-
-/*
- connect to the database
-*/
-static int ildb_connect(struct ldb_context *ldb, const char *url,
- unsigned int flags, const char *options[],
- struct ldb_module **_module)
-{
- struct ldb_module *module;
- struct ildb_private *ildb;
- NTSTATUS status;
- struct cli_credentials *creds;
- struct loadparm_context *lp_ctx;
-
- module = ldb_module_new(ldb, ldb, "ldb_ildap backend", &ildb_ops);
- if (!module) return LDB_ERR_OPERATIONS_ERROR;
-
- ildb = talloc(module, struct ildb_private);
- if (!ildb) {
- ldb_oom(ldb);
- goto failed;
- }
- ldb_module_set_private(module, ildb);
-
- ildb->event_ctx = ldb_get_event_context(ldb);
-
- lp_ctx = talloc_get_type(ldb_get_opaque(ldb, "loadparm"),
- struct loadparm_context);
-
- ildb->ldap = ldap4_new_connection(ildb, lp_ctx,
- ildb->event_ctx);
- if (!ildb->ldap) {
- ldb_oom(ldb);
- goto failed;
- }
-
- if (flags & LDB_FLG_RECONNECT) {
- ldap_set_reconn_params(ildb->ldap, 10);
- }
-
- status = ldap_connect(ildb->ldap, url);
- if (!NT_STATUS_IS_OK(status)) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Failed to connect to ldap URL '%s' - %s",
- url, ldap_errstr(ildb->ldap, module, status));
- goto failed;
- }
-
- /* caller can optionally setup credentials using the opaque token 'credentials' */
- creds = talloc_get_type(ldb_get_opaque(ldb, "credentials"), struct cli_credentials);
- if (creds == NULL) {
- struct auth_session_info *session_info = talloc_get_type(ldb_get_opaque(ldb, "sessionInfo"), struct auth_session_info);
- if (session_info) {
- creds = session_info->credentials;
- }
- }
-
- if (creds != NULL && cli_credentials_authentication_requested(creds)) {
- const char *bind_dn = cli_credentials_get_bind_dn(creds);
- if (bind_dn) {
- const char *password = cli_credentials_get_password(creds);
- status = ldap_bind_simple(ildb->ldap, bind_dn, password);
- if (!NT_STATUS_IS_OK(status)) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Failed to bind - %s",
- ldap_errstr(ildb->ldap, module, status));
- goto failed;
- }
- } else {
- status = ldap_bind_sasl(ildb->ldap, creds, lp_ctx);
- if (!NT_STATUS_IS_OK(status)) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Failed to bind - %s",
- ldap_errstr(ildb->ldap, module, status));
- goto failed;
- }
- }
- }
-
- *_module = module;
- return LDB_SUCCESS;
-
-failed:
- talloc_free(module);
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-/*
- initialise the module
- */
-_PUBLIC_ int ldb_ildap_init(const char *ldb_version)
-{
- int ret, i;
- const char *names[] = { "ldap", "ldaps", "ldapi", NULL };
- for (i=0; names[i]; i++) {
- ret = ldb_register_backend(names[i], ildb_connect, true);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
- return LDB_SUCCESS;
-}
diff --git a/source4/lib/ldb-samba/ldb_wrap.c b/source4/lib/ldb-samba/ldb_wrap.c
deleted file mode 100644
index 66213bf288..0000000000
--- a/source4/lib/ldb-samba/ldb_wrap.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
-
- LDB wrap functions
-
- Copyright (C) Andrew Tridgell 2004-2009
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- the stupidity of the unix fcntl locking design forces us to never
- allow a database file to be opened twice in the same process. These
- wrappers provide convenient access to a tdb or ldb, taking advantage
- of talloc destructors to ensure that only a single open is done
-*/
-
-#include "includes.h"
-#include "lib/events/events.h"
-#include <ldb.h>
-#include <ldb_errors.h>
-#include "lib/ldb-samba/ldif_handlers.h"
-#include "ldb_wrap.h"
-#include "dsdb/samdb/samdb.h"
-#include "param/param.h"
-#include "../lib/util/dlinklist.h"
-#include "../lib/tdb_compat/tdb_compat.h"
-
-/*
- this is used to catch debug messages from ldb
-*/
-static void ldb_wrap_debug(void *context, enum ldb_debug_level level,
- const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
-
-static void ldb_wrap_debug(void *context, enum ldb_debug_level level,
- const char *fmt, va_list ap)
-{
- int samba_level = -1;
- char *s = NULL;
- switch (level) {
- case LDB_DEBUG_FATAL:
- samba_level = 0;
- break;
- case LDB_DEBUG_ERROR:
- samba_level = 1;
- break;
- case LDB_DEBUG_WARNING:
- samba_level = 2;
- break;
- case LDB_DEBUG_TRACE:
- samba_level = 5;
- break;
-
- };
- vasprintf(&s, fmt, ap);
- if (!s) return;
- DEBUG(samba_level, ("ldb: %s\n", s));
- free(s);
-}
-
-
-/*
- connecting to a ldb can be a relatively expensive operation because
- of the schema and partition loads. We keep a list of open ldb
- contexts here, and try to re-use when possible.
-
- This means callers of ldb_wrap_connect() must use talloc_unlink() or
- the free of a parent to destroy the context
- */
-static struct ldb_wrap {
- struct ldb_wrap *next, *prev;
- struct ldb_wrap_context {
- /* the context is what we use to tell if two ldb
- * connections are exactly equivalent
- */
- const char *url;
- struct tevent_context *ev;
- struct loadparm_context *lp_ctx;
- struct auth_session_info *session_info;
- struct cli_credentials *credentials;
- unsigned int flags;
- } context;
- struct ldb_context *ldb;
-} *ldb_wrap_list;
-
-/*
- free a ldb_wrap structure
- */
-static int ldb_wrap_destructor(struct ldb_wrap *w)
-{
- DLIST_REMOVE(ldb_wrap_list, w);
- return 0;
-}
-
-/*
- * The casefolder for s4's LDB databases - Unicode-safe
- */
-char *wrap_casefold(void *context, void *mem_ctx, const char *s, size_t n)
-{
- return strupper_talloc_n(mem_ctx, s, n);
-}
-
-
- struct ldb_context *samba_ldb_init(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct loadparm_context *lp_ctx,
- struct auth_session_info *session_info,
- struct cli_credentials *credentials)
-{
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_init(mem_ctx, ev);
- if (ldb == NULL) {
- return NULL;
- }
-
- ldb_set_modules_dir(ldb, modules_path(ldb, "ldb"));
-
- ldb_set_debug(ldb, ldb_wrap_debug, NULL);
-
- ldb_set_utf8_fns(ldb, NULL, wrap_casefold);
-
- if (session_info) {
- if (ldb_set_opaque(ldb, "sessionInfo", session_info)) {
- talloc_free(ldb);
- return NULL;
- }
- }
-
- if (credentials) {
- if (ldb_set_opaque(ldb, "credentials", credentials)) {
- talloc_free(ldb);
- return NULL;
- }
- }
-
- if (ldb_set_opaque(ldb, "loadparm", lp_ctx)) {
- talloc_free(ldb);
- return NULL;
- }
-
- /* This must be done before we load the schema, as these
- * handlers for objectSid and objectGUID etc must take
- * precedence over the 'binary attribute' declaration in the
- * schema */
- ret = ldb_register_samba_handlers(ldb);
- if (ret != LDB_SUCCESS) {
- talloc_free(ldb);
- return NULL;
- }
-
- /* we usually want Samba databases to be private. If we later
- find we need one public, we will need to add a parameter to
- ldb_wrap_connect() */
- ldb_set_create_perms(ldb, 0600);
-
- return ldb;
-}
-
- struct ldb_context *ldb_wrap_find(const char *url,
- struct tevent_context *ev,
- struct loadparm_context *lp_ctx,
- struct auth_session_info *session_info,
- struct cli_credentials *credentials,
- unsigned int flags)
-{
- struct ldb_wrap *w;
- /* see if we can re-use an existing ldb */
- for (w=ldb_wrap_list; w; w=w->next) {
- if (w->context.ev == ev &&
- w->context.lp_ctx == lp_ctx &&
- w->context.session_info == session_info &&
- w->context.credentials == credentials &&
- w->context.flags == flags &&
- (w->context.url == url || strcmp(w->context.url, url) == 0))
- return w->ldb;
- }
-
- return NULL;
-}
-
-int samba_ldb_connect(struct ldb_context *ldb, struct loadparm_context *lp_ctx,
- const char *url, unsigned int flags)
-{
- int ret;
- char *real_url = NULL;
-
- /* allow admins to force non-sync ldb for all databases */
- if (lpcfg_parm_bool(lp_ctx, NULL, "ldb", "nosync", false)) {
- flags |= LDB_FLG_NOSYNC;
- }
-
- if (DEBUGLVL(10)) {
- flags |= LDB_FLG_ENABLE_TRACING;
- }
-
- real_url = lpcfg_private_path(ldb, lp_ctx, url);
- if (real_url == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_connect(ldb, real_url, flags, NULL);
-
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- /* setup for leak detection */
- ldb_set_opaque(ldb, "wrap_url", real_url);
-
- return LDB_SUCCESS;
-}
-
- bool ldb_wrap_add(const char *url, struct tevent_context *ev,
- struct loadparm_context *lp_ctx,
- struct auth_session_info *session_info,
- struct cli_credentials *credentials,
- unsigned int flags,
- struct ldb_context *ldb)
-{
- struct ldb_wrap *w;
- struct ldb_wrap_context c;
-
- /* add to the list of open ldb contexts */
- w = talloc(ldb, struct ldb_wrap);
- if (w == NULL) {
- return false;
- }
-
- c.url = url;
- c.ev = ev;
- c.lp_ctx = lp_ctx;
- c.session_info = session_info;
- c.credentials = credentials;
- c.flags = flags;
-
- w->context = c;
- w->context.url = talloc_strdup(w, url);
- if (w->context.url == NULL) {
- return false;
- }
-
- if (session_info) {
- /* take a reference to the session_info, as it is
- * possible for the ldb to live longer than the
- * session_info. This happens when a DRS DsBind call
- * reuses a handle, but the original connection is
- * shutdown. The token for the new connection is still
- * valid, so we need the session_info to remain valid for
- * ldb modules to use
- */
- if (talloc_reference(w, session_info) == NULL) {
- return false;
- }
- }
-
- w->ldb = ldb;
-
- DLIST_ADD(ldb_wrap_list, w);
-
- talloc_set_destructor(w, ldb_wrap_destructor);
-
- return true;
-}
-
-
-/*
- wrapped connection to a ldb database
- to close just talloc_free() the returned ldb_context
-
- TODO: We need an error_string parameter
- */
- struct ldb_context *ldb_wrap_connect(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct loadparm_context *lp_ctx,
- const char *url,
- struct auth_session_info *session_info,
- struct cli_credentials *credentials,
- unsigned int flags)
-{
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_wrap_find(url, ev, lp_ctx, session_info, credentials, flags);
- if (ldb != NULL)
- return talloc_reference(mem_ctx, ldb);
-
- ldb = samba_ldb_init(mem_ctx, ev, lp_ctx, session_info, credentials);
-
- if (ldb == NULL)
- return NULL;
-
- ret = samba_ldb_connect(ldb, lp_ctx, url, flags);
- if (ret != LDB_SUCCESS) {
- talloc_free(ldb);
- return NULL;
- }
-
- if (!ldb_wrap_add(url, ev, lp_ctx, session_info, credentials, flags, ldb)) {
- talloc_free(ldb);
- return NULL;
- }
-
- DEBUG(3,("ldb_wrap open of %s\n", url));
-
- return ldb;
-}
-
-/*
- when we fork() we need to make sure that any open ldb contexts have
- any open transactions cancelled
- */
- void ldb_wrap_fork_hook(void)
-{
- struct ldb_wrap *w;
-
- for (w=ldb_wrap_list; w; w=w->next) {
- if (ldb_transaction_cancel_noerr(w->ldb) != LDB_SUCCESS) {
- smb_panic("Failed to cancel child transactions\n");
- }
- }
-
- if (tdb_reopen_all(1) == -1) {
- smb_panic("tdb_reopen_all failed\n");
- }
-}
-
- char *ldb_relative_path(struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const char *name)
-{
- const char *base_url =
- (const char *)ldb_get_opaque(ldb, "ldb_url");
- char *path, *p, *full_name;
- if (name == NULL) {
- return NULL;
- }
- if (strncmp("tdb://", base_url, 6) == 0) {
- base_url = base_url+6;
- }
- path = talloc_strdup(mem_ctx, base_url);
- if (path == NULL) {
- return NULL;
- }
- if ( (p = strrchr(path, '/')) != NULL) {
- p[0] = '\0';
- full_name = talloc_asprintf(mem_ctx, "%s/%s", path, name);
- } else {
- full_name = talloc_asprintf(mem_ctx, "./%s", name);
- }
- talloc_free(path);
- return full_name;
-}
diff --git a/source4/lib/ldb-samba/ldb_wrap.h b/source4/lib/ldb-samba/ldb_wrap.h
deleted file mode 100644
index aa7ccb3a23..0000000000
--- a/source4/lib/ldb-samba/ldb_wrap.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
-
- database wrap headers
-
- Copyright (C) Andrew Tridgell 2004
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _LDB_WRAP_H_
-#define _LDB_WRAP_H_
-
-#include <talloc.h>
-
-struct auth_session_info;
-struct ldb_message;
-struct ldb_dn;
-struct cli_credentials;
-struct loadparm_context;
-struct tevent_context;
-
-char *wrap_casefold(void *context, void *mem_ctx, const char *s, size_t n);
-
-struct ldb_context *ldb_wrap_connect(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct loadparm_context *lp_ctx,
- const char *url,
- struct auth_session_info *session_info,
- struct cli_credentials *credentials,
- unsigned int flags);
-
-void ldb_wrap_fork_hook(void);
-
-struct ldb_context *samba_ldb_init(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct loadparm_context *lp_ctx,
- struct auth_session_info *session_info,
- struct cli_credentials *credentials);
-struct ldb_context *ldb_wrap_find(const char *url,
- struct tevent_context *ev,
- struct loadparm_context *lp_ctx,
- struct auth_session_info *session_info,
- struct cli_credentials *credentials,
- unsigned int flags);
-bool ldb_wrap_add(const char *url, struct tevent_context *ev,
- struct loadparm_context *lp_ctx,
- struct auth_session_info *session_info,
- struct cli_credentials *credentials,
- unsigned int flags,
- struct ldb_context *ldb);
-char *ldb_relative_path(struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const char *name);
-
-int samba_ldb_connect(struct ldb_context *ldb, struct loadparm_context *lp_ctx,
- const char *url, unsigned int flags);
-
-#endif /* _LDB_WRAP_H_ */
diff --git a/source4/lib/ldb-samba/ldif_handlers.c b/source4/lib/ldb-samba/ldif_handlers.c
deleted file mode 100644
index af3c4b46e1..0000000000
--- a/source4/lib/ldb-samba/ldif_handlers.c
+++ /dev/null
@@ -1,1416 +0,0 @@
-/*
- ldb database library - ldif handlers for Samba
-
- Copyright (C) Andrew Tridgell 2005
- Copyright (C) Andrew Bartlett 2006-2009
- Copyright (C) Matthias Dieter Wallnöfer 2009
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "includes.h"
-#include <ldb.h>
-#include <ldb_module.h>
-#include "ldb_handlers.h"
-#include "dsdb/samdb/samdb.h"
-#include "librpc/gen_ndr/ndr_security.h"
-#include "librpc/gen_ndr/ndr_misc.h"
-#include "librpc/gen_ndr/ndr_drsblobs.h"
-#include "librpc/gen_ndr/ndr_dnsp.h"
-#include "librpc/ndr/libndr.h"
-#include "libcli/security/security.h"
-#include "param/param.h"
-#include "../lib/util/asn1.h"
-
-/*
- use ndr_print_* to convert a NDR formatted blob to a ldif formatted blob
-
- If mask_errors is true, then function succeeds but out data
- is set to "<Unable to decode binary data>" message
-
- \return 0 on success; -1 on error
-*/
-static int ldif_write_NDR(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out,
- size_t struct_size,
- ndr_pull_flags_fn_t pull_fn,
- ndr_print_fn_t print_fn,
- bool mask_errors)
-{
- uint8_t *p;
- enum ndr_err_code err;
- if (!(ldb_get_flags(ldb) & LDB_FLG_SHOW_BINARY)) {
- return ldb_handler_copy(ldb, mem_ctx, in, out);
- }
- p = talloc_size(mem_ctx, struct_size);
- err = ndr_pull_struct_blob(in, mem_ctx,
- p, pull_fn);
- if (err != NDR_ERR_SUCCESS) {
- /* fail in not in mask_error mode */
- if (!mask_errors) {
- return -1;
- }
- talloc_free(p);
- out->data = (uint8_t *)talloc_strdup(mem_ctx, "<Unable to decode binary data>");
- out->length = strlen((const char *)out->data);
- return 0;
- }
- out->data = (uint8_t *)ndr_print_struct_string(mem_ctx, print_fn, "NDR", p);
- talloc_free(p);
- if (out->data == NULL) {
- return ldb_handler_copy(ldb, mem_ctx, in, out);
- }
- out->length = strlen((char *)out->data);
- return 0;
-}
-
-/*
- convert a ldif formatted objectSid to a NDR formatted blob
-*/
-static int ldif_read_objectSid(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- enum ndr_err_code ndr_err;
- struct dom_sid *sid;
- sid = dom_sid_parse_length(mem_ctx, in);
- if (sid == NULL) {
- return -1;
- }
- ndr_err = ndr_push_struct_blob(out, mem_ctx, sid,
- (ndr_push_flags_fn_t)ndr_push_dom_sid);
- talloc_free(sid);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- return -1;
- }
- return 0;
-}
-
-/*
- convert a NDR formatted blob to a ldif formatted objectSid
-*/
-int ldif_write_objectSid(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct dom_sid *sid;
- enum ndr_err_code ndr_err;
-
- sid = talloc(mem_ctx, struct dom_sid);
- if (sid == NULL) {
- return -1;
- }
- ndr_err = ndr_pull_struct_blob_all(in, sid, sid,
- (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- talloc_free(sid);
- return -1;
- }
- *out = data_blob_string_const(dom_sid_string(mem_ctx, sid));
- talloc_free(sid);
- if (out->data == NULL) {
- return -1;
- }
- return 0;
-}
-
-bool ldif_comparision_objectSid_isString(const struct ldb_val *v)
-{
- if (v->length < 3) {
- return false;
- }
-
- if (strncmp("S-", (const char *)v->data, 2) != 0) return false;
-
- return true;
-}
-
-/*
- compare two objectSids
-*/
-static int ldif_comparison_objectSid(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- if (ldif_comparision_objectSid_isString(v1) && ldif_comparision_objectSid_isString(v2)) {
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
- } else if (ldif_comparision_objectSid_isString(v1)
- && !ldif_comparision_objectSid_isString(v2)) {
- struct ldb_val v;
- int ret;
- if (ldif_read_objectSid(ldb, mem_ctx, v1, &v) != 0) {
- /* Perhaps not a string after all */
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
- }
- ret = ldb_comparison_binary(ldb, mem_ctx, &v, v2);
- talloc_free(v.data);
- return ret;
- } else if (!ldif_comparision_objectSid_isString(v1)
- && ldif_comparision_objectSid_isString(v2)) {
- struct ldb_val v;
- int ret;
- if (ldif_read_objectSid(ldb, mem_ctx, v2, &v) != 0) {
- /* Perhaps not a string after all */
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
- }
- ret = ldb_comparison_binary(ldb, mem_ctx, v1, &v);
- talloc_free(v.data);
- return ret;
- }
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
-}
-
-/*
- canonicalise a objectSid
-*/
-static int ldif_canonicalise_objectSid(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- if (ldif_comparision_objectSid_isString(in)) {
- if (ldif_read_objectSid(ldb, mem_ctx, in, out) != 0) {
- /* Perhaps not a string after all */
- return ldb_handler_copy(ldb, mem_ctx, in, out);
- }
- return 0;
- }
- return ldb_handler_copy(ldb, mem_ctx, in, out);
-}
-
-static int extended_dn_read_SID(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct dom_sid sid;
- enum ndr_err_code ndr_err;
- if (ldif_comparision_objectSid_isString(in)) {
- if (ldif_read_objectSid(ldb, mem_ctx, in, out) == 0) {
- return 0;
- }
- }
-
- /* Perhaps not a string after all */
- *out = data_blob_talloc(mem_ctx, NULL, in->length/2+1);
-
- if (!out->data) {
- return -1;
- }
-
- (*out).length = strhex_to_str((char *)out->data, out->length,
- (const char *)in->data, in->length);
-
- /* Check it looks like a SID */
- ndr_err = ndr_pull_struct_blob_all(out, mem_ctx, &sid,
- (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- return -1;
- }
- return 0;
-}
-
-/*
- convert a ldif formatted objectGUID to a NDR formatted blob
-*/
-static int ldif_read_objectGUID(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct GUID guid;
- NTSTATUS status;
-
- status = GUID_from_data_blob(in, &guid);
- if (!NT_STATUS_IS_OK(status)) {
- return -1;
- }
-
- status = GUID_to_ndr_blob(&guid, mem_ctx, out);
- if (!NT_STATUS_IS_OK(status)) {
- return -1;
- }
- return 0;
-}
-
-/*
- convert a NDR formatted blob to a ldif formatted objectGUID
-*/
-static int ldif_write_objectGUID(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct GUID guid;
- NTSTATUS status;
-
- status = GUID_from_ndr_blob(in, &guid);
- if (!NT_STATUS_IS_OK(status)) {
- return -1;
- }
- out->data = (uint8_t *)GUID_string(mem_ctx, &guid);
- if (out->data == NULL) {
- return -1;
- }
- out->length = strlen((const char *)out->data);
- return 0;
-}
-
-static bool ldif_comparision_objectGUID_isString(const struct ldb_val *v)
-{
- if (v->length != 36 && v->length != 38) return false;
-
- /* Might be a GUID string, can't be a binary GUID (fixed 16 bytes) */
- return true;
-}
-
-static int extended_dn_read_GUID(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct GUID guid;
- NTSTATUS status;
-
- if (in->length == 36 && ldif_read_objectGUID(ldb, mem_ctx, in, out) == 0) {
- return 0;
- }
-
- /* Try as 'hex' form */
- if (in->length != 32) {
- return -1;
- }
-
- *out = data_blob_talloc(mem_ctx, NULL, in->length/2+1);
-
- if (!out->data) {
- return -1;
- }
-
- (*out).length = strhex_to_str((char *)out->data, out->length,
- (const char *)in->data, in->length);
-
- /* Check it looks like a GUID */
- status = GUID_from_ndr_blob(out, &guid);
- if (!NT_STATUS_IS_OK(status)) {
- data_blob_free(out);
- return -1;
- }
- return 0;
-}
-
-/*
- compare two objectGUIDs
-*/
-static int ldif_comparison_objectGUID(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- if (ldif_comparision_objectGUID_isString(v1) && ldif_comparision_objectGUID_isString(v2)) {
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
- } else if (ldif_comparision_objectGUID_isString(v1)
- && !ldif_comparision_objectGUID_isString(v2)) {
- struct ldb_val v;
- int ret;
- if (ldif_read_objectGUID(ldb, mem_ctx, v1, &v) != 0) {
- /* Perhaps it wasn't a valid string after all */
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
- }
- ret = ldb_comparison_binary(ldb, mem_ctx, &v, v2);
- talloc_free(v.data);
- return ret;
- } else if (!ldif_comparision_objectGUID_isString(v1)
- && ldif_comparision_objectGUID_isString(v2)) {
- struct ldb_val v;
- int ret;
- if (ldif_read_objectGUID(ldb, mem_ctx, v2, &v) != 0) {
- /* Perhaps it wasn't a valid string after all */
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
- }
- ret = ldb_comparison_binary(ldb, mem_ctx, v1, &v);
- talloc_free(v.data);
- return ret;
- }
- return ldb_comparison_binary(ldb, mem_ctx, v1, v2);
-}
-
-/*
- canonicalise a objectGUID
-*/
-static int ldif_canonicalise_objectGUID(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- if (ldif_comparision_objectGUID_isString(in)) {
- if (ldif_read_objectGUID(ldb, mem_ctx, in, out) != 0) {
- /* Perhaps it wasn't a valid string after all */
- return ldb_handler_copy(ldb, mem_ctx, in, out);
- }
- return 0;
- }
- return ldb_handler_copy(ldb, mem_ctx, in, out);
-}
-
-
-/*
- convert a ldif (SDDL) formatted ntSecurityDescriptor to a NDR formatted blob
-*/
-static int ldif_read_ntSecurityDescriptor(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct security_descriptor *sd;
- enum ndr_err_code ndr_err;
-
- sd = talloc(mem_ctx, struct security_descriptor);
- if (sd == NULL) {
- return -1;
- }
-
- ndr_err = ndr_pull_struct_blob(in, sd, sd,
- (ndr_pull_flags_fn_t)ndr_pull_security_descriptor);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- /* If this does not parse, then it is probably SDDL, and we should try it that way */
-
- const struct dom_sid *sid = samdb_domain_sid(ldb);
- talloc_free(sd);
- sd = sddl_decode(mem_ctx, (const char *)in->data, sid);
- if (sd == NULL) {
- return -1;
- }
- }
-
- ndr_err = ndr_push_struct_blob(out, mem_ctx, sd,
- (ndr_push_flags_fn_t)ndr_push_security_descriptor);
- talloc_free(sd);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- return -1;
- }
-
- return 0;
-}
-
-/*
- convert a NDR formatted blob to a ldif formatted ntSecurityDescriptor (SDDL format)
-*/
-static int ldif_write_ntSecurityDescriptor(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct security_descriptor *sd;
- enum ndr_err_code ndr_err;
-
- if (ldb_get_flags(ldb) & LDB_FLG_SHOW_BINARY) {
- return ldif_write_NDR(ldb, mem_ctx, in, out,
- sizeof(struct security_descriptor),
- (ndr_pull_flags_fn_t)ndr_pull_security_descriptor,
- (ndr_print_fn_t)ndr_print_security_descriptor,
- true);
-
- }
-
- sd = talloc(mem_ctx, struct security_descriptor);
- if (sd == NULL) {
- return -1;
- }
- /* We can't use ndr_pull_struct_blob_all because this contains relative pointers */
- ndr_err = ndr_pull_struct_blob(in, sd, sd,
- (ndr_pull_flags_fn_t)ndr_pull_security_descriptor);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- talloc_free(sd);
- return -1;
- }
- out->data = (uint8_t *)sddl_encode(mem_ctx, sd, samdb_domain_sid_cache_only(ldb));
- talloc_free(sd);
- if (out->data == NULL) {
- return -1;
- }
- out->length = strlen((const char *)out->data);
- return 0;
-}
-
-/*
- canonicalise an objectCategory. We use the short form as the canonical form:
- cn=Person,cn=Schema,cn=Configuration,<basedn> becomes 'person'
-*/
-
-static int ldif_canonicalise_objectCategory(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct ldb_dn *dn1 = NULL;
- const struct dsdb_schema *schema = dsdb_get_schema(ldb, NULL);
- const struct dsdb_class *sclass;
- TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
- if (!tmp_ctx) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (!schema) {
- talloc_free(tmp_ctx);
- *out = data_blob_talloc(mem_ctx, in->data, in->length);
- if (in->data && !out->data) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- return LDB_SUCCESS;
- }
- dn1 = ldb_dn_from_ldb_val(tmp_ctx, ldb, in);
- if ( ! ldb_dn_validate(dn1)) {
- const char *lDAPDisplayName = talloc_strndup(tmp_ctx, (char *)in->data, in->length);
- sclass = dsdb_class_by_lDAPDisplayName(schema, lDAPDisplayName);
- if (sclass) {
- struct ldb_dn *dn = ldb_dn_new(mem_ctx, ldb,
- sclass->defaultObjectCategory);
- *out = data_blob_string_const(ldb_dn_alloc_casefold(mem_ctx, dn));
- talloc_free(tmp_ctx);
-
- if (!out->data) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- return LDB_SUCCESS;
- } else {
- *out = data_blob_talloc(mem_ctx, in->data, in->length);
- talloc_free(tmp_ctx);
-
- if (in->data && !out->data) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- return LDB_SUCCESS;
- }
- }
- *out = data_blob_string_const(ldb_dn_alloc_casefold(mem_ctx, dn1));
- talloc_free(tmp_ctx);
-
- if (!out->data) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- return LDB_SUCCESS;
-}
-
-static int ldif_comparison_objectCategory(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1,
- const struct ldb_val *v2)
-{
- return ldb_any_comparison(ldb, mem_ctx, ldif_canonicalise_objectCategory,
- v1, v2);
-}
-
-/*
- convert a NDR formatted blob to a ldif formatted schemaInfo
-*/
-static int ldif_write_schemaInfo(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- return ldif_write_NDR(ldb, mem_ctx, in, out,
- sizeof(struct repsFromToBlob),
- (ndr_pull_flags_fn_t)ndr_pull_schemaInfoBlob,
- (ndr_print_fn_t)ndr_print_schemaInfoBlob,
- true);
-}
-
-/*
- convert a ldif formatted prefixMap to a NDR formatted blob
-*/
-static int ldif_read_prefixMap(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct prefixMapBlob *blob;
- enum ndr_err_code ndr_err;
- char *string, *line, *p, *oid;
- DATA_BLOB oid_blob;
-
- TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
-
- if (tmp_ctx == NULL) {
- return -1;
- }
-
- blob = talloc_zero(tmp_ctx, struct prefixMapBlob);
- if (blob == NULL) {
- talloc_free(tmp_ctx);
- return -1;
- }
-
- /* use the switch value to detect if this is in the binary
- * format
- */
- if (in->length >= 4 && IVAL(in->data, 0) == PREFIX_MAP_VERSION_DSDB) {
- ndr_err = ndr_pull_struct_blob(in, tmp_ctx, blob,
- (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob);
- if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- ndr_err = ndr_push_struct_blob(out, mem_ctx,
- blob,
- (ndr_push_flags_fn_t)ndr_push_prefixMapBlob);
- talloc_free(tmp_ctx);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- return -1;
- }
- return 0;
- }
- }
-
- /* If this does not parse, then it is probably the text version, and we should try it that way */
- blob->version = PREFIX_MAP_VERSION_DSDB;
-
- string = talloc_strndup(mem_ctx, (const char *)in->data, in->length);
- if (string == NULL) {
- talloc_free(blob);
- return -1;
- }
-
- line = string;
- while (line && line[0]) {
- p=strchr(line, ';');
- if (p) {
- p[0] = '\0';
- } else {
- p=strchr(line, '\n');
- if (p) {
- p[0] = '\0';
- }
- }
- /* allow a trailing separator */
- if (line == p) {
- break;
- }
-
- blob->ctr.dsdb.mappings = talloc_realloc(blob,
- blob->ctr.dsdb.mappings,
- struct drsuapi_DsReplicaOIDMapping,
- blob->ctr.dsdb.num_mappings+1);
- if (!blob->ctr.dsdb.mappings) {
- talloc_free(tmp_ctx);
- return -1;
- }
-
- blob->ctr.dsdb.mappings[blob->ctr.dsdb.num_mappings].id_prefix = strtoul(line, &oid, 10);
-
- if (oid[0] != ':') {
- talloc_free(tmp_ctx);
- return -1;
- }
-
- /* we know there must be at least ":" */
- oid++;
-
- if (!ber_write_partial_OID_String(blob->ctr.dsdb.mappings, &oid_blob, oid)) {
- talloc_free(tmp_ctx);
- return -1;
- }
- blob->ctr.dsdb.mappings[blob->ctr.dsdb.num_mappings].oid.length = oid_blob.length;
- blob->ctr.dsdb.mappings[blob->ctr.dsdb.num_mappings].oid.binary_oid = oid_blob.data;
-
- blob->ctr.dsdb.num_mappings++;
-
- /* Now look past the terminator we added above */
- if (p) {
- line = p + 1;
- } else {
- line = NULL;
- }
- }
-
- ndr_err = ndr_push_struct_blob(out, mem_ctx,
- blob,
- (ndr_push_flags_fn_t)ndr_push_prefixMapBlob);
- talloc_free(tmp_ctx);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- return -1;
- }
- return 0;
-}
-
-/*
- convert a NDR formatted blob to a ldif formatted prefixMap
-*/
-static int ldif_write_prefixMap(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct prefixMapBlob *blob;
- enum ndr_err_code ndr_err;
- char *string;
- uint32_t i;
-
- if (ldb_get_flags(ldb) & LDB_FLG_SHOW_BINARY) {
- int err;
- /* try to decode the blob as S4 prefixMap */
- err = ldif_write_NDR(ldb, mem_ctx, in, out,
- sizeof(struct prefixMapBlob),
- (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob,
- (ndr_print_fn_t)ndr_print_prefixMapBlob,
- false);
- if (0 == err) {
- return err;
- }
- /* try parsing it as Windows PrefixMap value */
- return ldif_write_NDR(ldb, mem_ctx, in, out,
- sizeof(struct drsuapi_MSPrefixMap_Ctr),
- (ndr_pull_flags_fn_t)ndr_pull_drsuapi_MSPrefixMap_Ctr,
- (ndr_print_fn_t)ndr_print_drsuapi_MSPrefixMap_Ctr,
- true);
- }
-
- blob = talloc(mem_ctx, struct prefixMapBlob);
- if (blob == NULL) {
- return -1;
- }
- ndr_err = ndr_pull_struct_blob_all(in, blob,
- blob,
- (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob);
- if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
- goto failed;
- }
- if (blob->version != PREFIX_MAP_VERSION_DSDB) {
- goto failed;
- }
- string = talloc_strdup(mem_ctx, "");
- if (string == NULL) {
- goto failed;
- }
-
- for (i=0; i < blob->ctr.dsdb.num_mappings; i++) {
- DATA_BLOB oid_blob;
- char *partial_oid = NULL;
-
- if (i > 0) {
- string = talloc_asprintf_append(string, ";");
- }
-
- oid_blob = data_blob_const(blob->ctr.dsdb.mappings[i].oid.binary_oid,
- blob->ctr.dsdb.mappings[i].oid.length);
- if (!ber_read_partial_OID_String(blob, oid_blob, &partial_oid)) {
- DEBUG(0, ("ber_read_partial_OID failed on prefixMap item with id: 0x%X",
- blob->ctr.dsdb.mappings[i].id_prefix));
- goto failed;
- }
- string = talloc_asprintf_append(string, "%u:%s",
- blob->ctr.dsdb.mappings[i].id_prefix,
- partial_oid);
- talloc_free(discard_const(partial_oid));
- if (string == NULL) {
- goto failed;
- }
- }
-
- talloc_free(blob);
- *out = data_blob_string_const(string);
- return 0;
-
-failed:
- talloc_free(blob);
- return -1;
-}
-
-static bool ldif_comparision_prefixMap_isString(const struct ldb_val *v)
-{
- if (v->length < 4) {
- return true;
- }
-
- if (IVAL(v->data, 0) == PREFIX_MAP_VERSION_DSDB) {
- return false;
- }
-
- return true;
-}
-
-/*
- canonicalise a prefixMap
-*/
-static int ldif_canonicalise_prefixMap(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- if (ldif_comparision_prefixMap_isString(in)) {
- return ldif_read_prefixMap(ldb, mem_ctx, in, out);
- }
- return ldb_handler_copy(ldb, mem_ctx, in, out);
-}
-
-static int ldif_comparison_prefixMap(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1,
- const struct ldb_val *v2)
-{
- return ldb_any_comparison(ldb, mem_ctx, ldif_canonicalise_prefixMap,
- v1, v2);
-}
-
-/* length limited conversion of a ldb_val to a int32_t */
-static int val_to_int32(const struct ldb_val *in, int32_t *v)
-{
- char *end;
- char buf[64];
-
- /* make sure we don't read past the end of the data */
- if (in->length > sizeof(buf)-1) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- strncpy(buf, (char *)in->data, in->length);
- buf[in->length] = 0;
-
- /* We've to use "strtoll" here to have the intended overflows.
- * Otherwise we may get "LONG_MAX" and the conversion is wrong. */
- *v = (int32_t) strtoll(buf, &end, 0);
- if (*end != 0) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- return LDB_SUCCESS;
-}
-
-/* length limited conversion of a ldb_val to a int64_t */
-static int val_to_int64(const struct ldb_val *in, int64_t *v)
-{
- char *end;
- char buf[64];
-
- /* make sure we don't read past the end of the data */
- if (in->length > sizeof(buf)-1) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- strncpy(buf, (char *)in->data, in->length);
- buf[in->length] = 0;
-
- *v = (int64_t) strtoll(buf, &end, 0);
- if (*end != 0) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- return LDB_SUCCESS;
-}
-
-/* Canonicalisation of two 32-bit integers */
-static int ldif_canonicalise_int32(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- int32_t i;
- int ret;
-
- ret = val_to_int32(in, &i);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- out->data = (uint8_t *) talloc_asprintf(mem_ctx, "%d", i);
- if (out->data == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- out->length = strlen((char *)out->data);
- return 0;
-}
-
-/* Comparison of two 32-bit integers */
-static int ldif_comparison_int32(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- int32_t i1=0, i2=0;
- val_to_int32(v1, &i1);
- val_to_int32(v2, &i2);
- if (i1 == i2) return 0;
- return i1 > i2? 1 : -1;
-}
-
-/* Canonicalisation of two 64-bit integers */
-static int ldif_canonicalise_int64(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- int64_t i;
- int ret;
-
- ret = val_to_int64(in, &i);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- out->data = (uint8_t *) talloc_asprintf(mem_ctx, "%lld", (long long)i);
- if (out->data == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- out->length = strlen((char *)out->data);
- return 0;
-}
-
-/* Comparison of two 64-bit integers */
-static int ldif_comparison_int64(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- int64_t i1=0, i2=0;
- val_to_int64(v1, &i1);
- val_to_int64(v2, &i2);
- if (i1 == i2) return 0;
- return i1 > i2? 1 : -1;
-}
-
-/*
- convert a NDR formatted blob to a ldif formatted repsFromTo
-*/
-static int ldif_write_repsFromTo(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- return ldif_write_NDR(ldb, mem_ctx, in, out,
- sizeof(struct repsFromToBlob),
- (ndr_pull_flags_fn_t)ndr_pull_repsFromToBlob,
- (ndr_print_fn_t)ndr_print_repsFromToBlob,
- true);
-}
-
-/*
- convert a NDR formatted blob to a ldif formatted replPropertyMetaData
-*/
-static int ldif_write_replPropertyMetaData(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- return ldif_write_NDR(ldb, mem_ctx, in, out,
- sizeof(struct replPropertyMetaDataBlob),
- (ndr_pull_flags_fn_t)ndr_pull_replPropertyMetaDataBlob,
- (ndr_print_fn_t)ndr_print_replPropertyMetaDataBlob,
- true);
-}
-
-/*
- convert a NDR formatted blob to a ldif formatted replUpToDateVector
-*/
-static int ldif_write_replUpToDateVector(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- return ldif_write_NDR(ldb, mem_ctx, in, out,
- sizeof(struct replUpToDateVectorBlob),
- (ndr_pull_flags_fn_t)ndr_pull_replUpToDateVectorBlob,
- (ndr_print_fn_t)ndr_print_replUpToDateVectorBlob,
- true);
-}
-
-
-/*
- convert a NDR formatted blob to a ldif formatted dnsRecord
-*/
-static int ldif_write_dnsRecord(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- return ldif_write_NDR(ldb, mem_ctx, in, out,
- sizeof(struct dnsp_DnssrvRpcRecord),
- (ndr_pull_flags_fn_t)ndr_pull_dnsp_DnssrvRpcRecord,
- (ndr_print_fn_t)ndr_print_dnsp_DnssrvRpcRecord,
- true);
-}
-
-/*
- convert a NDR formatted blob of a supplementalCredentials into text
-*/
-static int ldif_write_supplementalCredentialsBlob(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- return ldif_write_NDR(ldb, mem_ctx, in, out,
- sizeof(struct supplementalCredentialsBlob),
- (ndr_pull_flags_fn_t)ndr_pull_supplementalCredentialsBlob,
- (ndr_print_fn_t)ndr_print_supplementalCredentialsBlob,
- true);
-}
-
-
-static int extended_dn_write_hex(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- *out = data_blob_string_const(data_blob_hex_string_lower(mem_ctx, in));
- if (!out->data) {
- return -1;
- }
- return 0;
-}
-
-/*
- compare two dns
-*/
-static int samba_ldb_dn_link_comparison(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- struct ldb_dn *dn1 = NULL, *dn2 = NULL;
- int ret;
-
- if (dsdb_dn_is_deleted_val(v1)) {
- /* If the DN is deleted, then we can't search for it */
- return -1;
- }
-
- if (dsdb_dn_is_deleted_val(v2)) {
- /* If the DN is deleted, then we can't search for it */
- return -1;
- }
-
- dn1 = ldb_dn_from_ldb_val(mem_ctx, ldb, v1);
- if ( ! ldb_dn_validate(dn1)) return -1;
-
- dn2 = ldb_dn_from_ldb_val(mem_ctx, ldb, v2);
- if ( ! ldb_dn_validate(dn2)) {
- talloc_free(dn1);
- return -1;
- }
-
- ret = ldb_dn_compare(dn1, dn2);
-
- talloc_free(dn1);
- talloc_free(dn2);
- return ret;
-}
-
-static int samba_ldb_dn_link_canonicalise(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct ldb_dn *dn;
- int ret = -1;
-
- out->length = 0;
- out->data = NULL;
-
- dn = ldb_dn_from_ldb_val(mem_ctx, ldb, in);
- if ( ! ldb_dn_validate(dn)) {
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- /* By including the RMD_FLAGS of a deleted DN, we ensure it
- * does not casually match a not deleted DN */
- if (dsdb_dn_is_deleted_val(in)) {
- out->data = (uint8_t *)talloc_asprintf(mem_ctx,
- "<RMD_FLAGS=%u>%s",
- dsdb_dn_val_rmd_flags(in),
- ldb_dn_get_casefold(dn));
- } else {
- out->data = (uint8_t *)ldb_dn_alloc_casefold(mem_ctx, dn);
- }
-
- if (out->data == NULL) {
- goto done;
- }
- out->length = strlen((char *)out->data);
-
- ret = 0;
-
-done:
- talloc_free(dn);
-
- return ret;
-}
-
-
-/*
- write a 64 bit 2-part range
-*/
-static int ldif_write_range64(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- int64_t v;
- int ret;
- ret = val_to_int64(in, &v);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- out->data = (uint8_t *)talloc_asprintf(mem_ctx, "%lu-%lu",
- (unsigned long)(v&0xFFFFFFFF),
- (unsigned long)(v>>32));
- if (out->data == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- out->length = strlen((char *)out->data);
- return LDB_SUCCESS;
-}
-
-/*
- read a 64 bit 2-part range
-*/
-static int ldif_read_range64(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- unsigned long high, low;
- char buf[64];
-
- if (memchr(in->data, '-', in->length) == NULL) {
- return ldb_handler_copy(ldb, mem_ctx, in, out);
- }
-
- if (in->length > sizeof(buf)-1) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- strncpy(buf, (const char *)in->data, in->length);
- buf[in->length] = 0;
-
- if (sscanf(buf, "%lu-%lu", &low, &high) != 2) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
-
- out->data = (uint8_t *)talloc_asprintf(mem_ctx, "%llu",
- (unsigned long long)(((uint64_t)high)<<32) | (low));
-
- if (out->data == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- out->length = strlen((char *)out->data);
- return LDB_SUCCESS;
-}
-
-/*
- when this operator_fn is set for a syntax, the backend calls is in
- preference to the comparison function. We are told the exact
- comparison operation that is needed, and we can return errors
- */
-static int samba_syntax_operator_fn(struct ldb_context *ldb, enum ldb_parse_op operation,
- const struct ldb_schema_attribute *a,
- const struct ldb_val *v1, const struct ldb_val *v2, bool *matched)
-{
- switch (operation) {
- case LDB_OP_AND:
- case LDB_OP_OR:
- case LDB_OP_NOT:
- case LDB_OP_SUBSTRING:
- case LDB_OP_APPROX:
- case LDB_OP_EXTENDED:
- /* handled in the backends */
- return LDB_ERR_INAPPROPRIATE_MATCHING;
-
- case LDB_OP_GREATER:
- case LDB_OP_LESS:
- case LDB_OP_EQUALITY:
- {
- TALLOC_CTX *tmp_ctx = talloc_new(ldb);
- int ret;
- if (tmp_ctx == NULL) {
- return ldb_oom(ldb);
- }
- ret = a->syntax->comparison_fn(ldb, tmp_ctx, v1, v2);
- talloc_free(tmp_ctx);
- if (operation == LDB_OP_GREATER) {
- *matched = (ret > 0);
- } else if (operation == LDB_OP_LESS) {
- *matched = (ret < 0);
- } else {
- *matched = (ret == 0);
- }
- return LDB_SUCCESS;
- }
-
- case LDB_OP_PRESENT:
- *matched = true;
- return LDB_SUCCESS;
- }
-
- /* we shouldn't get here */
- return LDB_ERR_INAPPROPRIATE_MATCHING;
-}
-
-/*
- special operation for DNs, to take account of the RMD_FLAGS deleted bit
- */
-static int samba_syntax_operator_dn(struct ldb_context *ldb, enum ldb_parse_op operation,
- const struct ldb_schema_attribute *a,
- const struct ldb_val *v1, const struct ldb_val *v2, bool *matched)
-{
- if (operation == LDB_OP_PRESENT && dsdb_dn_is_deleted_val(v1)) {
- /* If the DN is deleted, then we can't search for it */
- *matched = false;
- return LDB_SUCCESS;
- }
- return samba_syntax_operator_fn(ldb, operation, a, v1, v2, matched);
-}
-
-
-static const struct ldb_schema_syntax samba_syntaxes[] = {
- {
- .name = LDB_SYNTAX_SAMBA_SID,
- .ldif_read_fn = ldif_read_objectSid,
- .ldif_write_fn = ldif_write_objectSid,
- .canonicalise_fn = ldif_canonicalise_objectSid,
- .comparison_fn = ldif_comparison_objectSid,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR,
- .ldif_read_fn = ldif_read_ntSecurityDescriptor,
- .ldif_write_fn = ldif_write_ntSecurityDescriptor,
- .canonicalise_fn = ldb_handler_copy,
- .comparison_fn = ldb_comparison_binary,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_GUID,
- .ldif_read_fn = ldif_read_objectGUID,
- .ldif_write_fn = ldif_write_objectGUID,
- .canonicalise_fn = ldif_canonicalise_objectGUID,
- .comparison_fn = ldif_comparison_objectGUID,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_OBJECT_CATEGORY,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldif_canonicalise_objectCategory,
- .comparison_fn = ldif_comparison_objectCategory,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_SCHEMAINFO,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldif_write_schemaInfo,
- .canonicalise_fn = ldb_handler_copy,
- .comparison_fn = ldb_comparison_binary,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_PREFIX_MAP,
- .ldif_read_fn = ldif_read_prefixMap,
- .ldif_write_fn = ldif_write_prefixMap,
- .canonicalise_fn = ldif_canonicalise_prefixMap,
- .comparison_fn = ldif_comparison_prefixMap,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_INT32,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldif_canonicalise_int32,
- .comparison_fn = ldif_comparison_int32,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_REPSFROMTO,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldif_write_repsFromTo,
- .canonicalise_fn = ldb_handler_copy,
- .comparison_fn = ldb_comparison_binary,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_REPLPROPERTYMETADATA,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldif_write_replPropertyMetaData,
- .canonicalise_fn = ldb_handler_copy,
- .comparison_fn = ldb_comparison_binary,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_REPLUPTODATEVECTOR,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldif_write_replUpToDateVector,
- .canonicalise_fn = ldb_handler_copy,
- .comparison_fn = ldb_comparison_binary,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = DSDB_SYNTAX_BINARY_DN,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = dsdb_dn_binary_canonicalise,
- .comparison_fn = dsdb_dn_binary_comparison,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = DSDB_SYNTAX_STRING_DN,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = dsdb_dn_string_canonicalise,
- .comparison_fn = dsdb_dn_string_comparison,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_DN,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = samba_ldb_dn_link_canonicalise,
- .comparison_fn = samba_ldb_dn_link_comparison,
- .operator_fn = samba_syntax_operator_dn
- },{
- .name = LDB_SYNTAX_SAMBA_RANGE64,
- .ldif_read_fn = ldif_read_range64,
- .ldif_write_fn = ldif_write_range64,
- .canonicalise_fn = ldif_canonicalise_int64,
- .comparison_fn = ldif_comparison_int64,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_DNSRECORD,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldif_write_dnsRecord,
- .canonicalise_fn = ldb_handler_copy,
- .comparison_fn = ldb_comparison_binary,
- .operator_fn = samba_syntax_operator_fn
- },{
- .name = LDB_SYNTAX_SAMBA_SUPPLEMENTALCREDENTIALS,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldif_write_supplementalCredentialsBlob,
- .canonicalise_fn = ldb_handler_copy,
- .comparison_fn = ldb_comparison_binary,
- .operator_fn = samba_syntax_operator_fn
- }
-};
-
-static const struct ldb_dn_extended_syntax samba_dn_syntax[] = {
- {
- .name = "SID",
- .read_fn = extended_dn_read_SID,
- .write_clear_fn = ldif_write_objectSid,
- .write_hex_fn = extended_dn_write_hex
- },{
- .name = "GUID",
- .read_fn = extended_dn_read_GUID,
- .write_clear_fn = ldif_write_objectGUID,
- .write_hex_fn = extended_dn_write_hex
- },{
- .name = "WKGUID",
- .read_fn = ldb_handler_copy,
- .write_clear_fn = ldb_handler_copy,
- .write_hex_fn = ldb_handler_copy
- },{
- .name = "RMD_INVOCID",
- .read_fn = extended_dn_read_GUID,
- .write_clear_fn = ldif_write_objectGUID,
- .write_hex_fn = extended_dn_write_hex
- },{
- .name = "RMD_FLAGS",
- .read_fn = ldb_handler_copy,
- .write_clear_fn = ldb_handler_copy,
- .write_hex_fn = ldb_handler_copy
- },{
- .name = "RMD_ADDTIME",
- .read_fn = ldb_handler_copy,
- .write_clear_fn = ldb_handler_copy,
- .write_hex_fn = ldb_handler_copy
- },{
- .name = "RMD_CHANGETIME",
- .read_fn = ldb_handler_copy,
- .write_clear_fn = ldb_handler_copy,
- .write_hex_fn = ldb_handler_copy
- },{
- .name = "RMD_LOCAL_USN",
- .read_fn = ldb_handler_copy,
- .write_clear_fn = ldb_handler_copy,
- .write_hex_fn = ldb_handler_copy
- },{
- .name = "RMD_ORIGINATING_USN",
- .read_fn = ldb_handler_copy,
- .write_clear_fn = ldb_handler_copy,
- .write_hex_fn = ldb_handler_copy
- },{
- .name = "RMD_VERSION",
- .read_fn = ldb_handler_copy,
- .write_clear_fn = ldb_handler_copy,
- .write_hex_fn = ldb_handler_copy
- }
-};
-
-/* TODO: Should be dynamic at some point */
-static const struct {
- const char *name;
- const char *syntax;
-} samba_attributes[] = {
- { "objectSid", LDB_SYNTAX_SAMBA_SID },
- { "securityIdentifier", LDB_SYNTAX_SAMBA_SID },
- { "tokenGroups", LDB_SYNTAX_SAMBA_SID },
- { "ntSecurityDescriptor", LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR },
- { "oMSyntax", LDB_SYNTAX_SAMBA_INT32 },
- { "objectCategory", LDB_SYNTAX_SAMBA_OBJECT_CATEGORY },
- { "schemaInfo", LDB_SYNTAX_SAMBA_SCHEMAINFO },
- { "prefixMap", LDB_SYNTAX_SAMBA_PREFIX_MAP },
- { "repsFrom", LDB_SYNTAX_SAMBA_REPSFROMTO },
- { "repsTo", LDB_SYNTAX_SAMBA_REPSFROMTO },
- { "replPropertyMetaData", LDB_SYNTAX_SAMBA_REPLPROPERTYMETADATA },
- { "replUpToDateVector", LDB_SYNTAX_SAMBA_REPLUPTODATEVECTOR },
- { "rIDAllocationPool", LDB_SYNTAX_SAMBA_RANGE64 },
- { "rIDPreviousAllocationPool", LDB_SYNTAX_SAMBA_RANGE64 },
- { "rIDAvailablePool", LDB_SYNTAX_SAMBA_RANGE64 },
-
- /*
- * these are extracted by searching
- * (&(attributeSyntax=2.5.5.10)(rangeLower=16)(rangeUpper=16)(omSyntax=4))
- */
- { "attributeSecurityGUID", LDB_SYNTAX_SAMBA_GUID },
- { "categoryId", LDB_SYNTAX_SAMBA_GUID },
- { "controlAccessRights", LDB_SYNTAX_SAMBA_GUID },
- { "currMachineId", LDB_SYNTAX_SAMBA_GUID },
- { "fRSReplicaSetGUID", LDB_SYNTAX_SAMBA_GUID },
- { "fRSVersionGUID", LDB_SYNTAX_SAMBA_GUID },
- { "implementedCategories", LDB_SYNTAX_SAMBA_GUID },
- { "msDS-AzObjectGuid", LDB_SYNTAX_SAMBA_GUID },
- { "msDFSR-ContentSetGuid", LDB_SYNTAX_SAMBA_GUID },
- { "msDFSR-ReplicationGroupGuid", LDB_SYNTAX_SAMBA_GUID },
- { "mSMQDigests", LDB_SYNTAX_SAMBA_GUID },
- { "mSMQOwnerID", LDB_SYNTAX_SAMBA_GUID },
- { "mSMQQMID", LDB_SYNTAX_SAMBA_GUID },
- { "mSMQQueueType", LDB_SYNTAX_SAMBA_GUID },
- { "mSMQSites", LDB_SYNTAX_SAMBA_GUID },
- { "netbootGUID", LDB_SYNTAX_SAMBA_GUID },
- { "objectGUID", LDB_SYNTAX_SAMBA_GUID },
- { "pKTGuid", LDB_SYNTAX_SAMBA_GUID },
- { "requiredCategories", LDB_SYNTAX_SAMBA_GUID },
- { "schemaIDGUID", LDB_SYNTAX_SAMBA_GUID },
- { "siteGUID", LDB_SYNTAX_SAMBA_GUID },
- { "msDFS-GenerationGUIDv2", LDB_SYNTAX_SAMBA_GUID },
- { "msDFS-LinkIdentityGUIDv2", LDB_SYNTAX_SAMBA_GUID },
- { "msDFS-NamespaceIdentityGUIDv2", LDB_SYNTAX_SAMBA_GUID },
-
- /*
- * these are known to be GUIDs
- */
- { "invocationId", LDB_SYNTAX_SAMBA_GUID },
- { "parentGUID", LDB_SYNTAX_SAMBA_GUID },
- { "msDS-OptionalFeatureGUID", LDB_SYNTAX_SAMBA_GUID },
-
- /* These NDR encoded things we want to be able to read with --show-binary */
- { "dnsRecord", LDB_SYNTAX_SAMBA_DNSRECORD },
- { "supplementalCredentials", LDB_SYNTAX_SAMBA_SUPPLEMENTALCREDENTIALS}
-};
-
-const struct ldb_schema_syntax *ldb_samba_syntax_by_name(struct ldb_context *ldb, const char *name)
-{
- unsigned int j;
- const struct ldb_schema_syntax *s = NULL;
-
- for (j=0; j < ARRAY_SIZE(samba_syntaxes); j++) {
- if (strcmp(name, samba_syntaxes[j].name) == 0) {
- s = &samba_syntaxes[j];
- break;
- }
- }
- return s;
-}
-
-const struct ldb_schema_syntax *ldb_samba_syntax_by_lDAPDisplayName(struct ldb_context *ldb, const char *name)
-{
- unsigned int j;
- const struct ldb_schema_syntax *s = NULL;
-
- for (j=0; j < ARRAY_SIZE(samba_attributes); j++) {
- if (strcmp(samba_attributes[j].name, name) == 0) {
- s = ldb_samba_syntax_by_name(ldb, samba_attributes[j].syntax);
- break;
- }
- }
-
- return s;
-}
-
-/*
- register the samba ldif handlers
-*/
-int ldb_register_samba_handlers(struct ldb_context *ldb)
-{
- unsigned int i;
- int ret;
-
- if (ldb_get_opaque(ldb, "SAMBA_HANDLERS_REGISTERED") != NULL) {
- return LDB_SUCCESS;
- }
-
- for (i=0; i < ARRAY_SIZE(samba_attributes); i++) {
- const struct ldb_schema_syntax *s = NULL;
-
- s = ldb_samba_syntax_by_name(ldb, samba_attributes[i].syntax);
-
- if (!s) {
- s = ldb_standard_syntax_by_name(ldb, samba_attributes[i].syntax);
- }
-
- if (!s) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_schema_attribute_add_with_syntax(ldb, samba_attributes[i].name, LDB_ATTR_FLAG_FIXED, s);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- for (i=0; i < ARRAY_SIZE(samba_dn_syntax); i++) {
- ret = ldb_dn_extended_add_syntax(ldb, LDB_ATTR_FLAG_FIXED, &samba_dn_syntax[i]);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- }
-
- ret = ldb_set_opaque(ldb, "SAMBA_HANDLERS_REGISTERED", (void*)1);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- return LDB_SUCCESS;
-}
diff --git a/source4/lib/ldb-samba/ldif_handlers.h b/source4/lib/ldb-samba/ldif_handlers.h
deleted file mode 100644
index 62903c4a96..0000000000
--- a/source4/lib/ldb-samba/ldif_handlers.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef __LIB_LDB_SAMBA_LDIF_HANDLERS_H__
-#define __LIB_LDB_SAMBA_LDIF_HANDLERS_H__
-
-#define LDB_SYNTAX_SAMBA_SID "LDB_SYNTAX_SAMBA_SID"
-#define LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR "1.2.840.113556.1.4.907"
-#define LDB_SYNTAX_SAMBA_GUID "LDB_SYNTAX_SAMBA_GUID"
-#define LDB_SYNTAX_SAMBA_OBJECT_CATEGORY "LDB_SYNTAX_SAMBA_OBJECT_CATEGORY"
-#define LDB_SYNTAX_SAMBA_SCHEMAINFO "LDB_SYNTAX_SAMBA_SCHEMAINFO"
-#define LDB_SYNTAX_SAMBA_PREFIX_MAP "LDB_SYNTAX_SAMBA_PREFIX_MAP"
-#define LDB_SYNTAX_SAMBA_INT32 "LDB_SYNTAX_SAMBA_INT32"
-#define LDB_SYNTAX_SAMBA_REPSFROMTO "LDB_SYNTAX_SAMBA_REPSFROMTO"
-#define LDB_SYNTAX_SAMBA_REPLPROPERTYMETADATA "LDB_SYNTAX_SAMBA_REPLPROPERTYMETADATA"
-#define LDB_SYNTAX_SAMBA_REPLUPTODATEVECTOR "LDB_SYNTAX_SAMBA_REPLUPTODATEVECTOR"
-#define LDB_SYNTAX_SAMBA_RANGE64 "LDB_SYNTAX_SAMBA_RANGE64"
-#define LDB_SYNTAX_SAMBA_DNSRECORD "LDB_SYNTAX_SAMBA_DNSRECORD"
-#define LDB_SYNTAX_SAMBA_SUPPLEMENTALCREDENTIALS "LDB_SYNTAX_SAMBA_SUPPLEMENTALCREDENTIALS"
-#include "lib/ldb-samba/ldif_handlers_proto.h"
-
-#undef _PRINTF_ATTRIBUTE
-#define _PRINTF_ATTRIBUTE(a1, a2)
-
-#endif /* __LIB_LDB_SAMBA_LDIF_HANDLERS_H__ */
-
diff --git a/source4/lib/ldb-samba/pyldb.c b/source4/lib/ldb-samba/pyldb.c
deleted file mode 100644
index ff48a3bb04..0000000000
--- a/source4/lib/ldb-samba/pyldb.c
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
-
- Python interface to ldb, Samba-specific functions
-
- Copyright (C) 2007-2010 Jelmer Vernooij <jelmer@samba.org>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <Python.h>
-#include "includes.h"
-#include <ldb.h>
-#include <pyldb.h>
-#include "param/pyparam.h"
-#include "auth/credentials/pycredentials.h"
-#include "ldb_wrap.h"
-#include "lib/ldb-samba/ldif_handlers.h"
-#include "auth/pyauth.h"
-
-void init_ldb(void);
-
-static PyObject *pyldb_module;
-static PyObject *py_ldb_error;
-staticforward PyTypeObject PySambaLdb;
-
-static void PyErr_SetLdbError(PyObject *error, int ret, struct ldb_context *ldb_ctx)
-{
- if (ret == LDB_ERR_PYTHON_EXCEPTION)
- return; /* Python exception should already be set, just keep that */
-
- PyErr_SetObject(error,
- Py_BuildValue(discard_const_p(char, "(i,s)"), ret,
- ldb_ctx == NULL?ldb_strerror(ret):ldb_errstring(ldb_ctx)));
-}
-
-static PyObject *py_ldb_set_loadparm(PyObject *self, PyObject *args)
-{
- PyObject *py_lp_ctx;
- struct loadparm_context *lp_ctx;
- struct ldb_context *ldb;
-
- if (!PyArg_ParseTuple(args, "O", &py_lp_ctx))
- return NULL;
-
- ldb = PyLdb_AsLdbContext(self);
-
- lp_ctx = lpcfg_from_py_object(ldb, py_lp_ctx);
- if (lp_ctx == NULL) {
- PyErr_SetString(PyExc_TypeError, "Expected loadparm object");
- return NULL;
- }
-
- ldb_set_opaque(ldb, "loadparm", lp_ctx);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_set_credentials(PyObject *self, PyObject *args)
-{
- PyObject *py_creds;
- struct cli_credentials *creds;
- struct ldb_context *ldb;
-
- if (!PyArg_ParseTuple(args, "O", &py_creds))
- return NULL;
-
- creds = cli_credentials_from_py_object(py_creds);
- if (creds == NULL) {
- PyErr_SetString(PyExc_TypeError, "Expected credentials object");
- return NULL;
- }
-
- ldb = PyLdb_AsLdbContext(self);
-
- ldb_set_opaque(ldb, "credentials", creds);
-
- Py_RETURN_NONE;
-}
-
-/* XXX: This function really should be in libldb's pyldb.c */
-static PyObject *py_ldb_set_opaque_integer(PyObject *self, PyObject *args)
-{
- int value;
- int *old_val, *new_val;
- char *py_opaque_name, *opaque_name_talloc;
- struct ldb_context *ldb;
- int ret;
- TALLOC_CTX *tmp_ctx;
-
- if (!PyArg_ParseTuple(args, "si", &py_opaque_name, &value))
- return NULL;
-
- ldb = PyLdb_AsLdbContext(self);
-
- /* see if we have a cached copy */
- old_val = (int *)ldb_get_opaque(ldb, py_opaque_name);
- /* XXX: We shouldn't just blindly assume that the value that is
- * already present has the size of an int and is not shared
- * with other code that may rely on it not changing.
- * JRV 20100403 */
-
- if (old_val) {
- *old_val = value;
- Py_RETURN_NONE;
- }
-
- tmp_ctx = talloc_new(ldb);
- if (tmp_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- new_val = talloc(tmp_ctx, int);
- if (new_val == NULL) {
- talloc_free(tmp_ctx);
- PyErr_NoMemory();
- return NULL;
- }
-
- opaque_name_talloc = talloc_strdup(tmp_ctx, py_opaque_name);
- if (opaque_name_talloc == NULL) {
- talloc_free(tmp_ctx);
- PyErr_NoMemory();
- return NULL;
- }
-
- *new_val = value;
-
- /* cache the domain_sid in the ldb */
- ret = ldb_set_opaque(ldb, opaque_name_talloc, new_val);
-
- if (ret != LDB_SUCCESS) {
- talloc_free(tmp_ctx);
- PyErr_SetLdbError(py_ldb_error, ret, ldb);
- return NULL;
- }
-
- talloc_steal(ldb, new_val);
- talloc_steal(ldb, opaque_name_talloc);
- talloc_free(tmp_ctx);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_set_utf8_casefold(PyObject *self)
-{
- struct ldb_context *ldb;
-
- ldb = PyLdb_AsLdbContext(self);
-
- ldb_set_utf8_fns(ldb, NULL, wrap_casefold);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_set_session_info(PyObject *self, PyObject *args)
-{
- PyObject *py_session_info;
- struct auth_session_info *info;
- struct ldb_context *ldb;
- PyObject *mod_samba_auth;
- PyObject *PyAuthSession_Type;
- bool ret;
-
- mod_samba_auth = PyImport_ImportModule("samba.dcerpc.auth");
- if (mod_samba_auth == NULL)
- return NULL;
-
- PyAuthSession_Type = PyObject_GetAttrString(mod_samba_auth, "session_info");
- if (PyAuthSession_Type == NULL)
- return NULL;
-
- ret = PyArg_ParseTuple(args, "O!", PyAuthSession_Type, &py_session_info);
-
- Py_DECREF(PyAuthSession_Type);
- Py_DECREF(mod_samba_auth);
-
- if (!ret)
- return NULL;
-
- ldb = PyLdb_AsLdbContext(self);
-
- info = PyAuthSession_AsSession(py_session_info);
-
- ldb_set_opaque(ldb, "sessionInfo", info);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_register_samba_handlers(PyObject *self)
-{
- struct ldb_context *ldb;
- int ret;
-
- /* XXX: Perhaps call this from PySambaLdb's init function ? */
-
- ldb = PyLdb_AsLdbContext(self);
- ret = ldb_register_samba_handlers(ldb);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(py_ldb_error, ret, ldb);
-
- Py_RETURN_NONE;
-}
-
-static PyMethodDef py_samba_ldb_methods[] = {
- { "set_loadparm", (PyCFunction)py_ldb_set_loadparm, METH_VARARGS,
- "ldb_set_loadparm(session_info)\n"
- "Set loadparm context to use when connecting." },
- { "set_credentials", (PyCFunction)py_ldb_set_credentials, METH_VARARGS,
- "ldb_set_credentials(credentials)\n"
- "Set credentials to use when connecting." },
- { "set_opaque_integer", (PyCFunction)py_ldb_set_opaque_integer,
- METH_VARARGS, NULL },
- { "set_utf8_casefold", (PyCFunction)py_ldb_set_utf8_casefold,
- METH_NOARGS,
- "ldb_set_utf8_casefold()\n"
- "Set the right Samba casefolding function for UTF8 charset." },
- { "register_samba_handlers", (PyCFunction)py_ldb_register_samba_handlers,
- METH_NOARGS,
- "register_samba_handlers()\n"
- "Register Samba-specific LDB modules and schemas." },
- { "set_session_info", (PyCFunction)py_ldb_set_session_info, METH_VARARGS,
- "set_session_info(session_info)\n"
- "Set session info to use when connecting." },
- { NULL },
-};
-
-static PyTypeObject PySambaLdb = {
- .tp_name = "samba._ldb.Ldb",
- .tp_doc = "Connection to a LDB database.",
- .tp_methods = py_samba_ldb_methods,
- .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-};
-
-void init_ldb(void)
-{
- PyObject *m;
-
- pyldb_module = PyImport_ImportModule("ldb");
- if (pyldb_module == NULL)
- return;
-
- PySambaLdb.tp_base = (PyTypeObject *)PyObject_GetAttrString(pyldb_module, "Ldb");
- if (PySambaLdb.tp_base == NULL)
- return;
-
- py_ldb_error = PyObject_GetAttrString(pyldb_module, "LdbError");
-
- if (PyType_Ready(&PySambaLdb) < 0)
- return;
-
- m = Py_InitModule3("_ldb", NULL, "Samba-specific LDB python bindings");
- if (m == NULL)
- return;
-
- Py_INCREF(&PySambaLdb);
- PyModule_AddObject(m, "Ldb", (PyObject *)&PySambaLdb);
-}
diff --git a/source4/lib/ldb-samba/samba_extensions.c b/source4/lib/ldb-samba/samba_extensions.c
deleted file mode 100644
index be9f36a5a7..0000000000
--- a/source4/lib/ldb-samba/samba_extensions.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- ldb database library - samba extensions
-
- Copyright (C) Andrew Tridgell 2010
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-
-#include "includes.h"
-#include "ldb_module.h"
-#include "lib/cmdline/popt_common.h"
-#include "auth/gensec/gensec.h"
-#include "auth/auth.h"
-#include "param/param.h"
-#include "dsdb/samdb/samdb.h"
-#include "ldb_wrap.h"
-#include "popt.h"
-
-
-
-/*
- work out the length of a popt array
- */
-static unsigned calculate_popt_array_length(struct poptOption *opts)
-{
- unsigned i;
- struct poptOption zero_opt = { NULL };
- for (i=0; memcmp(&zero_opt, &opts[i], sizeof(zero_opt)) != 0; i++) ;
- return i;
-}
-
-static struct poptOption cmdline_extensions[] = {
- POPT_COMMON_SAMBA
- POPT_COMMON_CREDENTIALS
- POPT_COMMON_CONNECTION
- POPT_COMMON_VERSION
- { NULL }
-};
-
-/*
- called to register additional command line options
- */
-static int extensions_hook(struct ldb_context *ldb, enum ldb_module_hook_type t)
-{
- switch (t) {
- case LDB_MODULE_HOOK_CMDLINE_OPTIONS: {
- unsigned len1, len2;
- struct poptOption **popt_options = ldb_module_popt_options(ldb);
- struct poptOption *new_array;
-
- len1 = calculate_popt_array_length(*popt_options);
- len2 = calculate_popt_array_length(cmdline_extensions);
- new_array = talloc_array(NULL, struct poptOption, len1+len2+1);
- if (NULL == new_array) {
- return ldb_oom(ldb);
- }
-
- memcpy(new_array, *popt_options, len1*sizeof(struct poptOption));
- memcpy(new_array+len1, cmdline_extensions, (1+len2)*sizeof(struct poptOption));
- (*popt_options) = new_array;
- return LDB_SUCCESS;
- }
-
- case LDB_MODULE_HOOK_CMDLINE_PRECONNECT: {
- int r = ldb_register_samba_handlers(ldb);
- if (r != LDB_SUCCESS) {
- return ldb_operr(ldb);
- }
- gensec_init();
-
- if (ldb_set_opaque(ldb, "sessionInfo", system_session(cmdline_lp_ctx))) {
- return ldb_operr(ldb);
- }
- if (ldb_set_opaque(ldb, "credentials", cmdline_credentials)) {
- return ldb_operr(ldb);
- }
- if (ldb_set_opaque(ldb, "loadparm", cmdline_lp_ctx)) {
- return ldb_operr(ldb);
- }
-
- ldb_set_utf8_fns(ldb, NULL, wrap_casefold);
- break;
- }
-
- case LDB_MODULE_HOOK_CMDLINE_POSTCONNECT:
- /* get the domain SID into the cache for SDDL processing */
- samdb_domain_sid(ldb);
- break;
- }
-
- return LDB_SUCCESS;
-}
-
-
-/*
- initialise the module
- */
-_PUBLIC_ int ldb_samba_extensions_init(const char *ldb_version)
-{
- ldb_register_hook(extensions_hook);
-
- return LDB_SUCCESS;
-}
diff --git a/source4/lib/ldb-samba/wscript_build b/source4/lib/ldb-samba/wscript_build
deleted file mode 100644
index 2e1cacba64..0000000000
--- a/source4/lib/ldb-samba/wscript_build
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-
-# LDBSAMBA gets included in the ldb build when we are building ldb_ildap
-# as a built-in module and this delutes the symbols in the ldb library with
-# the symbols of all of ldb_ildap's dependencies.
-
-bld.SAMBA_LIBRARY('ldbsamba',
- source='ldif_handlers.c',
- autoproto='ldif_handlers_proto.h',
- public_deps='ldb',
- deps='security ndr NDR_DRSBLOBS NDR_DNSP ldbwrap samdb-common SAMDB_SCHEMA tdb_compat pyldb-util errors',
- private_library=True
- )
-
-bld.SAMBA_SUBSYSTEM('ldbwrap',
- source='ldb_wrap.c',
- public_headers='ldb_wrap.h',
- deps='ldb samba-util ldbsamba samba-hostconfig'
- )
-
-
-bld.SAMBA_PYTHON('python_samba__ldb', 'pyldb.c',
- deps='ldbsamba pyparam_util ldbwrap',
- realname='samba/_ldb.so')
-
-bld.SAMBA_MODULE('ldbsamba_extensions',
- source='samba_extensions.c',
- init_function='ldb_samba_extensions_init',
- module_init_name='ldb_init_module',
- subsystem='ldb',
- deps='ldb ldbsamba POPT_SAMBA POPT_CREDENTIALS cmdline-credentials gensec',
- internal_module=False)
-
-
-# the s4-internal ldap backend
-bld.SAMBA_MODULE('ldb_ildap',
- source='ldb_ildap.c',
- init_function='ldb_ildap_init',
- module_init_name='ldb_init_module',
- deps='talloc cli-ldap credentials auth_system_session',
- internal_module=False,
- subsystem='ldb')
diff --git a/source4/lib/ldb/ABI/ldb-0.9.10.sigs b/source4/lib/ldb/ABI/ldb-0.9.10.sigs
deleted file mode 100644
index 012ac65bb7..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.10.sigs
+++ /dev/null
@@ -1,218 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(void *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(void *, const char *, int)
-ldb_binary_decode: struct ldb_val (void *, const char *)
-ldb_binary_encode: char *(void *, struct ldb_val)
-ldb_binary_encode_string: char *(void *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, void *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, void *, const char *, size_t)
-ldb_casefold_default: char *(void *, void *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(void *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(void *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_escape_value: char *(void *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(void *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(void *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(void *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(void *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(void *, struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_init_module_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_load_modules_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, void *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(void *)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, void *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(void *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (void *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.12.sigs b/source4/lib/ldb/ABI/ldb-0.9.12.sigs
deleted file mode 100644
index 2206e790fc..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.12.sigs
+++ /dev/null
@@ -1,219 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(void *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(void *, const char *, int)
-ldb_binary_decode: struct ldb_val (void *, const char *)
-ldb_binary_encode: char *(void *, struct ldb_val)
-ldb_binary_encode_string: char *(void *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, void *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, void *, const char *, size_t)
-ldb_casefold_default: char *(void *, void *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(void *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(void *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_escape_value: char *(void *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(void *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(void *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(void *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(void *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(void *, struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_init_module_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_load_modules_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, void *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(void *)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, void *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(void *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (void *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.15.sigs b/source4/lib/ldb/ABI/ldb-0.9.15.sigs
deleted file mode 100644
index 39d2f3eac4..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.15.sigs
+++ /dev/null
@@ -1,226 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_init_module_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_load_modules_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.16.sigs b/source4/lib/ldb/ABI/ldb-0.9.16.sigs
deleted file mode 100644
index 610a0a4a75..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.16.sigs
+++ /dev/null
@@ -1,228 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_init_module_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_load_modules_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.17.sigs b/source4/lib/ldb/ABI/ldb-0.9.17.sigs
deleted file mode 100644
index d0f56991d2..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.17.sigs
+++ /dev/null
@@ -1,229 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_init_module_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_load_modules_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.18.sigs b/source4/lib/ldb/ABI/ldb-0.9.18.sigs
deleted file mode 100644
index 15913c9385..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.18.sigs
+++ /dev/null
@@ -1,240 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_asq_init: int (const char *)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_init_module_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_load_modules_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_paged_results_init: int (const char *)
-ldb_paged_searches_init: int (const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_rdn_name_init: int (const char *)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_sample_init: int (const char *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_server_sort_init: int (const char *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_skel_init: int (const char *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_tdb_init: int (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.19.sigs b/source4/lib/ldb/ABI/ldb-0.9.19.sigs
deleted file mode 100644
index 62738709e4..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.19.sigs
+++ /dev/null
@@ -1,245 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_asq_init: int (const char *)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_call_chain: char *(struct ldb_request *, TALLOC_CTX *)
-ldb_module_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_flags: uint32_t (struct ldb_context *)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_init_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_module_load_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_next: struct ldb_module *(struct ldb_module *)
-ldb_module_popt_options: struct poptOption **(struct ldb_context *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_next: void (struct ldb_module *, struct ldb_module *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_paged_results_init: int (const char *)
-ldb_paged_searches_init: int (const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_rdn_name_init: int (const char *)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_sample_init: int (const char *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_server_sort_init: int (const char *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_skel_init: int (const char *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_tdb_init: int (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.20.sigs b/source4/lib/ldb/ABI/ldb-0.9.20.sigs
deleted file mode 100644
index 62738709e4..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.20.sigs
+++ /dev/null
@@ -1,245 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_asq_init: int (const char *)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_call_chain: char *(struct ldb_request *, TALLOC_CTX *)
-ldb_module_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_flags: uint32_t (struct ldb_context *)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_init_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_module_load_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_next: struct ldb_module *(struct ldb_module *)
-ldb_module_popt_options: struct poptOption **(struct ldb_context *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_next: void (struct ldb_module *, struct ldb_module *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_paged_results_init: int (const char *)
-ldb_paged_searches_init: int (const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_rdn_name_init: int (const char *)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_sample_init: int (const char *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_server_sort_init: int (const char *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_skel_init: int (const char *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_tdb_init: int (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.22.sigs b/source4/lib/ldb/ABI/ldb-0.9.22.sigs
deleted file mode 100644
index b5a69c14a9..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.22.sigs
+++ /dev/null
@@ -1,245 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_check_critical_controls: int (struct ldb_control **)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_controls_except_specified: struct ldb_control **(struct ldb_control **, TALLOC_CTX *, struct ldb_control *)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_map_add: int (struct ldb_module *, struct ldb_request *)
-ldb_map_delete: int (struct ldb_module *, struct ldb_request *)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_map_modify: int (struct ldb_module *, struct ldb_request *)
-ldb_map_rename: int (struct ldb_module *, struct ldb_request *)
-ldb_map_search: int (struct ldb_module *, struct ldb_request *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_call_chain: char *(struct ldb_request *, TALLOC_CTX *)
-ldb_module_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_flags: uint32_t (struct ldb_context *)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_init_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_module_load_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_next: struct ldb_module *(struct ldb_module *)
-ldb_module_popt_options: struct poptOption **(struct ldb_context *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_next: void (struct ldb_module *, struct ldb_module *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_save_controls: int (struct ldb_control *, struct ldb_request *, struct ldb_control ***)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.23.sigs b/source4/lib/ldb/ABI/ldb-0.9.23.sigs
deleted file mode 100644
index 73e5caa896..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.23.sigs
+++ /dev/null
@@ -1,247 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_check_critical_controls: int (struct ldb_control **)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_controls_except_specified: struct ldb_control **(struct ldb_control **, TALLOC_CTX *, struct ldb_control *)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_comp_num: int (struct ldb_dn *)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_minimise: bool (struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_map_add: int (struct ldb_module *, struct ldb_request *)
-ldb_map_delete: int (struct ldb_module *, struct ldb_request *)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_map_modify: int (struct ldb_module *, struct ldb_request *)
-ldb_map_rename: int (struct ldb_module *, struct ldb_request *)
-ldb_map_search: int (struct ldb_module *, struct ldb_request *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_call_chain: char *(struct ldb_request *, TALLOC_CTX *)
-ldb_module_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_flags: uint32_t (struct ldb_context *)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_init_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_module_load_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_next: struct ldb_module *(struct ldb_module *)
-ldb_module_popt_options: struct poptOption **(struct ldb_context *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_next: void (struct ldb_module *, struct ldb_module *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_save_controls: int (struct ldb_control *, struct ldb_request *, struct ldb_control ***)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-0.9.24.sigs b/source4/lib/ldb/ABI/ldb-0.9.24.sigs
deleted file mode 100644
index 5cb32f7c46..0000000000
--- a/source4/lib/ldb/ABI/ldb-0.9.24.sigs
+++ /dev/null
@@ -1,248 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_check_critical_controls: int (struct ldb_control **)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_controls_except_specified: struct ldb_control **(struct ldb_control **, TALLOC_CTX *, struct ldb_control *)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_comp_num: int (struct ldb_dn *)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_minimise: bool (struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_map_add: int (struct ldb_module *, struct ldb_request *)
-ldb_map_delete: int (struct ldb_module *, struct ldb_request *)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_map_modify: int (struct ldb_module *, struct ldb_request *)
-ldb_map_rename: int (struct ldb_module *, struct ldb_request *)
-ldb_map_search: int (struct ldb_module *, struct ldb_request *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_call_chain: char *(struct ldb_request *, TALLOC_CTX *)
-ldb_module_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_flags: uint32_t (struct ldb_context *)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_init_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_module_load_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_next: struct ldb_module *(struct ldb_module *)
-ldb_module_popt_options: struct poptOption **(struct ldb_context *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_next: void (struct ldb_module *, struct ldb_module *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_trusted: void (struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_save_controls: int (struct ldb_control *, struct ldb_request *, struct ldb_control ***)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-1.0.0.sigs b/source4/lib/ldb/ABI/ldb-1.0.0.sigs
deleted file mode 100644
index 5cb32f7c46..0000000000
--- a/source4/lib/ldb/ABI/ldb-1.0.0.sigs
+++ /dev/null
@@ -1,248 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_check_critical_controls: int (struct ldb_control **)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_controls_except_specified: struct ldb_control **(struct ldb_control **, TALLOC_CTX *, struct ldb_control *)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_comp_num: int (struct ldb_dn *)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_minimise: bool (struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_map_add: int (struct ldb_module *, struct ldb_request *)
-ldb_map_delete: int (struct ldb_module *, struct ldb_request *)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_map_modify: int (struct ldb_module *, struct ldb_request *)
-ldb_map_rename: int (struct ldb_module *, struct ldb_request *)
-ldb_map_search: int (struct ldb_module *, struct ldb_request *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_call_chain: char *(struct ldb_request *, TALLOC_CTX *)
-ldb_module_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_flags: uint32_t (struct ldb_context *)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_init_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_module_load_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_next: struct ldb_module *(struct ldb_module *)
-ldb_module_popt_options: struct poptOption **(struct ldb_context *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_next: void (struct ldb_module *, struct ldb_module *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_trusted: void (struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_save_controls: int (struct ldb_control *, struct ldb_request *, struct ldb_control ***)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-1.0.1.sigs b/source4/lib/ldb/ABI/ldb-1.0.1.sigs
deleted file mode 100644
index 5cb32f7c46..0000000000
--- a/source4/lib/ldb/ABI/ldb-1.0.1.sigs
+++ /dev/null
@@ -1,248 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_check_critical_controls: int (struct ldb_control **)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_controls_except_specified: struct ldb_control **(struct ldb_control **, TALLOC_CTX *, struct ldb_control *)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_comp_num: int (struct ldb_dn *)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_minimise: bool (struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_map_add: int (struct ldb_module *, struct ldb_request *)
-ldb_map_delete: int (struct ldb_module *, struct ldb_request *)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_map_modify: int (struct ldb_module *, struct ldb_request *)
-ldb_map_rename: int (struct ldb_module *, struct ldb_request *)
-ldb_map_search: int (struct ldb_module *, struct ldb_request *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_call_chain: char *(struct ldb_request *, TALLOC_CTX *)
-ldb_module_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_flags: uint32_t (struct ldb_context *)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_init_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_module_load_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_next: struct ldb_module *(struct ldb_module *)
-ldb_module_popt_options: struct poptOption **(struct ldb_context *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_next: void (struct ldb_module *, struct ldb_module *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_trusted: void (struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_save_controls: int (struct ldb_control *, struct ldb_request *, struct ldb_control ***)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-1.0.2.sigs b/source4/lib/ldb/ABI/ldb-1.0.2.sigs
deleted file mode 100644
index c13ac873d2..0000000000
--- a/source4/lib/ldb/ABI/ldb-1.0.2.sigs
+++ /dev/null
@@ -1,250 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_check_critical_controls: int (struct ldb_control **)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_control_to_string: char *(TALLOC_CTX *, const struct ldb_control *)
-ldb_controls_except_specified: struct ldb_control **(struct ldb_control **, TALLOC_CTX *, struct ldb_control *)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_comp_num: int (struct ldb_dn *)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_minimise: bool (struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_map_add: int (struct ldb_module *, struct ldb_request *)
-ldb_map_delete: int (struct ldb_module *, struct ldb_request *)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_map_modify: int (struct ldb_module *, struct ldb_request *)
-ldb_map_rename: int (struct ldb_module *, struct ldb_request *)
-ldb_map_search: int (struct ldb_module *, struct ldb_request *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_call_chain: char *(struct ldb_request *, TALLOC_CTX *)
-ldb_module_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_flags: uint32_t (struct ldb_context *)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_init_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_module_load_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_next: struct ldb_module *(struct ldb_module *)
-ldb_module_popt_options: struct poptOption **(struct ldb_context *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_next: void (struct ldb_module *, struct ldb_module *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_parse_control_from_string: struct ldb_control *(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_trusted: void (struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_save_controls: int (struct ldb_control *, struct ldb_request *, struct ldb_control ***)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-1.1.0.sigs b/source4/lib/ldb/ABI/ldb-1.1.0.sigs
deleted file mode 100644
index 149d4bc0ae..0000000000
--- a/source4/lib/ldb/ABI/ldb-1.1.0.sigs
+++ /dev/null
@@ -1,253 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(TALLOC_CTX *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(TALLOC_CTX *, const char *, int)
-ldb_binary_decode: struct ldb_val (TALLOC_CTX *, const char *)
-ldb_binary_encode: char *(TALLOC_CTX *, struct ldb_val)
-ldb_binary_encode_string: char *(TALLOC_CTX *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, TALLOC_CTX *, const char *, size_t)
-ldb_casefold_default: char *(void *, TALLOC_CTX *, const char *, size_t)
-ldb_check_critical_controls: int (struct ldb_control **)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_control_to_string: char *(TALLOC_CTX *, const struct ldb_control *)
-ldb_controls_except_specified: struct ldb_control **(struct ldb_control **, TALLOC_CTX *, struct ldb_control *)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_escape_value: char *(TALLOC_CTX *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_comp_num: int (struct ldb_dn *)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(TALLOC_CTX *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(TALLOC_CTX *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_minimise: bool (struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(TALLOC_CTX *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_error_at: int (struct ldb_context *, int, const char *, const char *, int)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_parse_modrdn: int (struct ldb_context *, const struct ldb_ldif *, TALLOC_CTX *, struct ldb_dn **, struct ldb_dn **, bool *, struct ldb_dn **, struct ldb_dn **)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_map_add: int (struct ldb_module *, struct ldb_request *)
-ldb_map_delete: int (struct ldb_module *, struct ldb_request *)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_map_modify: int (struct ldb_module *, struct ldb_request *)
-ldb_map_rename: int (struct ldb_module *, struct ldb_request *)
-ldb_map_search: int (struct ldb_module *, struct ldb_request *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_error: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope, bool *)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_call_chain: char *(struct ldb_request *, TALLOC_CTX *)
-ldb_module_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_flags: uint32_t (struct ldb_context *)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_init_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_module_load_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_next: struct ldb_module *(struct ldb_module *)
-ldb_module_popt_options: struct poptOption **(struct ldb_context *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_next: void (struct ldb_module *, struct ldb_module *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_hook: int (struct ldb_context *, enum ldb_module_hook_type)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_modules_load: int (const char *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_difference: int (struct ldb_context *, TALLOC_CTX *, struct ldb_message *, struct ldb_message *, struct ldb_message **)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(TALLOC_CTX *)
-ldb_msg_normalize: int (struct ldb_context *, TALLOC_CTX *, const struct ldb_message *, struct ldb_message **)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_options_find: const char *(struct ldb_context *, const char **, const char *)
-ldb_parse_control_from_string: struct ldb_control *(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, TALLOC_CTX *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(TALLOC_CTX *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn, bool)
-ldb_register_hook: int (ldb_hook_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_req_get_custom_flags: uint32_t (struct ldb_request *)
-ldb_req_is_untrusted: bool (struct ldb_request *)
-ldb_req_location: const char *(struct ldb_request *)
-ldb_req_mark_trusted: void (struct ldb_request *)
-ldb_req_mark_untrusted: void (struct ldb_request *)
-ldb_req_set_custom_flags: void (struct ldb_request *, uint32_t)
-ldb_req_set_location: void (struct ldb_request *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_replace_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_save_controls: int (struct ldb_control *, struct ldb_request *, struct ldb_control ***)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (TALLOC_CTX *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
diff --git a/source4/lib/ldb/ABI/ldb-ildap-0.9.12.sigs b/source4/lib/ldb/ABI/ldb-ildap-0.9.12.sigs
deleted file mode 100644
index 4639220759..0000000000
--- a/source4/lib/ldb/ABI/ldb-ildap-0.9.12.sigs
+++ /dev/null
@@ -1,224 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(void *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(void *, const char *, int)
-ldb_binary_decode: struct ldb_val (void *, const char *)
-ldb_binary_encode: char *(void *, struct ldb_val)
-ldb_binary_encode_string: char *(void *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, void *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, void *, const char *, size_t)
-ldb_casefold_default: char *(void *, void *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(void *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(void *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_escape_value: char *(void *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(void *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(void *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(void *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(void *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(void *, struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_init_module_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_load_modules_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, void *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(void *)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, void *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(void *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_register_samba_handlers: int (struct ldb_context *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_samba_syntax_by_lDAPDisplayName: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_samba_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (void *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
-ldb_wrap_connect: struct ldb_context *(TALLOC_CTX *, struct tevent_context *, struct loadparm_context *, const char *, struct auth_session_info *, struct cli_credentials *, unsigned int)
-ldb_wrap_fork_hook: void (void)
diff --git a/source4/lib/ldb/ABI/ldb-samba4-0.9.10.sigs b/source4/lib/ldb/ABI/ldb-samba4-0.9.10.sigs
deleted file mode 100644
index 7f9dbb5297..0000000000
--- a/source4/lib/ldb/ABI/ldb-samba4-0.9.10.sigs
+++ /dev/null
@@ -1,223 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(void *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(void *, const char *, int)
-ldb_binary_decode: struct ldb_val (void *, const char *)
-ldb_binary_encode: char *(void *, struct ldb_val)
-ldb_binary_encode_string: char *(void *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, void *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, void *, const char *, size_t)
-ldb_casefold_default: char *(void *, void *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(void *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(void *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_escape_value: char *(void *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(void *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(void *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(void *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(void *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(void *, struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_init_module_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_load_modules_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, void *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(void *)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, void *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(void *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_register_samba_handlers: int (struct ldb_context *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_samba_syntax_by_lDAPDisplayName: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_samba_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (void *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
-ldb_wrap_connect: struct ldb_context *(TALLOC_CTX *, struct tevent_context *, struct loadparm_context *, const char *, struct auth_session_info *, struct cli_credentials *, unsigned int)
-ldb_wrap_fork_hook: void (void)
diff --git a/source4/lib/ldb/ABI/ldb-samba4-0.9.11.sigs b/source4/lib/ldb/ABI/ldb-samba4-0.9.11.sigs
deleted file mode 100644
index 4639220759..0000000000
--- a/source4/lib/ldb/ABI/ldb-samba4-0.9.11.sigs
+++ /dev/null
@@ -1,224 +0,0 @@
-ldb_add: int (struct ldb_context *, const struct ldb_message *)
-ldb_any_comparison: int (struct ldb_context *, void *, ldb_attr_handler_t, const struct ldb_val *, const struct ldb_val *)
-ldb_asprintf_errstring: void (struct ldb_context *, const char *, ...)
-ldb_attr_casefold: char *(void *, const char *)
-ldb_attr_dn: int (const char *)
-ldb_attr_in_list: int (const char * const *, const char *)
-ldb_attr_list_copy: const char **(TALLOC_CTX *, const char * const *)
-ldb_attr_list_copy_add: const char **(TALLOC_CTX *, const char * const *, const char *)
-ldb_base64_decode: int (char *)
-ldb_base64_encode: char *(void *, const char *, int)
-ldb_binary_decode: struct ldb_val (void *, const char *)
-ldb_binary_encode: char *(void *, struct ldb_val)
-ldb_binary_encode_string: char *(void *, const char *)
-ldb_build_add_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_del_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_extended_req: int (struct ldb_request **, struct ldb_context *, void *, const char *, void *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_mod_req: int (struct ldb_request **, struct ldb_context *, void *, const struct ldb_message *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_rename_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, struct ldb_dn *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, const char *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_build_search_req_ex: int (struct ldb_request **, struct ldb_context *, void *, struct ldb_dn *, enum ldb_scope, struct ldb_parse_tree *, const char * const *, struct ldb_control **, void *, ldb_request_callback_t, struct ldb_request *)
-ldb_casefold: char *(struct ldb_context *, void *, const char *, size_t)
-ldb_casefold_default: char *(void *, void *, const char *, size_t)
-ldb_comparison_binary: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_comparison_fold: int (struct ldb_context *, void *, const struct ldb_val *, const struct ldb_val *)
-ldb_connect: int (struct ldb_context *, const char *, unsigned int, const char **)
-ldb_connect_backend: int (struct ldb_context *, const char *, const char **, struct ldb_module **)
-ldb_debug: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_debug_add: void (struct ldb_context *, const char *, ...)
-ldb_debug_end: void (struct ldb_context *, enum ldb_debug_level)
-ldb_debug_set: void (struct ldb_context *, enum ldb_debug_level, const char *, ...)
-ldb_delete: int (struct ldb_context *, struct ldb_dn *)
-ldb_dn_add_base: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_base_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_add_child: bool (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_add_child_fmt: bool (struct ldb_dn *, const char *, ...)
-ldb_dn_alloc_casefold: char *(void *, struct ldb_dn *)
-ldb_dn_alloc_linearized: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_ex_string: char *(void *, struct ldb_dn *)
-ldb_dn_canonical_string: char *(void *, struct ldb_dn *)
-ldb_dn_check_local: bool (struct ldb_module *, struct ldb_dn *)
-ldb_dn_check_special: bool (struct ldb_dn *, const char *)
-ldb_dn_compare: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_compare_base: int (struct ldb_dn *, struct ldb_dn *)
-ldb_dn_copy: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_escape_value: char *(void *, struct ldb_val)
-ldb_dn_extended_add_syntax: int (struct ldb_context *, unsigned int, const struct ldb_dn_extended_syntax *)
-ldb_dn_extended_filter: void (struct ldb_dn *, const char * const *)
-ldb_dn_extended_syntax_by_name: const struct ldb_dn_extended_syntax *(struct ldb_context *, const char *)
-ldb_dn_from_ldb_val: struct ldb_dn *(void *, struct ldb_context *, const struct ldb_val *)
-ldb_dn_get_casefold: const char *(struct ldb_dn *)
-ldb_dn_get_comp_num: int (struct ldb_dn *)
-ldb_dn_get_component_name: const char *(struct ldb_dn *, unsigned int)
-ldb_dn_get_component_val: const struct ldb_val *(struct ldb_dn *, unsigned int)
-ldb_dn_get_extended_component: const struct ldb_val *(struct ldb_dn *, const char *)
-ldb_dn_get_extended_linearized: char *(void *, struct ldb_dn *, int)
-ldb_dn_get_linearized: const char *(struct ldb_dn *)
-ldb_dn_get_parent: struct ldb_dn *(void *, struct ldb_dn *)
-ldb_dn_get_rdn_name: const char *(struct ldb_dn *)
-ldb_dn_get_rdn_val: const struct ldb_val *(struct ldb_dn *)
-ldb_dn_has_extended: bool (struct ldb_dn *)
-ldb_dn_is_null: bool (struct ldb_dn *)
-ldb_dn_is_special: bool (struct ldb_dn *)
-ldb_dn_is_valid: bool (struct ldb_dn *)
-ldb_dn_map_local: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_rebase_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_map_remote: struct ldb_dn *(struct ldb_module *, void *, struct ldb_dn *)
-ldb_dn_new: struct ldb_dn *(void *, struct ldb_context *, const char *)
-ldb_dn_new_fmt: struct ldb_dn *(void *, struct ldb_context *, const char *, ...)
-ldb_dn_remove_base_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_child_components: bool (struct ldb_dn *, unsigned int)
-ldb_dn_remove_extended_components: void (struct ldb_dn *)
-ldb_dn_set_component: int (struct ldb_dn *, int, const char *, const struct ldb_val)
-ldb_dn_set_extended_component: int (struct ldb_dn *, const char *, const struct ldb_val *)
-ldb_dn_update_components: int (struct ldb_dn *, const struct ldb_dn *)
-ldb_dn_validate: bool (struct ldb_dn *)
-ldb_dump_results: void (struct ldb_context *, struct ldb_result *, FILE *)
-ldb_errstring: const char *(struct ldb_context *)
-ldb_extended: int (struct ldb_context *, const char *, void *, struct ldb_result **)
-ldb_extended_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_filter_from_tree: char *(void *, struct ldb_parse_tree *)
-ldb_get_config_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_create_perms: unsigned int (struct ldb_context *)
-ldb_get_default_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_event_context: struct tevent_context *(struct ldb_context *)
-ldb_get_flags: unsigned int (struct ldb_context *)
-ldb_get_opaque: void *(struct ldb_context *, const char *)
-ldb_get_root_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_get_schema_basedn: struct ldb_dn *(struct ldb_context *)
-ldb_global_init: int (void)
-ldb_handle_new: struct ldb_handle *(TALLOC_CTX *, struct ldb_context *)
-ldb_handler_copy: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_handler_fold: int (struct ldb_context *, void *, const struct ldb_val *, struct ldb_val *)
-ldb_init: struct ldb_context *(TALLOC_CTX *, struct tevent_context *)
-ldb_init_module_chain: int (struct ldb_context *, struct ldb_module *)
-ldb_ldif_message_string: char *(struct ldb_context *, TALLOC_CTX *, enum ldb_changetype, const struct ldb_message *)
-ldb_ldif_read: struct ldb_ldif *(struct ldb_context *, int (*)(void *), void *)
-ldb_ldif_read_file: struct ldb_ldif *(struct ldb_context *, FILE *)
-ldb_ldif_read_free: void (struct ldb_context *, struct ldb_ldif *)
-ldb_ldif_read_string: struct ldb_ldif *(struct ldb_context *, const char **)
-ldb_ldif_write: int (struct ldb_context *, int (*)(void *, const char *, ...), void *, const struct ldb_ldif *)
-ldb_ldif_write_file: int (struct ldb_context *, FILE *, const struct ldb_ldif *)
-ldb_ldif_write_string: char *(struct ldb_context *, TALLOC_CTX *, const struct ldb_ldif *)
-ldb_load_modules: int (struct ldb_context *, const char **)
-ldb_load_modules_list: int (struct ldb_context *, const char **, struct ldb_module *, struct ldb_module **)
-ldb_map_init: int (struct ldb_module *, const struct ldb_map_attribute *, const struct ldb_map_objectclass *, const char * const *, const char *, const char *)
-ldb_match_msg: int (struct ldb_context *, const struct ldb_message *, const struct ldb_parse_tree *, struct ldb_dn *, enum ldb_scope)
-ldb_match_msg_objectclass: int (const struct ldb_message *, const char *)
-ldb_mod_register_control: int (struct ldb_module *, const char *)
-ldb_modify: int (struct ldb_context *, const struct ldb_message *)
-ldb_modify_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_module_done: int (struct ldb_request *, struct ldb_control **, struct ldb_extended *, int)
-ldb_module_get_ctx: struct ldb_context *(struct ldb_module *)
-ldb_module_get_name: const char *(struct ldb_module *)
-ldb_module_get_ops: const struct ldb_module_ops *(struct ldb_module *)
-ldb_module_get_private: void *(struct ldb_module *)
-ldb_module_new: struct ldb_module *(TALLOC_CTX *, struct ldb_context *, const char *, const struct ldb_module_ops *)
-ldb_module_send_entry: int (struct ldb_request *, struct ldb_message *, struct ldb_control **)
-ldb_module_send_referral: int (struct ldb_request *, char *)
-ldb_module_set_private: void (struct ldb_module *, void *)
-ldb_modules_list_from_string: const char **(struct ldb_context *, TALLOC_CTX *, const char *)
-ldb_msg_add: int (struct ldb_message *, const struct ldb_message_element *, int)
-ldb_msg_add_empty: int (struct ldb_message *, const char *, int, struct ldb_message_element **)
-ldb_msg_add_fmt: int (struct ldb_message *, const char *, const char *, ...)
-ldb_msg_add_linearized_dn: int (struct ldb_message *, const char *, struct ldb_dn *)
-ldb_msg_add_steal_string: int (struct ldb_message *, const char *, char *)
-ldb_msg_add_steal_value: int (struct ldb_message *, const char *, struct ldb_val *)
-ldb_msg_add_string: int (struct ldb_message *, const char *, const char *)
-ldb_msg_add_value: int (struct ldb_message *, const char *, const struct ldb_val *, struct ldb_message_element **)
-ldb_msg_canonicalize: struct ldb_message *(struct ldb_context *, const struct ldb_message *)
-ldb_msg_check_string_attribute: int (const struct ldb_message *, const char *, const char *)
-ldb_msg_copy: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_copy_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_copy_shallow: struct ldb_message *(TALLOC_CTX *, const struct ldb_message *)
-ldb_msg_diff: struct ldb_message *(struct ldb_context *, struct ldb_message *, struct ldb_message *)
-ldb_msg_element_compare: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_element_compare_name: int (struct ldb_message_element *, struct ldb_message_element *)
-ldb_msg_find_attr_as_bool: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_dn: struct ldb_dn *(struct ldb_context *, void *, const struct ldb_message *, const char *)
-ldb_msg_find_attr_as_double: double (const struct ldb_message *, const char *, double)
-ldb_msg_find_attr_as_int: int (const struct ldb_message *, const char *, int)
-ldb_msg_find_attr_as_int64: int64_t (const struct ldb_message *, const char *, int64_t)
-ldb_msg_find_attr_as_string: const char *(const struct ldb_message *, const char *, const char *)
-ldb_msg_find_attr_as_uint: unsigned int (const struct ldb_message *, const char *, unsigned int)
-ldb_msg_find_attr_as_uint64: uint64_t (const struct ldb_message *, const char *, uint64_t)
-ldb_msg_find_element: struct ldb_message_element *(const struct ldb_message *, const char *)
-ldb_msg_find_ldb_val: const struct ldb_val *(const struct ldb_message *, const char *)
-ldb_msg_find_val: struct ldb_val *(const struct ldb_message_element *, struct ldb_val *)
-ldb_msg_new: struct ldb_message *(void *)
-ldb_msg_remove_attr: void (struct ldb_message *, const char *)
-ldb_msg_remove_element: void (struct ldb_message *, struct ldb_message_element *)
-ldb_msg_rename_attr: int (struct ldb_message *, const char *, const char *)
-ldb_msg_sanity_check: int (struct ldb_context *, const struct ldb_message *)
-ldb_msg_sort_elements: void (struct ldb_message *)
-ldb_next_del_trans: int (struct ldb_module *)
-ldb_next_end_trans: int (struct ldb_module *)
-ldb_next_init: int (struct ldb_module *)
-ldb_next_prepare_commit: int (struct ldb_module *)
-ldb_next_remote_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_request: int (struct ldb_module *, struct ldb_request *)
-ldb_next_start_trans: int (struct ldb_module *)
-ldb_op_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_parse_control_strings: struct ldb_control **(struct ldb_context *, void *, const char **)
-ldb_parse_tree: struct ldb_parse_tree *(void *, const char *)
-ldb_parse_tree_attr_replace: void (struct ldb_parse_tree *, const char *, const char *)
-ldb_parse_tree_copy_shallow: struct ldb_parse_tree *(TALLOC_CTX *, const struct ldb_parse_tree *)
-ldb_qsort: void (void * const, size_t, size_t, void *, ldb_qsort_cmp_fn_t)
-ldb_register_backend: int (const char *, ldb_connect_fn)
-ldb_register_module: int (const struct ldb_module_ops *)
-ldb_register_samba_handlers: int (struct ldb_context *)
-ldb_rename: int (struct ldb_context *, struct ldb_dn *, struct ldb_dn *)
-ldb_reply_add_control: int (struct ldb_reply *, const char *, bool, void *)
-ldb_reply_get_control: struct ldb_control *(struct ldb_reply *, const char *)
-ldb_request: int (struct ldb_context *, struct ldb_request *)
-ldb_request_add_control: int (struct ldb_request *, const char *, bool, void *)
-ldb_request_done: int (struct ldb_request *, int)
-ldb_request_get_control: struct ldb_control *(struct ldb_request *, const char *)
-ldb_request_get_status: int (struct ldb_request *)
-ldb_request_set_state: void (struct ldb_request *, int)
-ldb_reset_err_string: void (struct ldb_context *)
-ldb_samba_syntax_by_lDAPDisplayName: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_samba_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_schema_attribute_add: int (struct ldb_context *, const char *, unsigned int, const char *)
-ldb_schema_attribute_add_with_syntax: int (struct ldb_context *, const char *, unsigned int, const struct ldb_schema_syntax *)
-ldb_schema_attribute_by_name: const struct ldb_schema_attribute *(struct ldb_context *, const char *)
-ldb_schema_attribute_remove: void (struct ldb_context *, const char *)
-ldb_schema_attribute_set_override_handler: void (struct ldb_context *, ldb_attribute_handler_override_fn_t, void *)
-ldb_search: int (struct ldb_context *, TALLOC_CTX *, struct ldb_result **, struct ldb_dn *, enum ldb_scope, const char * const *, const char *, ...)
-ldb_search_default_callback: int (struct ldb_request *, struct ldb_reply *)
-ldb_sequence_number: int (struct ldb_context *, enum ldb_sequence_type, uint64_t *)
-ldb_set_create_perms: void (struct ldb_context *, unsigned int)
-ldb_set_debug: int (struct ldb_context *, void (*)(void *, enum ldb_debug_level, const char *, va_list), void *)
-ldb_set_debug_stderr: int (struct ldb_context *)
-ldb_set_default_dns: void (struct ldb_context *)
-ldb_set_errstring: void (struct ldb_context *, const char *)
-ldb_set_event_context: void (struct ldb_context *, struct tevent_context *)
-ldb_set_flags: void (struct ldb_context *, unsigned int)
-ldb_set_modules_dir: void (struct ldb_context *, const char *)
-ldb_set_opaque: int (struct ldb_context *, const char *, void *)
-ldb_set_timeout: int (struct ldb_context *, struct ldb_request *, int)
-ldb_set_timeout_from_prev_req: int (struct ldb_context *, struct ldb_request *, struct ldb_request *)
-ldb_set_utf8_default: void (struct ldb_context *)
-ldb_set_utf8_fns: void (struct ldb_context *, void *, char *(*)(void *, void *, const char *, size_t))
-ldb_setup_wellknown_attributes: int (struct ldb_context *)
-ldb_should_b64_encode: int (struct ldb_context *, const struct ldb_val *)
-ldb_standard_syntax_by_name: const struct ldb_schema_syntax *(struct ldb_context *, const char *)
-ldb_strerror: const char *(int)
-ldb_string_to_time: time_t (const char *)
-ldb_string_utc_to_time: time_t (const char *)
-ldb_timestring: char *(TALLOC_CTX *, time_t)
-ldb_timestring_utc: char *(TALLOC_CTX *, time_t)
-ldb_transaction_cancel: int (struct ldb_context *)
-ldb_transaction_cancel_noerr: int (struct ldb_context *)
-ldb_transaction_commit: int (struct ldb_context *)
-ldb_transaction_prepare_commit: int (struct ldb_context *)
-ldb_transaction_start: int (struct ldb_context *)
-ldb_val_dup: struct ldb_val (void *, const struct ldb_val *)
-ldb_val_equal_exact: int (const struct ldb_val *, const struct ldb_val *)
-ldb_val_map_local: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_map_remote: struct ldb_val (struct ldb_module *, void *, const struct ldb_map_attribute *, const struct ldb_val *)
-ldb_val_to_time: int (const struct ldb_val *, time_t *)
-ldb_valid_attr_name: int (const char *)
-ldb_wait: int (struct ldb_handle *, enum ldb_wait_type)
-ldb_wrap_connect: struct ldb_context *(TALLOC_CTX *, struct tevent_context *, struct loadparm_context *, const char *, struct auth_session_info *, struct cli_credentials *, unsigned int)
-ldb_wrap_fork_hook: void (void)
diff --git a/source4/lib/ldb/Doxyfile b/source4/lib/ldb/Doxyfile
deleted file mode 100644
index 07b12b516a..0000000000
--- a/source4/lib/ldb/Doxyfile
+++ /dev/null
@@ -1,26 +0,0 @@
-PROJECT_NAME = LDB
-OUTPUT_DIRECTORY = apidocs
-REPEAT_BRIEF = YES
-OPTIMIZE_OUTPUT_FOR_C = YES
-SORT_MEMBER_DOCS = YES
-SORT_BRIEF_DOCS = NO
-GENERATE_TODOLIST = YES
-GENERATE_BUGLIST = YES
-GENERATE_DEPRECATEDLIST= YES
-SHOW_USED_FILES = NO
-SHOW_DIRECTORIES = NO
-WARNINGS = YES
-WARN_IF_UNDOCUMENTED = YES
-WARN_IF_DOC_ERROR = YES
-WARN_NO_PARAMDOC = NO
-WARN_FORMAT = "$file:$line: $text"
-INPUT = include .
-FILE_PATTERNS = *.h *.dox
-EXCLUDE = include/config.h include/dlinklist.h \
- include/includes.h
-EXAMPLE_PATH = examples
-GENERATE_HTML = YES
-HTML_OUTPUT = html
-GENERATE_MAN = YES
-ALWAYS_DETAILED_SEC = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/source4/lib/ldb/Makefile b/source4/lib/ldb/Makefile
deleted file mode 100644
index a07b4a7164..0000000000
--- a/source4/lib/ldb/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-# simple makefile wrapper to run waf
-
-WAF=WAF_MAKE=1 PATH=buildtools/bin:../../../buildtools/bin:$$PATH waf
-
-all:
- $(WAF) build
-
-install:
- $(WAF) install
-
-uninstall:
- $(WAF) uninstall
-
-test:
- $(WAF) test $(TEST_OPTIONS)
-
-dist:
- touch .tmplock
- WAFLOCK=.tmplock $(WAF) dist
-
-distcheck:
- touch .tmplock
- WAFLOCK=.tmplock $(WAF) distcheck
-
-clean:
- $(WAF) clean
-
-distclean:
- $(WAF) distclean
-
-reconfigure: configure
- $(WAF) reconfigure
-
-show_waf_options:
- $(WAF) --help
-
-# some compatibility make targets
-everything: all
-
-testsuite: all
-
-check: test
-
-# this should do an install as well, once install is finished
-installcheck: test
-
-etags:
- $(WAF) etags
-
-ctags:
- $(WAF) ctags
diff --git a/source4/lib/ldb/README_gcov.txt b/source4/lib/ldb/README_gcov.txt
deleted file mode 100644
index 2abd9378f4..0000000000
--- a/source4/lib/ldb/README_gcov.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-Here is how to use gcov to test code coverage in ldb.
-
-Step 1: build ldb with gcov enabled
-
- make clean all WITH_GCOV=1
-
-Step 3: run the test suite
- make test-tdb
-
-Step 4: produce the gcov report
- make gcov
-
-Step 5: read the summary reports
- less *.report.gcov
-
-Step 6: examine the per-file reports
- less ldb_tdb\#ldb_tdb.c.gcov
-
-You can also combine steps 2 to 4 like this:
-
- make clean all test-tdb gcov WITH_GCOV=1
-
-Note that you should not expect 100% coverage, as some error paths
-(such as memory allocation failures) are very hard to trigger. There
-are ways of working around this, but they are quite tricky (they
-involve allocation wrappers that "fork and fail on malloc").
-
-The lines to look for in the per-file reports are the ones starting
-with "#####". Those are lines that are never executed.
diff --git a/source4/lib/ldb/common/attrib_handlers.c b/source4/lib/ldb/common/attrib_handlers.c
deleted file mode 100644
index 2f4454c7b4..0000000000
--- a/source4/lib/ldb/common/attrib_handlers.c
+++ /dev/null
@@ -1,496 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2005
- Copyright (C) Andrew Bartlett <abartlet@samba.org> 2006-2009
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-/*
- attribute handlers for well known attribute types, selected by syntax OID
- see rfc2252
-*/
-
-#include "ldb_private.h"
-#include "system/locale.h"
-#include "ldb_handlers.h"
-
-/*
- default handler that just copies a ldb_val.
-*/
-int ldb_handler_copy(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- *out = ldb_val_dup(mem_ctx, in);
- if (in->length > 0 && out->data == NULL) {
- ldb_oom(ldb);
- return -1;
- }
- return 0;
-}
-
-/*
- a case folding copy handler, removing leading and trailing spaces and
- multiple internal spaces
-
- We exploit the fact that utf8 never uses the space octet except for
- the space itself
-*/
-int ldb_handler_fold(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- char *s, *t;
- size_t l;
-
- if (!in || !out || !(in->data)) {
- return -1;
- }
-
- out->data = (uint8_t *)ldb_casefold(ldb, mem_ctx, (const char *)(in->data), in->length);
- if (out->data == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_handler_fold: unable to casefold string [%.*s]", (int)in->length, (const char *)in->data);
- return -1;
- }
-
- s = (char *)(out->data);
-
- /* remove trailing spaces if any */
- l = strlen(s);
- while (l > 0 && s[l - 1] == ' ') l--;
- s[l] = '\0';
-
- /* remove leading spaces if any */
- if (*s == ' ') {
- for (t = s; *s == ' '; s++) ;
-
- /* remove leading spaces by moving down the string */
- memmove(t, s, l);
-
- s = t;
- }
-
- /* check middle spaces */
- while ((t = strchr(s, ' ')) != NULL) {
- for (s = t; *s == ' '; s++) ;
-
- if ((s - t) > 1) {
- l = strlen(s);
-
- /* remove all spaces but one by moving down the string */
- memmove(t + 1, s, l);
- }
- }
-
- out->length = strlen((char *)out->data);
- return 0;
-}
-
-/* length limited conversion of a ldb_val to a int32_t */
-static int val_to_int64(const struct ldb_val *in, int64_t *v)
-{
- char *end;
- char buf[64];
-
- /* make sure we don't read past the end of the data */
- if (in->length > sizeof(buf)-1) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- strncpy(buf, (char *)in->data, in->length);
- buf[in->length] = 0;
-
- /* We've to use "strtoll" here to have the intended overflows.
- * Otherwise we may get "LONG_MAX" and the conversion is wrong. */
- *v = (int64_t) strtoll(buf, &end, 0);
- if (*end != 0) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- return LDB_SUCCESS;
-}
-
-
-/*
- canonicalise a ldap Integer
- rfc2252 specifies it should be in decimal form
-*/
-static int ldb_canonicalise_Integer(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- int64_t i;
- int ret;
-
- ret = val_to_int64(in, &i);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- out->data = (uint8_t *) talloc_asprintf(mem_ctx, "%lld", (long long)i);
- if (out->data == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- out->length = strlen((char *)out->data);
- return 0;
-}
-
-/*
- compare two Integers
-*/
-static int ldb_comparison_Integer(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- int64_t i1=0, i2=0;
- val_to_int64(v1, &i1);
- val_to_int64(v2, &i2);
- if (i1 == i2) return 0;
- return i1 > i2? 1 : -1;
-}
-
-/*
- canonicalise a ldap Boolean
- rfc2252 specifies it should be either "TRUE" or "FALSE"
-*/
-static int ldb_canonicalise_Boolean(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- if (strncasecmp((char *)in->data, "TRUE", in->length) == 0) {
- out->data = (uint8_t *)talloc_strdup(mem_ctx, "TRUE");
- out->length = 4;
- } else if (strncasecmp((char *)in->data, "FALSE", in->length) == 0) {
- out->data = (uint8_t *)talloc_strdup(mem_ctx, "FALSE");
- out->length = 4;
- } else {
- return -1;
- }
- return 0;
-}
-
-/*
- compare two Booleans
-*/
-static int ldb_comparison_Boolean(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- if (v1->length != v2->length) {
- return v1->length - v2->length;
- }
- return strncasecmp((char *)v1->data, (char *)v2->data, v1->length);
-}
-
-
-/*
- compare two binary blobs
-*/
-int ldb_comparison_binary(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- if (v1->length != v2->length) {
- return v1->length - v2->length;
- }
- return memcmp(v1->data, v2->data, v1->length);
-}
-
-/*
- compare two case insensitive strings, ignoring multiple whitespaces
- and leading and trailing whitespaces
- see rfc2252 section 8.1
-
- try to optimize for the ascii case,
- but if we find out an utf8 codepoint revert to slower but correct function
-*/
-int ldb_comparison_fold(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- const char *s1=(const char *)v1->data, *s2=(const char *)v2->data;
- size_t n1 = v1->length, n2 = v2->length;
- char *b1, *b2;
- const char *u1, *u2;
- int ret;
- while (n1 && *s1 == ' ') { s1++; n1--; };
- while (n2 && *s2 == ' ') { s2++; n2--; };
-
- while (n1 && n2 && *s1 && *s2) {
- /* the first 127 (0x7F) chars are ascii and utf8 guarantes they
- * never appear in multibyte sequences */
- if (((unsigned char)s1[0]) & 0x80) goto utf8str;
- if (((unsigned char)s2[0]) & 0x80) goto utf8str;
- if (toupper((unsigned char)*s1) != toupper((unsigned char)*s2))
- break;
- if (*s1 == ' ') {
- while (n1 && s1[0] == s1[1]) { s1++; n1--; }
- while (n2 && s2[0] == s2[1]) { s2++; n2--; }
- }
- s1++; s2++;
- n1--; n2--;
- }
-
- /* check for trailing spaces only if the other pointers has
- * reached the end of the strings otherwise we can
- * mistakenly match. ex. "domain users" <->
- * "domainUpdates"
- */
- if (n1 && *s1 == ' ' && (!n2 || !*s2)) {
- while (n1 && *s1 == ' ') { s1++; n1--; }
- }
- if (n2 && *s2 == ' ' && (!n1 || !*s1)) {
- while (n2 && *s2 == ' ') { s2++; n2--; }
- }
- if (n1 == 0 && n2 != 0) {
- return -(int)toupper(*s2);
- }
- if (n2 == 0 && n1 != 0) {
- return (int)toupper(*s1);
- }
- if (n2 == 0 && n2 == 0) {
- return 0;
- }
- return (int)toupper(*s1) - (int)toupper(*s2);
-
-utf8str:
- /* no need to recheck from the start, just from the first utf8 char found */
- b1 = ldb_casefold(ldb, mem_ctx, s1, n1);
- b2 = ldb_casefold(ldb, mem_ctx, s2, n2);
-
- if (!b1 || !b2) {
- /* One of the strings was not UTF8, so we have no
- * options but to do a binary compare */
- talloc_free(b1);
- talloc_free(b2);
- ret = memcmp(s1, s2, MIN(n1, n2));
- if (ret == 0) {
- if (n1 == n2) return 0;
- if (n1 > n2) {
- return (int)toupper(s1[n2]);
- } else {
- return -(int)toupper(s2[n1]);
- }
- }
- return ret;
- }
-
- u1 = b1;
- u2 = b2;
-
- while (*u1 & *u2) {
- if (*u1 != *u2)
- break;
- if (*u1 == ' ') {
- while (u1[0] == u1[1]) u1++;
- while (u2[0] == u2[1]) u2++;
- }
- u1++; u2++;
- }
- if (! (*u1 && *u2)) {
- while (*u1 == ' ') u1++;
- while (*u2 == ' ') u2++;
- }
- ret = (int)(*u1 - *u2);
-
- talloc_free(b1);
- talloc_free(b2);
-
- return ret;
-}
-
-
-/*
- canonicalise a attribute in DN format
-*/
-static int ldb_canonicalise_dn(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- struct ldb_dn *dn;
- int ret = -1;
-
- out->length = 0;
- out->data = NULL;
-
- dn = ldb_dn_from_ldb_val(mem_ctx, ldb, in);
- if ( ! ldb_dn_validate(dn)) {
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- out->data = (uint8_t *)ldb_dn_alloc_casefold(mem_ctx, dn);
- if (out->data == NULL) {
- goto done;
- }
- out->length = strlen((char *)out->data);
-
- ret = 0;
-
-done:
- talloc_free(dn);
-
- return ret;
-}
-
-/*
- compare two dns
-*/
-static int ldb_comparison_dn(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- struct ldb_dn *dn1 = NULL, *dn2 = NULL;
- int ret;
-
- dn1 = ldb_dn_from_ldb_val(mem_ctx, ldb, v1);
- if ( ! ldb_dn_validate(dn1)) return -1;
-
- dn2 = ldb_dn_from_ldb_val(mem_ctx, ldb, v2);
- if ( ! ldb_dn_validate(dn2)) {
- talloc_free(dn1);
- return -1;
- }
-
- ret = ldb_dn_compare(dn1, dn2);
-
- talloc_free(dn1);
- talloc_free(dn2);
- return ret;
-}
-
-/*
- compare two utc time values. 1 second resolution
-*/
-static int ldb_comparison_utctime(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2)
-{
- time_t t1=0, t2=0;
- ldb_val_to_time(v1, &t1);
- ldb_val_to_time(v2, &t2);
- if (t1 == t2) return 0;
- return t1 > t2? 1 : -1;
-}
-
-/*
- canonicalise a utc time
-*/
-static int ldb_canonicalise_utctime(struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out)
-{
- time_t t;
- int ret;
- ret = ldb_val_to_time(in, &t);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- out->data = (uint8_t *)ldb_timestring(mem_ctx, t);
- if (out->data == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- out->length = strlen((char *)out->data);
- return 0;
-}
-
-/*
- table of standard attribute handlers
-*/
-static const struct ldb_schema_syntax ldb_standard_syntaxes[] = {
- {
- .name = LDB_SYNTAX_INTEGER,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldb_canonicalise_Integer,
- .comparison_fn = ldb_comparison_Integer
- },
- {
- .name = LDB_SYNTAX_OCTET_STRING,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldb_handler_copy,
- .comparison_fn = ldb_comparison_binary
- },
- {
- .name = LDB_SYNTAX_DIRECTORY_STRING,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldb_handler_fold,
- .comparison_fn = ldb_comparison_fold
- },
- {
- .name = LDB_SYNTAX_DN,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldb_canonicalise_dn,
- .comparison_fn = ldb_comparison_dn
- },
- {
- .name = LDB_SYNTAX_OBJECTCLASS,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldb_handler_fold,
- .comparison_fn = ldb_comparison_fold
- },
- {
- .name = LDB_SYNTAX_UTC_TIME,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldb_canonicalise_utctime,
- .comparison_fn = ldb_comparison_utctime
- },
- {
- .name = LDB_SYNTAX_BOOLEAN,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldb_canonicalise_Boolean,
- .comparison_fn = ldb_comparison_Boolean
- },
-};
-
-
-/*
- return the attribute handlers for a given syntax name
-*/
-const struct ldb_schema_syntax *ldb_standard_syntax_by_name(struct ldb_context *ldb,
- const char *syntax)
-{
- unsigned int i;
- unsigned num_handlers = sizeof(ldb_standard_syntaxes)/sizeof(ldb_standard_syntaxes[0]);
- /* TODO: should be replaced with a binary search */
- for (i=0;i<num_handlers;i++) {
- if (strcmp(ldb_standard_syntaxes[i].name, syntax) == 0) {
- return &ldb_standard_syntaxes[i];
- }
- }
- return NULL;
-}
-
-int ldb_any_comparison(struct ldb_context *ldb, void *mem_ctx,
- ldb_attr_handler_t canonicalise_fn,
- const struct ldb_val *v1,
- const struct ldb_val *v2)
-{
- int ret, ret1, ret2;
- struct ldb_val v1_canon, v2_canon;
- TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
-
- /* I could try and bail if tmp_ctx was NULL, but what return
- * value would I use?
- *
- * It seems easier to continue on the NULL context
- */
- ret1 = canonicalise_fn(ldb, tmp_ctx, v1, &v1_canon);
- ret2 = canonicalise_fn(ldb, tmp_ctx, v2, &v2_canon);
-
- if (ret1 == LDB_SUCCESS && ret2 == LDB_SUCCESS) {
- ret = ldb_comparison_binary(ldb, mem_ctx, &v1_canon, &v2_canon);
- } else {
- ret = ldb_comparison_binary(ldb, mem_ctx, v1, v2);
- }
- talloc_free(tmp_ctx);
- return ret;
-}
diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c
deleted file mode 100644
index 433f30b7c1..0000000000
--- a/source4/lib/ldb/common/ldb.c
+++ /dev/null
@@ -1,1923 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
- Copyright (C) Simo Sorce 2005-2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb core API
- *
- * Description: core API routines interfacing to ldb backends
- *
- * Author: Andrew Tridgell
- */
-
-#define TEVENT_DEPRECATED 1
-#include "ldb_private.h"
-#include "ldb.h"
-
-static int ldb_context_destructor(void *ptr)
-{
- struct ldb_context *ldb = talloc_get_type(ptr, struct ldb_context);
-
- if (ldb->transaction_active) {
- ldb_debug(ldb, LDB_DEBUG_FATAL,
- "A transaction is still active in ldb context [%p] on %s",
- ldb, (const char *)ldb_get_opaque(ldb, "ldb_url"));
- }
-
- return 0;
-}
-
-/*
- this is used to catch debug messages from events
-*/
-static void ldb_tevent_debug(void *context, enum tevent_debug_level level,
- const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
-
-static void ldb_tevent_debug(void *context, enum tevent_debug_level level,
- const char *fmt, va_list ap)
-{
- struct ldb_context *ldb = talloc_get_type(context, struct ldb_context);
- enum ldb_debug_level ldb_level = LDB_DEBUG_FATAL;
- char *s = NULL;
-
- switch (level) {
- case TEVENT_DEBUG_FATAL:
- ldb_level = LDB_DEBUG_FATAL;
- break;
- case TEVENT_DEBUG_ERROR:
- ldb_level = LDB_DEBUG_ERROR;
- break;
- case TEVENT_DEBUG_WARNING:
- ldb_level = LDB_DEBUG_WARNING;
- break;
- case TEVENT_DEBUG_TRACE:
- ldb_level = LDB_DEBUG_TRACE;
- break;
- };
-
- vasprintf(&s, fmt, ap);
- if (!s) return;
- ldb_debug(ldb, ldb_level, "tevent: %s", s);
- free(s);
-}
-
-/*
- initialise a ldb context
- The mem_ctx is required
- The event_ctx is required
-*/
-struct ldb_context *ldb_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx)
-{
- struct ldb_context *ldb;
- int ret;
- const char *modules_path = getenv("LDB_MODULES_PATH");
-
- if (modules_path == NULL) {
- modules_path = LDB_MODULESDIR;
- }
-
- ret = ldb_modules_load(modules_path, LDB_VERSION);
- if (ret != LDB_SUCCESS) {
- return NULL;
- }
-
- ldb = talloc_zero(mem_ctx, struct ldb_context);
- if (ldb == NULL) {
- return NULL;
- }
-
- /* A new event context so that callers who don't want ldb
- * operating on thier global event context can work without
- * having to provide their own private one explicitly */
- if (ev_ctx == NULL) {
- ev_ctx = tevent_context_init(ldb);
- tevent_set_debug(ev_ctx, ldb_tevent_debug, ldb);
- tevent_loop_allow_nesting(ev_ctx);
- }
-
- ret = ldb_setup_wellknown_attributes(ldb);
- if (ret != LDB_SUCCESS) {
- talloc_free(ldb);
- return NULL;
- }
-
- ldb_set_utf8_default(ldb);
- ldb_set_create_perms(ldb, 0666);
- ldb_set_modules_dir(ldb, LDB_MODULESDIR);
- ldb_set_event_context(ldb, ev_ctx);
-
- /* TODO: get timeout from options if available there */
- ldb->default_timeout = 300; /* set default to 5 minutes */
-
- talloc_set_destructor((TALLOC_CTX *)ldb, ldb_context_destructor);
-
- return ldb;
-}
-
-/*
- try to autodetect a basedn if none specified. This fixes one of my
- pet hates about ldapsearch, which is that you have to get a long,
- complex basedn right to make any use of it.
-*/
-void ldb_set_default_dns(struct ldb_context *ldb)
-{
- TALLOC_CTX *tmp_ctx;
- int ret;
- struct ldb_result *res;
- struct ldb_dn *tmp_dn=NULL;
- static const char *attrs[] = {
- "rootDomainNamingContext",
- "configurationNamingContext",
- "schemaNamingContext",
- "defaultNamingContext",
- NULL
- };
-
- tmp_ctx = talloc_new(ldb);
- ret = ldb_search(ldb, tmp_ctx, &res, ldb_dn_new(tmp_ctx, ldb, NULL),
- LDB_SCOPE_BASE, attrs, "(objectClass=*)");
- if (ret != LDB_SUCCESS) {
- talloc_free(tmp_ctx);
- return;
- }
-
- if (res->count != 1) {
- talloc_free(tmp_ctx);
- return;
- }
-
- if (!ldb_get_opaque(ldb, "rootDomainNamingContext")) {
- tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
- "rootDomainNamingContext");
- ldb_set_opaque(ldb, "rootDomainNamingContext", tmp_dn);
- }
-
- if (!ldb_get_opaque(ldb, "configurationNamingContext")) {
- tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
- "configurationNamingContext");
- ldb_set_opaque(ldb, "configurationNamingContext", tmp_dn);
- }
-
- if (!ldb_get_opaque(ldb, "schemaNamingContext")) {
- tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
- "schemaNamingContext");
- ldb_set_opaque(ldb, "schemaNamingContext", tmp_dn);
- }
-
- if (!ldb_get_opaque(ldb, "defaultNamingContext")) {
- tmp_dn = ldb_msg_find_attr_as_dn(ldb, ldb, res->msgs[0],
- "defaultNamingContext");
- ldb_set_opaque(ldb, "defaultNamingContext", tmp_dn);
- }
-
- talloc_free(tmp_ctx);
-}
-
-struct ldb_dn *ldb_get_root_basedn(struct ldb_context *ldb)
-{
- void *opaque = ldb_get_opaque(ldb, "rootDomainNamingContext");
- return talloc_get_type(opaque, struct ldb_dn);
-}
-
-struct ldb_dn *ldb_get_config_basedn(struct ldb_context *ldb)
-{
- void *opaque = ldb_get_opaque(ldb, "configurationNamingContext");
- return talloc_get_type(opaque, struct ldb_dn);
-}
-
-struct ldb_dn *ldb_get_schema_basedn(struct ldb_context *ldb)
-{
- void *opaque = ldb_get_opaque(ldb, "schemaNamingContext");
- return talloc_get_type(opaque, struct ldb_dn);
-}
-
-struct ldb_dn *ldb_get_default_basedn(struct ldb_context *ldb)
-{
- void *opaque = ldb_get_opaque(ldb, "defaultNamingContext");
- return talloc_get_type(opaque, struct ldb_dn);
-}
-
-/*
- connect to a database. The URL can either be one of the following forms
- ldb://path
- ldapi://path
-
- flags is made up of LDB_FLG_*
-
- the options are passed uninterpreted to the backend, and are
- backend specific
-*/
-int ldb_connect(struct ldb_context *ldb, const char *url,
- unsigned int flags, const char *options[])
-{
- int ret;
- char *url2;
- /* We seem to need to do this here, or else some utilities don't
- * get ldb backends */
-
- ldb->flags = flags;
-
- url2 = talloc_strdup(ldb, url);
- if (!url2) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ret = ldb_set_opaque(ldb, "ldb_url", url2);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ldb_module_connect_backend(ldb, url, options, &ldb->modules);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- if (ldb_load_modules(ldb, options) != LDB_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_FATAL,
- "Unable to load modules for %s: %s",
- url, ldb_errstring(ldb));
- return LDB_ERR_OTHER;
- }
-
- /* set the default base dn */
- ldb_set_default_dns(ldb);
-
- return LDB_SUCCESS;
-}
-
-void ldb_set_errstring(struct ldb_context *ldb, const char *err_string)
-{
- if (ldb->err_string) {
- talloc_free(ldb->err_string);
- }
- ldb->err_string = talloc_strdup(ldb, err_string);
- if (ldb->flags & LDB_FLG_ENABLE_TRACING) {
- ldb_debug(ldb, LDB_DEBUG_TRACE, "ldb_set_errstring: %s", ldb->err_string);
- }
-}
-
-void ldb_asprintf_errstring(struct ldb_context *ldb, const char *format, ...)
-{
- va_list ap;
- char *old_string = NULL;
-
- if (ldb->err_string) {
- old_string = ldb->err_string;
- }
-
- va_start(ap, format);
- ldb->err_string = talloc_vasprintf(ldb, format, ap);
- va_end(ap);
- talloc_free(old_string);
-}
-
-void ldb_reset_err_string(struct ldb_context *ldb)
-{
- if (ldb->err_string) {
- talloc_free(ldb->err_string);
- ldb->err_string = NULL;
- }
-}
-
-
-
-/*
- set an ldb error based on file:line
-*/
-int ldb_error_at(struct ldb_context *ldb, int ecode,
- const char *reason, const char *file, int line)
-{
- if (reason == NULL) {
- reason = ldb_strerror(ecode);
- }
- ldb_asprintf_errstring(ldb, "%s at %s:%d", reason, file, line);
- return ecode;
-}
-
-
-#define FIRST_OP_NOERR(ldb, op) do { \
- module = ldb->modules; \
- while (module && module->ops->op == NULL) module = module->next; \
- if ((ldb->flags & LDB_FLG_ENABLE_TRACING) && module) { \
- ldb_debug(ldb, LDB_DEBUG_TRACE, "ldb_trace_request: (%s)->" #op, \
- module->ops->name); \
- } \
-} while (0)
-
-#define FIRST_OP(ldb, op) do { \
- FIRST_OP_NOERR(ldb, op); \
- if (module == NULL) { \
- ldb_asprintf_errstring(ldb, "unable to find module or backend to handle operation: " #op); \
- return LDB_ERR_OPERATIONS_ERROR; \
- } \
-} while (0)
-
-
-/*
- start a transaction
-*/
-int ldb_transaction_start(struct ldb_context *ldb)
-{
- struct ldb_module *module;
- int status;
-
- ldb_debug(ldb, LDB_DEBUG_TRACE,
- "start ldb transaction (nesting: %d)",
- ldb->transaction_active);
-
- /* explicit transaction active, count nested requests */
- if (ldb->transaction_active) {
- ldb->transaction_active++;
- return LDB_SUCCESS;
- }
-
- /* start a new transaction */
- ldb->transaction_active++;
- ldb->prepare_commit_done = false;
-
- FIRST_OP(ldb, start_transaction);
-
- ldb_reset_err_string(ldb);
-
- status = module->ops->start_transaction(module);
- if (status != LDB_SUCCESS) {
- if (ldb->err_string == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb,
- "ldb transaction start: %s (%d)",
- ldb_strerror(status),
- status);
- }
- }
- if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "start ldb transaction error: %s",
- ldb_errstring(module->ldb));
- }
- return status;
-}
-
-/*
- prepare for transaction commit (first phase of two phase commit)
-*/
-int ldb_transaction_prepare_commit(struct ldb_context *ldb)
-{
- struct ldb_module *module;
- int status;
-
- if (ldb->prepare_commit_done) {
- return LDB_SUCCESS;
- }
-
- /* commit only when all nested transactions are complete */
- if (ldb->transaction_active > 1) {
- return LDB_SUCCESS;
- }
-
- ldb->prepare_commit_done = true;
-
- if (ldb->transaction_active < 0) {
- ldb_debug(ldb, LDB_DEBUG_FATAL,
- "prepare commit called but no ldb transactions are active!");
- ldb->transaction_active = 0;
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* call prepare transaction if available */
- FIRST_OP_NOERR(ldb, prepare_commit);
- if (module == NULL) {
- return LDB_SUCCESS;
- }
-
- status = module->ops->prepare_commit(module);
- if (status != LDB_SUCCESS) {
- /* if a module fails the prepare then we need
- to call the end transaction for everyone */
- FIRST_OP(ldb, del_transaction);
- module->ops->del_transaction(module);
- if (ldb->err_string == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb,
- "ldb transaction prepare commit: %s (%d)",
- ldb_strerror(status),
- status);
- }
- if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "prepare commit transaction error: %s",
- ldb_errstring(module->ldb));
- }
- }
-
- return status;
-}
-
-
-/*
- commit a transaction
-*/
-int ldb_transaction_commit(struct ldb_context *ldb)
-{
- struct ldb_module *module;
- int status;
-
- status = ldb_transaction_prepare_commit(ldb);
- if (status != LDB_SUCCESS) {
- return status;
- }
-
- ldb->transaction_active--;
-
- ldb_debug(ldb, LDB_DEBUG_TRACE,
- "commit ldb transaction (nesting: %d)",
- ldb->transaction_active);
-
- /* commit only when all nested transactions are complete */
- if (ldb->transaction_active > 0) {
- return LDB_SUCCESS;
- }
-
- if (ldb->transaction_active < 0) {
- ldb_debug(ldb, LDB_DEBUG_FATAL,
- "commit called but no ldb transactions are active!");
- ldb->transaction_active = 0;
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ldb_reset_err_string(ldb);
-
- FIRST_OP(ldb, end_transaction);
- status = module->ops->end_transaction(module);
- if (status != LDB_SUCCESS) {
- if (ldb->err_string == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb,
- "ldb transaction commit: %s (%d)",
- ldb_strerror(status),
- status);
- }
- if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "commit ldb transaction error: %s",
- ldb_errstring(module->ldb));
- }
- /* cancel the transaction */
- FIRST_OP(ldb, del_transaction);
- module->ops->del_transaction(module);
- }
- return status;
-}
-
-
-/*
- cancel a transaction
-*/
-int ldb_transaction_cancel(struct ldb_context *ldb)
-{
- struct ldb_module *module;
- int status;
-
- ldb->transaction_active--;
-
- ldb_debug(ldb, LDB_DEBUG_TRACE,
- "cancel ldb transaction (nesting: %d)",
- ldb->transaction_active);
-
- /* really cancel only if all nested transactions are complete */
- if (ldb->transaction_active > 0) {
- return LDB_SUCCESS;
- }
-
- if (ldb->transaction_active < 0) {
- ldb_debug(ldb, LDB_DEBUG_FATAL,
- "cancel called but no ldb transactions are active!");
- ldb->transaction_active = 0;
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- FIRST_OP(ldb, del_transaction);
-
- status = module->ops->del_transaction(module);
- if (status != LDB_SUCCESS) {
- if (ldb->err_string == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb,
- "ldb transaction cancel: %s (%d)",
- ldb_strerror(status),
- status);
- }
- if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "cancel ldb transaction error: %s",
- ldb_errstring(module->ldb));
- }
- }
- return status;
-}
-
-/*
- cancel a transaction with no error if no transaction is pending
- used when we fork() to clear any parent transactions
-*/
-int ldb_transaction_cancel_noerr(struct ldb_context *ldb)
-{
- if (ldb->transaction_active > 0) {
- return ldb_transaction_cancel(ldb);
- }
- return LDB_SUCCESS;
-}
-
-
-/* autostarts a transacion if none active */
-static int ldb_autotransaction_request(struct ldb_context *ldb,
- struct ldb_request *req)
-{
- int ret;
-
- ret = ldb_transaction_start(ldb);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ldb_request(ldb, req);
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
- if (ret == LDB_SUCCESS) {
- return ldb_transaction_commit(ldb);
- }
- ldb_transaction_cancel(ldb);
-
- if (ldb->err_string == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb, "%s (%d)", ldb_strerror(ret), ret);
- }
-
- return ret;
-}
-
-int ldb_wait(struct ldb_handle *handle, enum ldb_wait_type type)
-{
- struct tevent_context *ev;
- int ret;
-
- if (!handle) {
- return LDB_ERR_UNAVAILABLE;
- }
-
- if (handle->state == LDB_ASYNC_DONE) {
- return handle->status;
- }
-
- ev = ldb_get_event_context(handle->ldb);
- if (NULL == ev) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- switch (type) {
- case LDB_WAIT_NONE:
- ret = tevent_loop_once(ev);
- if (ret != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- if (handle->state == LDB_ASYNC_DONE ||
- handle->status != LDB_SUCCESS) {
- return handle->status;
- }
- break;
-
- case LDB_WAIT_ALL:
- while (handle->state != LDB_ASYNC_DONE) {
- ret = tevent_loop_once(ev);
- if (ret != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- if (handle->status != LDB_SUCCESS) {
- return handle->status;
- }
- }
- return handle->status;
- }
-
- return LDB_SUCCESS;
-}
-
-/* set the specified timeout or, if timeout is 0 set the default timeout */
-int ldb_set_timeout(struct ldb_context *ldb,
- struct ldb_request *req,
- int timeout)
-{
- if (req == NULL) return LDB_ERR_OPERATIONS_ERROR;
-
- if (timeout != 0) {
- req->timeout = timeout;
- } else {
- req->timeout = ldb->default_timeout;
- }
- req->starttime = time(NULL);
-
- return LDB_SUCCESS;
-}
-
-/* calculates the new timeout based on the previous starttime and timeout */
-int ldb_set_timeout_from_prev_req(struct ldb_context *ldb,
- struct ldb_request *oldreq,
- struct ldb_request *newreq)
-{
- if (newreq == NULL) return LDB_ERR_OPERATIONS_ERROR;
-
- if (oldreq == NULL) {
- return ldb_set_timeout(ldb, newreq, 0);
- }
-
- newreq->starttime = oldreq->starttime;
- newreq->timeout = oldreq->timeout;
-
- return LDB_SUCCESS;
-}
-
-
-/*
- set the permissions for new files to be passed to open() in
- backends that use local files
- */
-void ldb_set_create_perms(struct ldb_context *ldb, unsigned int perms)
-{
- ldb->create_perms = perms;
-}
-
-unsigned int ldb_get_create_perms(struct ldb_context *ldb)
-{
- return ldb->create_perms;
-}
-
-void ldb_set_event_context(struct ldb_context *ldb, struct tevent_context *ev)
-{
- ldb->ev_ctx = ev;
-}
-
-struct tevent_context * ldb_get_event_context(struct ldb_context *ldb)
-{
- return ldb->ev_ctx;
-}
-
-void ldb_request_set_state(struct ldb_request *req, int state)
-{
- req->handle->state = state;
-}
-
-int ldb_request_get_status(struct ldb_request *req)
-{
- return req->handle->status;
-}
-
-
-/*
- trace a ldb request
-*/
-static void ldb_trace_request(struct ldb_context *ldb, struct ldb_request *req)
-{
- TALLOC_CTX *tmp_ctx = talloc_new(req);
- unsigned int i;
-
- switch (req->operation) {
- case LDB_SEARCH:
- ldb_debug_add(ldb, "ldb_trace_request: SEARCH\n");
- ldb_debug_add(ldb, " dn: %s\n",
- ldb_dn_is_null(req->op.search.base)?"<rootDSE>":
- ldb_dn_get_linearized(req->op.search.base));
- ldb_debug_add(ldb, " scope: %s\n",
- req->op.search.scope==LDB_SCOPE_BASE?"base":
- req->op.search.scope==LDB_SCOPE_ONELEVEL?"one":
- req->op.search.scope==LDB_SCOPE_SUBTREE?"sub":"UNKNOWN");
- ldb_debug_add(ldb, " expr: %s\n",
- ldb_filter_from_tree(tmp_ctx, req->op.search.tree));
- if (req->op.search.attrs == NULL) {
- ldb_debug_add(ldb, " attr: <ALL>\n");
- } else {
- for (i=0; req->op.search.attrs[i]; i++) {
- ldb_debug_add(ldb, " attr: %s\n", req->op.search.attrs[i]);
- }
- }
- break;
- case LDB_DELETE:
- ldb_debug_add(ldb, "ldb_trace_request: DELETE\n");
- ldb_debug_add(ldb, " dn: %s\n",
- ldb_dn_get_linearized(req->op.del.dn));
- break;
- case LDB_RENAME:
- ldb_debug_add(ldb, "ldb_trace_request: RENAME\n");
- ldb_debug_add(ldb, " olddn: %s\n",
- ldb_dn_get_linearized(req->op.rename.olddn));
- ldb_debug_add(ldb, " newdn: %s\n",
- ldb_dn_get_linearized(req->op.rename.newdn));
- break;
- case LDB_EXTENDED:
- ldb_debug_add(ldb, "ldb_trace_request: EXTENDED\n");
- ldb_debug_add(ldb, " oid: %s\n", req->op.extended.oid);
- ldb_debug_add(ldb, " data: %s\n", req->op.extended.data?"yes":"no");
- break;
- case LDB_ADD:
- ldb_debug_add(ldb, "ldb_trace_request: ADD\n");
- ldb_debug_add(req->handle->ldb, "%s\n",
- ldb_ldif_message_string(req->handle->ldb, tmp_ctx,
- LDB_CHANGETYPE_ADD,
- req->op.add.message));
- break;
- case LDB_MODIFY:
- ldb_debug_add(ldb, "ldb_trace_request: MODIFY\n");
- ldb_debug_add(req->handle->ldb, "%s\n",
- ldb_ldif_message_string(req->handle->ldb, tmp_ctx,
- LDB_CHANGETYPE_ADD,
- req->op.mod.message));
- break;
- case LDB_REQ_REGISTER_CONTROL:
- ldb_debug_add(ldb, "ldb_trace_request: REGISTER_CONTROL\n");
- ldb_debug_add(req->handle->ldb, "%s\n",
- req->op.reg_control.oid);
- break;
- case LDB_REQ_REGISTER_PARTITION:
- ldb_debug_add(ldb, "ldb_trace_request: REGISTER_PARTITION\n");
- ldb_debug_add(req->handle->ldb, "%s\n",
- ldb_dn_get_linearized(req->op.reg_partition.dn));
- break;
- default:
- ldb_debug_add(ldb, "ldb_trace_request: UNKNOWN(%u)\n",
- req->operation);
- break;
- }
-
- if (req->controls == NULL) {
- ldb_debug_add(ldb, " control: <NONE>\n");
- } else {
- for (i=0; req->controls && req->controls[i]; i++) {
- if (req->controls[i]->oid) {
- ldb_debug_add(ldb, " control: %s crit:%u data:%s\n",
- req->controls[i]->oid,
- req->controls[i]->critical,
- req->controls[i]->data?"yes":"no");
- }
- }
- }
-
- ldb_debug_end(ldb, LDB_DEBUG_TRACE);
-
- talloc_free(tmp_ctx);
-}
-
-/*
- check that the element flags don't have any internal bits set
- */
-static int ldb_msg_check_element_flags(struct ldb_context *ldb,
- const struct ldb_message *message)
-{
- unsigned i;
- for (i=0; i<message->num_elements; i++) {
- if (message->elements[i].flags & LDB_FLAG_INTERNAL_MASK) {
- ldb_asprintf_errstring(ldb, "Invalid element flags 0x%08x on element %s in %s\n",
- message->elements[i].flags, message->elements[i].name,
- ldb_dn_get_linearized(message->dn));
- return LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION;
- }
- }
- return LDB_SUCCESS;
-}
-
-
-/*
- start an ldb request
- NOTE: the request must be a talloc context.
- returns LDB_ERR_* on errors.
-*/
-int ldb_request(struct ldb_context *ldb, struct ldb_request *req)
-{
- struct ldb_module *module;
- int ret;
-
- if (req->callback == NULL) {
- ldb_set_errstring(ldb, "Requests MUST define callbacks");
- return LDB_ERR_UNWILLING_TO_PERFORM;
- }
-
- ldb_reset_err_string(ldb);
-
- if (ldb->flags & LDB_FLG_ENABLE_TRACING) {
- ldb_trace_request(ldb, req);
- }
-
- /* call the first module in the chain */
- switch (req->operation) {
- case LDB_SEARCH:
- /* due to "ldb_build_search_req" base DN always != NULL */
- if (!ldb_dn_validate(req->op.search.base)) {
- ldb_asprintf_errstring(ldb, "ldb_search: invalid basedn '%s'",
- ldb_dn_get_linearized(req->op.search.base));
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
- FIRST_OP(ldb, search);
- ret = module->ops->search(module, req);
- break;
- case LDB_ADD:
- if (!ldb_dn_validate(req->op.add.message->dn)) {
- ldb_asprintf_errstring(ldb, "ldb_add: invalid dn '%s'",
- ldb_dn_get_linearized(req->op.add.message->dn));
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
- /*
- * we have to normalize here, as so many places
- * in modules and backends assume we don't have two
- * elements with the same name
- */
- ret = ldb_msg_normalize(ldb, req, req->op.add.message,
- discard_const(&req->op.add.message));
- if (ret != LDB_SUCCESS) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- FIRST_OP(ldb, add);
- ret = ldb_msg_check_element_flags(ldb, req->op.add.message);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- ret = module->ops->add(module, req);
- break;
- case LDB_MODIFY:
- if (!ldb_dn_validate(req->op.mod.message->dn)) {
- ldb_asprintf_errstring(ldb, "ldb_modify: invalid dn '%s'",
- ldb_dn_get_linearized(req->op.mod.message->dn));
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
- FIRST_OP(ldb, modify);
- ret = ldb_msg_check_element_flags(ldb, req->op.mod.message);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- ret = module->ops->modify(module, req);
- break;
- case LDB_DELETE:
- if (!ldb_dn_validate(req->op.del.dn)) {
- ldb_asprintf_errstring(ldb, "ldb_delete: invalid dn '%s'",
- ldb_dn_get_linearized(req->op.del.dn));
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
- FIRST_OP(ldb, del);
- ret = module->ops->del(module, req);
- break;
- case LDB_RENAME:
- if (!ldb_dn_validate(req->op.rename.olddn)) {
- ldb_asprintf_errstring(ldb, "ldb_rename: invalid olddn '%s'",
- ldb_dn_get_linearized(req->op.rename.olddn));
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
- if (!ldb_dn_validate(req->op.rename.newdn)) {
- ldb_asprintf_errstring(ldb, "ldb_rename: invalid newdn '%s'",
- ldb_dn_get_linearized(req->op.rename.newdn));
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
- FIRST_OP(ldb, rename);
- ret = module->ops->rename(module, req);
- break;
- case LDB_EXTENDED:
- FIRST_OP(ldb, extended);
- ret = module->ops->extended(module, req);
- break;
- default:
- FIRST_OP(ldb, request);
- ret = module->ops->request(module, req);
- break;
- }
-
- return ret;
-}
-
-int ldb_request_done(struct ldb_request *req, int status)
-{
- req->handle->state = LDB_ASYNC_DONE;
- req->handle->status = status;
- return status;
-}
-
-/*
- search the database given a LDAP-like search expression
-
- returns an LDB error code
-
- Use talloc_free to free the ldb_message returned in 'res', if successful
-
-*/
-int ldb_search_default_callback(struct ldb_request *req,
- struct ldb_reply *ares)
-{
- struct ldb_result *res;
- unsigned int n;
-
- res = talloc_get_type(req->context, struct ldb_result);
-
- if (!ares) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_request_done(req, ares->error);
- }
-
- switch (ares->type) {
- case LDB_REPLY_ENTRY:
- res->msgs = talloc_realloc(res, res->msgs,
- struct ldb_message *, res->count + 2);
- if (! res->msgs) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
-
- res->msgs[res->count + 1] = NULL;
-
- res->msgs[res->count] = talloc_move(res->msgs, &ares->message);
- res->count++;
- break;
-
- case LDB_REPLY_REFERRAL:
- if (res->refs) {
- for (n = 0; res->refs[n]; n++) /*noop*/ ;
- } else {
- n = 0;
- }
-
- res->refs = talloc_realloc(res, res->refs, char *, n + 2);
- if (! res->refs) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
-
- res->refs[n] = talloc_move(res->refs, &ares->referral);
- res->refs[n + 1] = NULL;
- break;
-
- case LDB_REPLY_DONE:
- /* TODO: we should really support controls on entries
- * and referrals too! */
- res->controls = talloc_move(res, &ares->controls);
-
- /* this is the last message, and means the request is done */
- /* we have to signal and eventual ldb_wait() waiting that the
- * async request operation was completed */
- talloc_free(ares);
- return ldb_request_done(req, LDB_SUCCESS);
- }
-
- talloc_free(ares);
-
- return LDB_SUCCESS;
-}
-
-int ldb_modify_default_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct ldb_result *res;
- unsigned int n;
- int ret;
-
- res = talloc_get_type(req->context, struct ldb_result);
-
- if (!ares) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
-
- if (ares->error != LDB_SUCCESS) {
- ret = ares->error;
- talloc_free(ares);
- return ldb_request_done(req, ret);
- }
-
- switch (ares->type) {
- case LDB_REPLY_REFERRAL:
- if (res->refs) {
- for (n = 0; res->refs[n]; n++) /*noop*/ ;
- } else {
- n = 0;
- }
-
- res->refs = talloc_realloc(res, res->refs, char *, n + 2);
- if (! res->refs) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
-
- res->refs[n] = talloc_move(res->refs, &ares->referral);
- res->refs[n + 1] = NULL;
- break;
-
- case LDB_REPLY_DONE:
- talloc_free(ares);
- return ldb_request_done(req, LDB_SUCCESS);
- default:
- talloc_free(ares);
- ldb_set_errstring(req->handle->ldb, "Invalid reply type!");
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
-
- talloc_free(ares);
- return ldb_request_done(req, LDB_SUCCESS);
-}
-
-int ldb_op_default_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- int ret;
-
- if (!ares) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
-
- if (ares->error != LDB_SUCCESS) {
- ret = ares->error;
- talloc_free(ares);
- return ldb_request_done(req, ret);
- }
-
- if (ares->type != LDB_REPLY_DONE) {
- talloc_free(ares);
- ldb_set_errstring(req->handle->ldb, "Invalid reply type!");
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
-
- talloc_free(ares);
- return ldb_request_done(req, LDB_SUCCESS);
-}
-
-int ldb_build_search_req_ex(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn *base,
- enum ldb_scope scope,
- struct ldb_parse_tree *tree,
- const char * const *attrs,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent)
-{
- struct ldb_request *req;
-
- *ret_req = NULL;
-
- req = talloc(mem_ctx, struct ldb_request);
- if (req == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- req->operation = LDB_SEARCH;
- if (base == NULL) {
- req->op.search.base = ldb_dn_new(req, ldb, NULL);
- } else {
- req->op.search.base = base;
- }
- req->op.search.scope = scope;
-
- req->op.search.tree = tree;
- if (req->op.search.tree == NULL) {
- ldb_set_errstring(ldb, "'tree' can't be NULL");
- talloc_free(req);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- req->op.search.attrs = attrs;
- req->controls = controls;
- req->context = context;
- req->callback = callback;
-
- ldb_set_timeout_from_prev_req(ldb, parent, req);
-
- req->handle = ldb_handle_new(req, ldb);
- if (req->handle == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (parent) {
- req->handle->nesting++;
- req->handle->parent = parent;
- req->handle->flags = parent->handle->flags;
- req->handle->custom_flags = parent->handle->custom_flags;
- }
-
- *ret_req = req;
- return LDB_SUCCESS;
-}
-
-int ldb_build_search_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn *base,
- enum ldb_scope scope,
- const char *expression,
- const char * const *attrs,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent)
-{
- struct ldb_parse_tree *tree;
- int ret;
-
- tree = ldb_parse_tree(mem_ctx, expression);
- if (tree == NULL) {
- ldb_set_errstring(ldb, "Unable to parse search expression");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_build_search_req_ex(ret_req, ldb, mem_ctx, base,
- scope, tree, attrs, controls,
- context, callback, parent);
- if (ret == LDB_SUCCESS) {
- talloc_steal(*ret_req, tree);
- }
- return ret;
-}
-
-int ldb_build_add_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const struct ldb_message *message,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent)
-{
- struct ldb_request *req;
-
- *ret_req = NULL;
-
- req = talloc(mem_ctx, struct ldb_request);
- if (req == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- req->operation = LDB_ADD;
- req->op.add.message = message;
- req->controls = controls;
- req->context = context;
- req->callback = callback;
-
- ldb_set_timeout_from_prev_req(ldb, parent, req);
-
- req->handle = ldb_handle_new(req, ldb);
- if (req->handle == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (parent) {
- req->handle->nesting++;
- req->handle->parent = parent;
- req->handle->flags = parent->handle->flags;
- req->handle->custom_flags = parent->handle->custom_flags;
- }
-
- *ret_req = req;
-
- return LDB_SUCCESS;
-}
-
-int ldb_build_mod_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const struct ldb_message *message,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent)
-{
- struct ldb_request *req;
-
- *ret_req = NULL;
-
- req = talloc(mem_ctx, struct ldb_request);
- if (req == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- req->operation = LDB_MODIFY;
- req->op.mod.message = message;
- req->controls = controls;
- req->context = context;
- req->callback = callback;
-
- ldb_set_timeout_from_prev_req(ldb, parent, req);
-
- req->handle = ldb_handle_new(req, ldb);
- if (req->handle == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (parent) {
- req->handle->nesting++;
- req->handle->parent = parent;
- req->handle->flags = parent->handle->flags;
- req->handle->custom_flags = parent->handle->custom_flags;
- }
-
- *ret_req = req;
-
- return LDB_SUCCESS;
-}
-
-int ldb_build_del_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn *dn,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent)
-{
- struct ldb_request *req;
-
- *ret_req = NULL;
-
- req = talloc(mem_ctx, struct ldb_request);
- if (req == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- req->operation = LDB_DELETE;
- req->op.del.dn = dn;
- req->controls = controls;
- req->context = context;
- req->callback = callback;
-
- ldb_set_timeout_from_prev_req(ldb, parent, req);
-
- req->handle = ldb_handle_new(req, ldb);
- if (req->handle == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (parent) {
- req->handle->nesting++;
- req->handle->parent = parent;
- req->handle->flags = parent->handle->flags;
- req->handle->custom_flags = parent->handle->custom_flags;
- }
-
- *ret_req = req;
-
- return LDB_SUCCESS;
-}
-
-int ldb_build_rename_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn *olddn,
- struct ldb_dn *newdn,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent)
-{
- struct ldb_request *req;
-
- *ret_req = NULL;
-
- req = talloc(mem_ctx, struct ldb_request);
- if (req == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- req->operation = LDB_RENAME;
- req->op.rename.olddn = olddn;
- req->op.rename.newdn = newdn;
- req->controls = controls;
- req->context = context;
- req->callback = callback;
-
- ldb_set_timeout_from_prev_req(ldb, parent, req);
-
- req->handle = ldb_handle_new(req, ldb);
- if (req->handle == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (parent) {
- req->handle->nesting++;
- req->handle->parent = parent;
- req->handle->flags = parent->handle->flags;
- req->handle->custom_flags = parent->handle->custom_flags;
- }
-
- *ret_req = req;
-
- return LDB_SUCCESS;
-}
-
-int ldb_extended_default_callback(struct ldb_request *req,
- struct ldb_reply *ares)
-{
- struct ldb_result *res;
-
- res = talloc_get_type(req->context, struct ldb_result);
-
- if (!ares) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_request_done(req, ares->error);
- }
-
- if (ares->type == LDB_REPLY_DONE) {
-
- /* TODO: we should really support controls on entries and referrals too! */
- res->extended = talloc_move(res, &ares->response);
- res->controls = talloc_move(res, &ares->controls);
-
- talloc_free(ares);
- return ldb_request_done(req, LDB_SUCCESS);
- }
-
- talloc_free(ares);
- ldb_set_errstring(req->handle->ldb, "Invalid reply type!");
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
-}
-
-int ldb_build_extended_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const char *oid,
- void *data,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent)
-{
- struct ldb_request *req;
-
- *ret_req = NULL;
-
- req = talloc(mem_ctx, struct ldb_request);
- if (req == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- req->operation = LDB_EXTENDED;
- req->op.extended.oid = oid;
- req->op.extended.data = data;
- req->controls = controls;
- req->context = context;
- req->callback = callback;
-
- ldb_set_timeout_from_prev_req(ldb, parent, req);
-
- req->handle = ldb_handle_new(req, ldb);
- if (req->handle == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (parent) {
- req->handle->nesting++;
- req->handle->parent = parent;
- req->handle->flags = parent->handle->flags;
- req->handle->custom_flags = parent->handle->custom_flags;
- }
-
- *ret_req = req;
-
- return LDB_SUCCESS;
-}
-
-int ldb_extended(struct ldb_context *ldb,
- const char *oid,
- void *data,
- struct ldb_result **_res)
-{
- struct ldb_request *req;
- int ret;
- struct ldb_result *res;
-
- *_res = NULL;
-
- res = talloc_zero(ldb, struct ldb_result);
- if (!res) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_build_extended_req(&req, ldb, ldb,
- oid, data, NULL,
- res, ldb_extended_default_callback,
- NULL);
- if (ret != LDB_SUCCESS) goto done;
-
- ldb_set_timeout(ldb, req, 0); /* use default timeout */
-
- ret = ldb_request(ldb, req);
-
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
- talloc_free(req);
-
-done:
- if (ret != LDB_SUCCESS) {
- talloc_free(res);
- }
-
- *_res = res;
- return ret;
-}
-
-/*
- note that ldb_search() will automatically replace a NULL 'base' value
- with the defaultNamingContext from the rootDSE if available.
-*/
-int ldb_search(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
- struct ldb_result **result, struct ldb_dn *base,
- enum ldb_scope scope, const char * const *attrs,
- const char *exp_fmt, ...)
-{
- struct ldb_request *req;
- struct ldb_result *res;
- char *expression;
- va_list ap;
- int ret;
-
- expression = NULL;
- *result = NULL;
- req = NULL;
-
- res = talloc_zero(mem_ctx, struct ldb_result);
- if (!res) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (exp_fmt) {
- va_start(ap, exp_fmt);
- expression = talloc_vasprintf(mem_ctx, exp_fmt, ap);
- va_end(ap);
-
- if (!expression) {
- talloc_free(res);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- ret = ldb_build_search_req(&req, ldb, mem_ctx,
- base?base:ldb_get_default_basedn(ldb),
- scope,
- expression,
- attrs,
- NULL,
- res,
- ldb_search_default_callback,
- NULL);
- ldb_req_set_location(req, "ldb_search");
-
- if (ret != LDB_SUCCESS) goto done;
-
- ret = ldb_request(ldb, req);
-
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
-done:
- if (ret != LDB_SUCCESS) {
- talloc_free(res);
- res = NULL;
- }
-
- talloc_free(expression);
- talloc_free(req);
-
- *result = res;
- return ret;
-}
-
-/*
- add a record to the database. Will fail if a record with the given class
- and key already exists
-*/
-int ldb_add(struct ldb_context *ldb,
- const struct ldb_message *message)
-{
- struct ldb_request *req;
- int ret;
-
- ret = ldb_msg_sanity_check(ldb, message);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ldb_build_add_req(&req, ldb, ldb,
- message,
- NULL,
- NULL,
- ldb_op_default_callback,
- NULL);
- ldb_req_set_location(req, "ldb_add");
-
- if (ret != LDB_SUCCESS) return ret;
-
- /* do request and autostart a transaction */
- ret = ldb_autotransaction_request(ldb, req);
-
- talloc_free(req);
- return ret;
-}
-
-/*
- modify the specified attributes of a record
-*/
-int ldb_modify(struct ldb_context *ldb,
- const struct ldb_message *message)
-{
- struct ldb_request *req;
- int ret;
-
- ret = ldb_msg_sanity_check(ldb, message);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ldb_build_mod_req(&req, ldb, ldb,
- message,
- NULL,
- NULL,
- ldb_op_default_callback,
- NULL);
- ldb_req_set_location(req, "ldb_modify");
-
- if (ret != LDB_SUCCESS) return ret;
-
- /* do request and autostart a transaction */
- ret = ldb_autotransaction_request(ldb, req);
-
- talloc_free(req);
- return ret;
-}
-
-
-/*
- delete a record from the database
-*/
-int ldb_delete(struct ldb_context *ldb, struct ldb_dn *dn)
-{
- struct ldb_request *req;
- int ret;
-
- ret = ldb_build_del_req(&req, ldb, ldb,
- dn,
- NULL,
- NULL,
- ldb_op_default_callback,
- NULL);
- ldb_req_set_location(req, "ldb_delete");
-
- if (ret != LDB_SUCCESS) return ret;
-
- /* do request and autostart a transaction */
- ret = ldb_autotransaction_request(ldb, req);
-
- talloc_free(req);
- return ret;
-}
-
-/*
- rename a record in the database
-*/
-int ldb_rename(struct ldb_context *ldb,
- struct ldb_dn *olddn, struct ldb_dn *newdn)
-{
- struct ldb_request *req;
- int ret;
-
- ret = ldb_build_rename_req(&req, ldb, ldb,
- olddn,
- newdn,
- NULL,
- NULL,
- ldb_op_default_callback,
- NULL);
- ldb_req_set_location(req, "ldb_rename");
-
- if (ret != LDB_SUCCESS) return ret;
-
- /* do request and autostart a transaction */
- ret = ldb_autotransaction_request(ldb, req);
-
- talloc_free(req);
- return ret;
-}
-
-
-/*
- return the global sequence number
-*/
-int ldb_sequence_number(struct ldb_context *ldb,
- enum ldb_sequence_type type, uint64_t *seq_num)
-{
- struct ldb_seqnum_request *seq;
- struct ldb_seqnum_result *seqr;
- struct ldb_result *res;
- TALLOC_CTX *tmp_ctx;
- int ret;
-
- *seq_num = 0;
-
- tmp_ctx = talloc_zero(ldb, struct ldb_request);
- if (tmp_ctx == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
- seq = talloc_zero(tmp_ctx, struct ldb_seqnum_request);
- if (seq == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- ret = LDB_ERR_OPERATIONS_ERROR;
- goto done;
- }
- seq->type = type;
-
- ret = ldb_extended(ldb, LDB_EXTENDED_SEQUENCE_NUMBER, seq, &res);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
- talloc_steal(tmp_ctx, res);
-
- if (strcmp(LDB_EXTENDED_SEQUENCE_NUMBER, res->extended->oid) != 0) {
- ldb_set_errstring(ldb, "Invalid OID in reply");
- ret = LDB_ERR_OPERATIONS_ERROR;
- goto done;
- }
- seqr = talloc_get_type(res->extended->data,
- struct ldb_seqnum_result);
- *seq_num = seqr->seq_num;
-
-done:
- talloc_free(tmp_ctx);
- return ret;
-}
-
-/*
- return extended error information
-*/
-const char *ldb_errstring(struct ldb_context *ldb)
-{
- if (ldb->err_string) {
- return ldb->err_string;
- }
-
- return NULL;
-}
-
-/*
- return a string explaining what a ldb error constant meancs
-*/
-const char *ldb_strerror(int ldb_err)
-{
- switch (ldb_err) {
- case LDB_SUCCESS:
- return "Success";
- case LDB_ERR_OPERATIONS_ERROR:
- return "Operations error";
- case LDB_ERR_PROTOCOL_ERROR:
- return "Protocol error";
- case LDB_ERR_TIME_LIMIT_EXCEEDED:
- return "Time limit exceeded";
- case LDB_ERR_SIZE_LIMIT_EXCEEDED:
- return "Size limit exceeded";
- case LDB_ERR_COMPARE_FALSE:
- return "Compare false";
- case LDB_ERR_COMPARE_TRUE:
- return "Compare true";
- case LDB_ERR_AUTH_METHOD_NOT_SUPPORTED:
- return "Auth method not supported";
- case LDB_ERR_STRONG_AUTH_REQUIRED:
- return "Strong auth required";
-/* 9 RESERVED */
- case LDB_ERR_REFERRAL:
- return "Referral error";
- case LDB_ERR_ADMIN_LIMIT_EXCEEDED:
- return "Admin limit exceeded";
- case LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION:
- return "Unsupported critical extension";
- case LDB_ERR_CONFIDENTIALITY_REQUIRED:
- return "Confidentiality required";
- case LDB_ERR_SASL_BIND_IN_PROGRESS:
- return "SASL bind in progress";
- case LDB_ERR_NO_SUCH_ATTRIBUTE:
- return "No such attribute";
- case LDB_ERR_UNDEFINED_ATTRIBUTE_TYPE:
- return "Undefined attribute type";
- case LDB_ERR_INAPPROPRIATE_MATCHING:
- return "Inappropriate matching";
- case LDB_ERR_CONSTRAINT_VIOLATION:
- return "Constraint violation";
- case LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS:
- return "Attribute or value exists";
- case LDB_ERR_INVALID_ATTRIBUTE_SYNTAX:
- return "Invalid attribute syntax";
-/* 22-31 unused */
- case LDB_ERR_NO_SUCH_OBJECT:
- return "No such object";
- case LDB_ERR_ALIAS_PROBLEM:
- return "Alias problem";
- case LDB_ERR_INVALID_DN_SYNTAX:
- return "Invalid DN syntax";
-/* 35 RESERVED */
- case LDB_ERR_ALIAS_DEREFERENCING_PROBLEM:
- return "Alias dereferencing problem";
-/* 37-47 unused */
- case LDB_ERR_INAPPROPRIATE_AUTHENTICATION:
- return "Inappropriate authentication";
- case LDB_ERR_INVALID_CREDENTIALS:
- return "Invalid credentials";
- case LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS:
- return "insufficient access rights";
- case LDB_ERR_BUSY:
- return "Busy";
- case LDB_ERR_UNAVAILABLE:
- return "Unavailable";
- case LDB_ERR_UNWILLING_TO_PERFORM:
- return "Unwilling to perform";
- case LDB_ERR_LOOP_DETECT:
- return "Loop detect";
-/* 55-63 unused */
- case LDB_ERR_NAMING_VIOLATION:
- return "Naming violation";
- case LDB_ERR_OBJECT_CLASS_VIOLATION:
- return "Object class violation";
- case LDB_ERR_NOT_ALLOWED_ON_NON_LEAF:
- return "Not allowed on non-leaf";
- case LDB_ERR_NOT_ALLOWED_ON_RDN:
- return "Not allowed on RDN";
- case LDB_ERR_ENTRY_ALREADY_EXISTS:
- return "Entry already exists";
- case LDB_ERR_OBJECT_CLASS_MODS_PROHIBITED:
- return "Object class mods prohibited";
-/* 70 RESERVED FOR CLDAP */
- case LDB_ERR_AFFECTS_MULTIPLE_DSAS:
- return "Affects multiple DSAs";
-/* 72-79 unused */
- case LDB_ERR_OTHER:
- return "Other";
- }
-
- return "Unknown error";
-}
-
-/*
- set backend specific opaque parameters
-*/
-int ldb_set_opaque(struct ldb_context *ldb, const char *name, void *value)
-{
- struct ldb_opaque *o;
-
- /* allow updating an existing value */
- for (o=ldb->opaque;o;o=o->next) {
- if (strcmp(o->name, name) == 0) {
- o->value = value;
- return LDB_SUCCESS;
- }
- }
-
- o = talloc(ldb, struct ldb_opaque);
- if (o == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OTHER;
- }
- o->next = ldb->opaque;
- o->name = name;
- o->value = value;
- ldb->opaque = o;
- return LDB_SUCCESS;
-}
-
-/*
- get a previously set opaque value
-*/
-void *ldb_get_opaque(struct ldb_context *ldb, const char *name)
-{
- struct ldb_opaque *o;
- for (o=ldb->opaque;o;o=o->next) {
- if (strcmp(o->name, name) == 0) {
- return o->value;
- }
- }
- return NULL;
-}
-
-int ldb_global_init(void)
-{
- /* Provided for compatibility with some older versions of ldb */
- return 0;
-}
-
-/* return the ldb flags */
-unsigned int ldb_get_flags(struct ldb_context *ldb)
-{
- return ldb->flags;
-}
-
-/* set the ldb flags */
-void ldb_set_flags(struct ldb_context *ldb, unsigned flags)
-{
- ldb->flags = flags;
-}
-
-
-/*
- set the location in a ldb request. Used for debugging
- */
-void ldb_req_set_location(struct ldb_request *req, const char *location)
-{
- if (req && req->handle) {
- req->handle->location = location;
- }
-}
-
-/*
- return the location set with dsdb_req_set_location
- */
-const char *ldb_req_location(struct ldb_request *req)
-{
- return req->handle->location;
-}
-
-/**
- mark a request as untrusted. This tells the rootdse module to remove
- unregistered controls
- */
-void ldb_req_mark_untrusted(struct ldb_request *req)
-{
- req->handle->flags |= LDB_HANDLE_FLAG_UNTRUSTED;
-}
-
-/**
- mark a request as trusted.
- */
-void ldb_req_mark_trusted(struct ldb_request *req)
-{
- req->handle->flags &= ~LDB_HANDLE_FLAG_UNTRUSTED;
-}
-
-/**
- set custom flags. Those flags are set by applications using ldb,
- they are application dependent and the same bit can have different
- meaning in different application.
- */
-void ldb_req_set_custom_flags(struct ldb_request *req, uint32_t flags)
-{
- if (req != NULL && req->handle != NULL) {
- req->handle->custom_flags = flags;
- }
-}
-
-
-/**
- get custom flags. Those flags are set by applications using ldb,
- they are application dependent and the same bit can have different
- meaning in different application.
- */
-uint32_t ldb_req_get_custom_flags(struct ldb_request *req)
-{
- if (req != NULL && req->handle != NULL) {
- return req->handle->custom_flags;
- }
-
- /*
- * 0 is not something any better or worse than
- * anything else as req or the handle is NULL
- */
- return 0;
-}
-
-
-/**
- return true is a request is untrusted
- */
-bool ldb_req_is_untrusted(struct ldb_request *req)
-{
- return (req->handle->flags & LDB_HANDLE_FLAG_UNTRUSTED) != 0;
-}
diff --git a/source4/lib/ldb/common/ldb_attributes.c b/source4/lib/ldb/common/ldb_attributes.c
deleted file mode 100644
index 21a3e6eb93..0000000000
--- a/source4/lib/ldb/common/ldb_attributes.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-/*
- register handlers for specific attributes and objectclass relationships
-
- this allows a backend to store its schema information in any format
- it likes (or to not have any schema information at all) while keeping the
- message matching logic generic
-*/
-
-#include "ldb_private.h"
-#include "ldb_handlers.h"
-
-/*
- add a attribute to the ldb_schema
-
- if flags contains LDB_ATTR_FLAG_ALLOCATED
- the attribute name string will be copied using
- talloc_strdup(), otherwise it needs to be a static const
- string at least with a lifetime longer than the ldb struct!
-
- the ldb_schema_syntax structure should be a pointer
- to a static const struct or at least it needs to be
- a struct with a longer lifetime than the ldb context!
-
-*/
-int ldb_schema_attribute_add_with_syntax(struct ldb_context *ldb,
- const char *attribute,
- unsigned flags,
- const struct ldb_schema_syntax *syntax)
-{
- unsigned int i, n;
- struct ldb_schema_attribute *a;
-
- if (!syntax) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- n = ldb->schema.num_attributes + 1;
-
- a = talloc_realloc(ldb, ldb->schema.attributes,
- struct ldb_schema_attribute, n);
- if (a == NULL) {
- ldb_oom(ldb);
- return -1;
- }
- ldb->schema.attributes = a;
-
- for (i = 0; i < ldb->schema.num_attributes; i++) {
- int cmp = ldb_attr_cmp(attribute, a[i].name);
- if (cmp == 0) {
- /* silently ignore attempts to overwrite fixed attributes */
- if (a[i].flags & LDB_ATTR_FLAG_FIXED) {
- return 0;
- }
- if (a[i].flags & LDB_ATTR_FLAG_ALLOCATED) {
- talloc_free(discard_const_p(char, a[i].name));
- }
- /* To cancel out increment below */
- ldb->schema.num_attributes--;
- break;
- } else if (cmp < 0) {
- memmove(a+i+1, a+i, sizeof(*a) * (ldb->schema.num_attributes-i));
- break;
- }
- }
- ldb->schema.num_attributes++;
-
- a[i].name = attribute;
- a[i].flags = flags;
- a[i].syntax = syntax;
-
- if (a[i].flags & LDB_ATTR_FLAG_ALLOCATED) {
- a[i].name = talloc_strdup(a, a[i].name);
- if (a[i].name == NULL) {
- ldb_oom(ldb);
- return -1;
- }
- }
-
- return 0;
-}
-
-static const struct ldb_schema_syntax ldb_syntax_default = {
- .name = LDB_SYNTAX_OCTET_STRING,
- .ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
- .canonicalise_fn = ldb_handler_copy,
- .comparison_fn = ldb_comparison_binary
-};
-
-static const struct ldb_schema_attribute ldb_attribute_default = {
- .name = NULL,
- .flags = 0,
- .syntax = &ldb_syntax_default
-};
-
-/*
- return the attribute handlers for a given attribute
-*/
-static const struct ldb_schema_attribute *ldb_schema_attribute_by_name_internal(
- struct ldb_context *ldb,
- const char *name)
-{
- /* for binary search we need signed variables */
- unsigned int i, e, b = 0;
- int r;
- const struct ldb_schema_attribute *def = &ldb_attribute_default;
-
- /* as handlers are sorted, '*' must be the first if present */
- if (strcmp(ldb->schema.attributes[0].name, "*") == 0) {
- def = &ldb->schema.attributes[0];
- b = 1;
- }
-
- /* do a binary search on the array */
- e = ldb->schema.num_attributes - 1;
-
- while ((b <= e) && (e != (unsigned int) -1)) {
- i = (b + e) / 2;
-
- r = ldb_attr_cmp(name, ldb->schema.attributes[i].name);
- if (r == 0) {
- return &ldb->schema.attributes[i];
- }
- if (r < 0) {
- e = i - 1;
- } else {
- b = i + 1;
- }
- }
-
- return def;
-}
-
-/*
- return the attribute handlers for a given attribute
-*/
-const struct ldb_schema_attribute *ldb_schema_attribute_by_name(struct ldb_context *ldb,
- const char *name)
-{
- if (ldb->schema.attribute_handler_override) {
- const struct ldb_schema_attribute *ret =
- ldb->schema.attribute_handler_override(ldb,
- ldb->schema.attribute_handler_override_private,
- name);
- if (ret) {
- return ret;
- }
- }
-
- return ldb_schema_attribute_by_name_internal(ldb, name);
-}
-
-
-/*
- add to the list of ldif handlers for this ldb context
-*/
-void ldb_schema_attribute_remove(struct ldb_context *ldb, const char *name)
-{
- const struct ldb_schema_attribute *a;
- ptrdiff_t i;
-
- a = ldb_schema_attribute_by_name_internal(ldb, name);
- if (a == NULL || a->name == NULL) {
- return;
- }
-
- /* FIXED attributes are never removed */
- if (a->flags & LDB_ATTR_FLAG_FIXED) {
- return;
- }
-
- if (a->flags & LDB_ATTR_FLAG_ALLOCATED) {
- talloc_free(discard_const_p(char, a->name));
- }
-
- i = a - ldb->schema.attributes;
- if (i < ldb->schema.num_attributes - 1) {
- memmove(&ldb->schema.attributes[i],
- a+1, sizeof(*a) * (ldb->schema.num_attributes-(i+1)));
- }
-
- ldb->schema.num_attributes--;
-}
-
-/*
- setup a attribute handler using a standard syntax
-*/
-int ldb_schema_attribute_add(struct ldb_context *ldb,
- const char *attribute,
- unsigned flags,
- const char *syntax)
-{
- const struct ldb_schema_syntax *s = ldb_standard_syntax_by_name(ldb, syntax);
- return ldb_schema_attribute_add_with_syntax(ldb, attribute, flags, s);
-}
-
-/*
- setup the attribute handles for well known attributes
-*/
-int ldb_setup_wellknown_attributes(struct ldb_context *ldb)
-{
- const struct {
- const char *attr;
- const char *syntax;
- } wellknown[] = {
- { "dn", LDB_SYNTAX_DN },
- { "distinguishedName", LDB_SYNTAX_DN },
- { "cn", LDB_SYNTAX_DIRECTORY_STRING },
- { "dc", LDB_SYNTAX_DIRECTORY_STRING },
- { "ou", LDB_SYNTAX_DIRECTORY_STRING },
- { "objectClass", LDB_SYNTAX_OBJECTCLASS }
- };
- unsigned int i;
- int ret;
-
- for (i=0;i<ARRAY_SIZE(wellknown);i++) {
- ret = ldb_schema_attribute_add(ldb, wellknown[i].attr, 0,
- wellknown[i].syntax);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-
-/*
- add a extended dn syntax to the ldb_schema
-*/
-int ldb_dn_extended_add_syntax(struct ldb_context *ldb,
- unsigned flags,
- const struct ldb_dn_extended_syntax *syntax)
-{
- unsigned int n;
- struct ldb_dn_extended_syntax *a;
-
- if (!syntax) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- n = ldb->schema.num_dn_extended_syntax + 1;
-
- a = talloc_realloc(ldb, ldb->schema.dn_extended_syntax,
- struct ldb_dn_extended_syntax, n);
-
- if (!a) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- a[ldb->schema.num_dn_extended_syntax] = *syntax;
- ldb->schema.dn_extended_syntax = a;
-
- ldb->schema.num_dn_extended_syntax = n;
-
- return LDB_SUCCESS;
-}
-
-/*
- return the extended dn syntax for a given name
-*/
-const struct ldb_dn_extended_syntax *ldb_dn_extended_syntax_by_name(struct ldb_context *ldb,
- const char *name)
-{
- unsigned int i;
- for (i=0; i < ldb->schema.num_dn_extended_syntax; i++) {
- if (ldb_attr_cmp(ldb->schema.dn_extended_syntax[i].name, name) == 0) {
- return &ldb->schema.dn_extended_syntax[i];
- }
- }
- return NULL;
-}
-
-/*
- set an attribute handler override function - used to delegate schema handling
- to external code
- */
-void ldb_schema_attribute_set_override_handler(struct ldb_context *ldb,
- ldb_attribute_handler_override_fn_t override,
- void *private_data)
-{
- ldb->schema.attribute_handler_override_private = private_data;
- ldb->schema.attribute_handler_override = override;
-}
diff --git a/source4/lib/ldb/common/ldb_controls.c b/source4/lib/ldb/common/ldb_controls.c
deleted file mode 100644
index b3ef243493..0000000000
--- a/source4/lib/ldb/common/ldb_controls.c
+++ /dev/null
@@ -1,1043 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb_controls.c
- *
- * Component: ldb controls utility functions
- *
- * Description: helper functions for control modules
- *
- * Author: Simo Sorce
- */
-
-#include "ldb_private.h"
-
-/* check if a control with the specified "oid" exist and return it */
-/* returns NULL if not found */
-struct ldb_control *ldb_request_get_control(struct ldb_request *req, const char *oid)
-{
- unsigned int i;
-
- if (req->controls != NULL) {
- for (i = 0; req->controls[i]; i++) {
- if (req->controls[i]->oid && strcmp(oid, req->controls[i]->oid) == 0) {
- break;
- }
- }
-
- return req->controls[i];
- }
-
- return NULL;
-}
-
-/* check if a control with the specified "oid" exist and return it */
-/* returns NULL if not found */
-struct ldb_control *ldb_reply_get_control(struct ldb_reply *rep, const char *oid)
-{
- unsigned int i;
-
- if (rep->controls != NULL) {
- for (i = 0; rep->controls[i]; i++) {
- if (rep->controls[i]->oid && strcmp(oid, rep->controls[i]->oid) == 0) {
- break;
- }
- }
-
- return rep->controls[i];
- }
-
- return NULL;
-}
-
-/*
- * Saves the current controls list into the "saver" (can also be NULL) and
- * replace the one in "req" with a new one excluding the "exclude" control
- * (if it is NULL then the list remains the same)
- *
- * Returns 0 on error.
- */
-int ldb_save_controls(struct ldb_control *exclude, struct ldb_request *req, struct ldb_control ***saver)
-{
- struct ldb_control **lcs, **lcs_old;
- unsigned int i, j;
-
- lcs_old = req->controls;
- if (saver != NULL) {
- *saver = lcs_old;
- }
-
- for (i = 0; req->controls && req->controls[i]; i++);
- if (i == 0) {
- req->controls = NULL;
- return 1;
- }
-
- lcs = talloc_array(req, struct ldb_control *, i + 1);
- if (!lcs) {
- return 0;
- }
-
- for (i = 0, j = 0; lcs_old[i]; i++) {
- if (exclude == lcs_old[i]) continue;
- lcs[j] = lcs_old[i];
- j++;
- }
- lcs[j] = NULL;
-
- req->controls = talloc_realloc(req, lcs, struct ldb_control *, j + 1);
- if (req->controls == NULL) {
- return 0;
- }
- return 1;
-}
-
-/*
- * Returns a list of controls, except the one specified with "exclude" (can
- * also be NULL). Included controls become a child of returned list if they
- * were children of "controls_in".
- *
- * Returns NULL on error (OOM) or an empty control list.
- */
-struct ldb_control **ldb_controls_except_specified(struct ldb_control **controls_in,
- TALLOC_CTX *mem_ctx,
- struct ldb_control *exclude)
-{
- struct ldb_control **lcs = NULL;
- unsigned int i, j, n;
-
- for (i = 0; controls_in && controls_in[i]; i++);
- if (i == 0) {
- return NULL;
- }
- n = i;
-
- for (i = 0, j = 0; controls_in && controls_in[i]; i++) {
- if (exclude == controls_in[i]) continue;
-
- if (!lcs) {
- /* Allocate here so if we remove the only
- * control, or there were no controls, we
- * don't allocate at all, and just return
- * NULL */
- lcs = talloc_array(mem_ctx, struct ldb_control *,
- n + 1);
- if (!lcs) {
- return NULL;
- }
- }
-
- lcs[j] = controls_in[i];
- talloc_reparent(controls_in, lcs, lcs[j]);
- j++;
- }
- if (lcs) {
- lcs[j] = NULL;
-
- lcs = talloc_realloc(mem_ctx, lcs, struct ldb_control *, j + 1);
- }
-
- return lcs;
-}
-
-/* check if there's any control marked as critical in the list */
-/* return True if any, False if none */
-int ldb_check_critical_controls(struct ldb_control **controls)
-{
- unsigned int i;
-
- if (controls == NULL) {
- return 0;
- }
-
- for (i = 0; controls[i]; i++) {
- if (controls[i]->critical) {
- return 1;
- }
- }
-
- return 0;
-}
-
-int ldb_request_add_control(struct ldb_request *req, const char *oid, bool critical, void *data)
-{
- unsigned int i, n;
- struct ldb_control **ctrls;
- struct ldb_control *ctrl;
-
- for (n=0; req->controls && req->controls[n];n++) {
- /* having two controls of the same OID makes no sense */
- if (req->controls[n]->oid && strcmp(oid, req->controls[n]->oid) == 0) {
- return LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS;
- }
- }
-
- ctrls = talloc_array(req,
- struct ldb_control *,
- n + 2);
- if (!ctrls) return LDB_ERR_OPERATIONS_ERROR;
-
- for (i=0; i<n; i++) {
- ctrls[i] = req->controls[i];
- }
-
- req->controls = ctrls;
- ctrls[n] = NULL;
- ctrls[n+1] = NULL;
-
- ctrl = talloc(ctrls, struct ldb_control);
- if (!ctrl) return LDB_ERR_OPERATIONS_ERROR;
-
- ctrl->oid = talloc_strdup(ctrl, oid);
- if (!ctrl->oid) return LDB_ERR_OPERATIONS_ERROR;
- ctrl->critical = critical;
- ctrl->data = data;
-
- ctrls[n] = ctrl;
- return LDB_SUCCESS;
-}
-
-int ldb_reply_add_control(struct ldb_reply *ares, const char *oid, bool critical, void *data)
-{
- unsigned n;
- struct ldb_control **ctrls;
- struct ldb_control *ctrl;
-
- for (n=0; ares->controls && ares->controls[n];) {
- /* having two controls of the same OID makes no sense */
- if (ares->controls[n]->oid && strcmp(oid, ares->controls[n]->oid) == 0) {
- return LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS;
- }
- n++;
- }
-
- ctrls = talloc_realloc(ares, ares->controls,
- struct ldb_control *,
- n + 2);
- if (!ctrls) return LDB_ERR_OPERATIONS_ERROR;
- ares->controls = ctrls;
- ctrls[n] = NULL;
- ctrls[n+1] = NULL;
-
- ctrl = talloc(ctrls, struct ldb_control);
- if (!ctrl) return LDB_ERR_OPERATIONS_ERROR;
-
- ctrl->oid = talloc_strdup(ctrl, oid);
- if (!ctrl->oid) return LDB_ERR_OPERATIONS_ERROR;
- ctrl->critical = critical;
- ctrl->data = data;
-
- ctrls[n] = ctrl;
- return LDB_SUCCESS;
-}
-
-/* Add a control to the request, replacing the old one if it is already in the request */
-int ldb_request_replace_control(struct ldb_request *req, const char *oid, bool critical, void *data)
-{
- unsigned int n;
- int ret;
-
- ret = ldb_request_add_control(req, oid, critical, data);
- if (ret != LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS) {
- return ret;
- }
-
- for (n=0; req->controls[n];n++) {
- if (req->controls[n]->oid && strcmp(oid, req->controls[n]->oid) == 0) {
- req->controls[n]->critical = critical;
- req->controls[n]->data = data;
- return LDB_SUCCESS;
- }
- }
-
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-/*
- * Return a control as string
- * the project (ie. name:value1:value2:...:valuen
- * The string didn't include the criticity of the critical flag
- */
-char *ldb_control_to_string(TALLOC_CTX *mem_ctx, const struct ldb_control *control)
-{
- char *res = NULL;
-
- if (strcmp(control->oid, LDB_CONTROL_PAGED_RESULTS_OID) == 0) {
- struct ldb_paged_control *rep_control = talloc_get_type(control->data, struct ldb_paged_control);
- char *cookie;
-
- cookie = ldb_base64_encode(mem_ctx, rep_control->cookie, rep_control->cookie_len);
- if (cookie == NULL) {
- return NULL;
- }
- if (cookie[0] != '\0') {
- res = talloc_asprintf(mem_ctx, "%s:%d:%s",
- LDB_CONTROL_PAGED_RESULTS_NAME,
- control->critical,
- cookie);
-
- talloc_free(cookie);
- } else {
- res = talloc_asprintf(mem_ctx, "%s:%d",
- LDB_CONTROL_PAGED_RESULTS_NAME,
- control->critical);
- }
- return res;
- }
-
- if (strcmp(control->oid, LDB_CONTROL_VLV_RESP_OID) == 0) {
- struct ldb_vlv_resp_control *rep_control = talloc_get_type(control->data,
- struct ldb_vlv_resp_control);
-
- res = talloc_asprintf(mem_ctx, "%s:%d:%d:%d:%d:%d:%s",
- LDB_CONTROL_VLV_RESP_NAME,
- control->critical,
- rep_control->targetPosition,
- rep_control->contentCount,
- rep_control->vlv_result,
- rep_control->ctxid_len,
- rep_control->contextId);
-
- return res;
- }
-
- if (strcmp(control->oid, LDB_CONTROL_SORT_RESP_OID) == 0) {
- struct ldb_sort_resp_control *rep_control = talloc_get_type(control->data,
- struct ldb_sort_resp_control);
-
- res = talloc_asprintf(mem_ctx, "%s:%d:%d:%s",
- LDB_CONTROL_SORT_RESP_NAME,
- control->critical,
- rep_control->result,
- rep_control->attr_desc);
-
- return res;
- }
-
- if (strcmp(control->oid, LDB_CONTROL_ASQ_OID) == 0) {
- struct ldb_asq_control *rep_control = talloc_get_type(control->data,
- struct ldb_asq_control);
-
- res = talloc_asprintf(mem_ctx, "%s:%d:%d",
- LDB_CONTROL_SORT_RESP_NAME,
- control->critical,
- rep_control->result);
-
- return res;
- }
-
- if (strcmp(control->oid, LDB_CONTROL_DIRSYNC_OID) == 0) {
- char *cookie;
- struct ldb_dirsync_control *rep_control = talloc_get_type(control->data,
- struct ldb_dirsync_control);
-
- cookie = ldb_base64_encode(mem_ctx, rep_control->cookie,
- rep_control->cookie_len);
- if (cookie == NULL) {
- return NULL;
- }
- res = talloc_asprintf(mem_ctx, "%s:%d:%d:%d:%s",
- LDB_CONTROL_DIRSYNC_NAME,
- control->critical,
- rep_control->flags,
- rep_control->max_attributes,
- cookie);
-
- talloc_free(cookie);
- return res;
- }
-
- /*
- * From here we don't know the control
- */
- if (control->data == NULL) {
- /*
- * We don't know the control but there is no real data attached to it
- * so we can represent it with local_oid:oid:criticity
- */
- res = talloc_asprintf(mem_ctx, "local_oid:%s:%d",
- control->oid,
- control->critical);
- return res;
- }
-
- res = talloc_asprintf(mem_ctx, "unknown oid:%s",
- control->oid);
- return res;
-}
-
-
-/*
- * A little trick to allow to use constants defined in headers rather than
- * hardwritten in the file hardwritten in the file
- * sizeof will return the \0 char as well so it will take the place of ":" in the
- * length of the string
- */
-#define LDB_CONTROL_CMP(control, NAME) strncmp(control, NAME ":", sizeof(NAME))
-
-/* Parse one string and return associated control if parsing is successful*/
-struct ldb_control *ldb_parse_control_from_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char *control_strings)
-{
- struct ldb_control *ctrl;
- char *error_string = NULL;
-
- if (!(ctrl = talloc(mem_ctx, struct ldb_control))) {
- ldb_oom(ldb);
- return NULL;
- }
-
- if (LDB_CONTROL_CMP(control_strings,
- LDB_CONTROL_VLV_REQ_NAME) == 0) {
- struct ldb_vlv_req_control *control;
- const char *p;
- char attr[1024];
- char ctxid[1024];
- int crit, bc, ac, os, cc, ret;
-
- attr[0] = '\0';
- ctxid[0] = '\0';
- p = &(control_strings[sizeof(LDB_CONTROL_VLV_REQ_NAME)]);
- ret = sscanf(p, "%d:%d:%d:%d:%d:%1023[^$]", &crit, &bc, &ac, &os, &cc, ctxid);
- if (ret < 5) {
- ret = sscanf(p, "%d:%d:%d:%1023[^:]:%1023[^$]", &crit, &bc, &ac, attr, ctxid);
- }
-
- if ((ret < 4) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid server_sort control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b):bc(n):ac(n):<os(n):cc(n)|attr(s)>[:ctxid(o)]\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean, n = number, s = string, o = b64 binary blob");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
- ctrl->oid = LDB_CONTROL_VLV_REQ_OID;
- ctrl->critical = crit;
- if (!(control = talloc(ctrl,
- struct ldb_vlv_req_control))) {
- ldb_oom(ldb);
- return NULL;
- }
- control->beforeCount = bc;
- control->afterCount = ac;
- if (attr[0]) {
- control->type = 1;
- control->match.gtOrEq.value = talloc_strdup(control, attr);
- control->match.gtOrEq.value_len = strlen(attr);
- } else {
- control->type = 0;
- control->match.byOffset.offset = os;
- control->match.byOffset.contentCount = cc;
- }
- if (ctxid[0]) {
- control->ctxid_len = ldb_base64_decode(ctxid);
- control->contextId = (char *)talloc_memdup(control, ctxid, control->ctxid_len);
- } else {
- control->ctxid_len = 0;
- control->contextId = NULL;
- }
- ctrl->data = control;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_DIRSYNC_NAME) == 0) {
- struct ldb_dirsync_control *control;
- const char *p;
- char cookie[1024];
- int crit, max_attrs, ret;
- uint32_t flags;
-
- cookie[0] = '\0';
- p = &(control_strings[sizeof(LDB_CONTROL_DIRSYNC_NAME)]);
- ret = sscanf(p, "%d:%u:%d:%1023[^$]", &crit, &flags, &max_attrs, cookie);
-
- if ((ret < 3) || (crit < 0) || (crit > 1) || (flags < 0) || (max_attrs < 0)) {
- error_string = talloc_asprintf(mem_ctx, "invalid dirsync control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b):flags(n):max_attrs(n)[:cookie(o)]\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean, n = number, o = b64 binary blob");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- /* w2k3 seems to ignore the parameter,
- * but w2k sends a wrong cookie when this value is to small
- * this would cause looping forever, while getting
- * the same data and same cookie forever
- */
- if (max_attrs == 0) max_attrs = 0x0FFFFFFF;
-
- ctrl->oid = LDB_CONTROL_DIRSYNC_OID;
- ctrl->critical = crit;
- control = talloc(ctrl, struct ldb_dirsync_control);
- control->flags = flags;
- control->max_attributes = max_attrs;
- if (*cookie) {
- control->cookie_len = ldb_base64_decode(cookie);
- control->cookie = (char *)talloc_memdup(control, cookie, control->cookie_len);
- } else {
- control->cookie = NULL;
- control->cookie_len = 0;
- }
- ctrl->data = control;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_ASQ_NAME) == 0) {
- struct ldb_asq_control *control;
- const char *p;
- char attr[256];
- int crit, ret;
-
- attr[0] = '\0';
- p = &(control_strings[sizeof(LDB_CONTROL_ASQ_NAME)]);
- ret = sscanf(p, "%d:%255[^$]", &crit, attr);
- if ((ret != 2) || (crit < 0) || (crit > 1) || (attr[0] == '\0')) {
- error_string = talloc_asprintf(mem_ctx, "invalid asq control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b):attr(s)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean, s = string");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_ASQ_OID;
- ctrl->critical = crit;
- control = talloc(ctrl, struct ldb_asq_control);
- control->request = 1;
- control->source_attribute = talloc_strdup(control, attr);
- control->src_attr_len = strlen(attr);
- ctrl->data = control;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_EXTENDED_DN_NAME) == 0) {
- struct ldb_extended_dn_control *control;
- const char *p;
- int crit, type, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_EXTENDED_DN_NAME)]);
- ret = sscanf(p, "%d:%d", &crit, &type);
- if ((ret != 2) || (crit < 0) || (crit > 1) || (type < 0) || (type > 1)) {
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid extended_dn control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)[:type(i)]\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean\n");
- error_string = talloc_asprintf_append(error_string, " i = integer\n");
- error_string = talloc_asprintf_append(error_string, " valid values are: 0 - hexadecimal representation\n");
- error_string = talloc_asprintf_append(error_string, " 1 - normal string representation");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
- control = NULL;
- } else {
- control = talloc(ctrl, struct ldb_extended_dn_control);
- control->type = type;
- }
-
- ctrl->oid = LDB_CONTROL_EXTENDED_DN_OID;
- ctrl->critical = crit;
- ctrl->data = talloc_steal(ctrl, control);
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_SD_FLAGS_NAME) == 0) {
- struct ldb_sd_flags_control *control;
- const char *p;
- int crit, ret;
- unsigned secinfo_flags;
-
- p = &(control_strings[sizeof(LDB_CONTROL_SD_FLAGS_NAME)]);
- ret = sscanf(p, "%d:%u", &crit, &secinfo_flags);
- if ((ret != 2) || (crit < 0) || (crit > 1) || (secinfo_flags < 0) || (secinfo_flags > 0xF)) {
- error_string = talloc_asprintf(mem_ctx, "invalid sd_flags control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b):secinfo_flags(n)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean, n = number");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_SD_FLAGS_OID;
- ctrl->critical = crit;
- control = talloc(ctrl, struct ldb_sd_flags_control);
- control->secinfo_flags = secinfo_flags;
- ctrl->data = control;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_SEARCH_OPTIONS_NAME) == 0) {
- struct ldb_search_options_control *control;
- const char *p;
- int crit, ret;
- unsigned search_options;
-
- p = &(control_strings[sizeof(LDB_CONTROL_SEARCH_OPTIONS_NAME)]);
- ret = sscanf(p, "%d:%u", &crit, &search_options);
- if ((ret != 2) || (crit < 0) || (crit > 1) || (search_options < 0) || (search_options > 0xF)) {
- error_string = talloc_asprintf(mem_ctx, "invalid search_options control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b):search_options(n)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean, n = number");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_SEARCH_OPTIONS_OID;
- ctrl->critical = crit;
- control = talloc(ctrl, struct ldb_search_options_control);
- control->search_options = search_options;
- ctrl->data = control;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_BYPASS_OPERATIONAL_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_BYPASS_OPERATIONAL_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid bypassopreational control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_BYPASS_OPERATIONAL_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_RELAX_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_RELAX_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid relax control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_RELAX_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_RECALCULATE_SD_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_RECALCULATE_SD_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid recalculate_sd control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_RECALCULATE_SD_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_DOMAIN_SCOPE_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_DOMAIN_SCOPE_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid domain_scope control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_DOMAIN_SCOPE_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_PAGED_RESULTS_NAME) == 0) {
- struct ldb_paged_control *control;
- const char *p;
- int crit, size, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_PAGED_RESULTS_NAME)]);
- ret = sscanf(p, "%d:%d", &crit, &size);
- if ((ret != 2) || (crit < 0) || (crit > 1) || (size < 0)) {
- error_string = talloc_asprintf(mem_ctx, "invalid paged_results control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b):size(n)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean, n = number");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_PAGED_RESULTS_OID;
- ctrl->critical = crit;
- control = talloc(ctrl, struct ldb_paged_control);
- control->size = size;
- control->cookie = NULL;
- control->cookie_len = 0;
- ctrl->data = control;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_SERVER_SORT_NAME) == 0) {
- struct ldb_server_sort_control **control;
- const char *p;
- char attr[256];
- char rule[128];
- int crit, rev, ret;
-
- attr[0] = '\0';
- rule[0] = '\0';
- p = &(control_strings[sizeof(LDB_CONTROL_SERVER_SORT_NAME)]);
- ret = sscanf(p, "%d:%d:%255[^:]:%127[^:]", &crit, &rev, attr, rule);
- if ((ret < 3) || (crit < 0) || (crit > 1) || (rev < 0 ) || (rev > 1) ||attr[0] == '\0') {
- error_string = talloc_asprintf(mem_ctx, "invalid server_sort control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b):rev(b):attr(s)[:rule(s)]\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean, s = string");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
- ctrl->oid = LDB_CONTROL_SERVER_SORT_OID;
- ctrl->critical = crit;
- control = talloc_array(ctrl, struct ldb_server_sort_control *, 2);
- control[0] = talloc(control, struct ldb_server_sort_control);
- control[0]->attributeName = talloc_strdup(control, attr);
- if (rule[0])
- control[0]->orderingRule = talloc_strdup(control, rule);
- else
- control[0]->orderingRule = NULL;
- control[0]->reverse = rev;
- control[1] = NULL;
- ctrl->data = control;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_NOTIFICATION_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_NOTIFICATION_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid notification control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_NOTIFICATION_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_TREE_DELETE_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_TREE_DELETE_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid tree_delete control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_TREE_DELETE_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_SHOW_DELETED_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_SHOW_DELETED_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid show_deleted control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_SHOW_DELETED_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_SHOW_DEACTIVATED_LINK_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_SHOW_DEACTIVATED_LINK_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid show_deactivated_link control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_SHOW_DEACTIVATED_LINK_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_SHOW_RECYCLED_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_SHOW_RECYCLED_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid show_recycled control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_SHOW_RECYCLED_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_PERMISSIVE_MODIFY_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_PERMISSIVE_MODIFY_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid permissive_modify control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_PERMISSIVE_MODIFY_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_REVEAL_INTERNALS_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_REVEAL_INTERNALS_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid reveal_internals control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_REVEAL_INTERNALS;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (strncmp(control_strings, "local_oid:", 10) == 0) {
- const char *p;
- int crit = 0, ret = 0;
- char oid[256];
-
- oid[0] = '\0';
- p = &(control_strings[10]);
- ret = sscanf(p, "%64[^:]:%d", oid, &crit);
-
- if ((ret != 2) || strlen(oid) == 0 || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid local_oid control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: oid(s):crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean, s = string");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = talloc_strdup(ctrl, oid);
- if (!ctrl->oid) {
- ldb_oom(ldb);
- return NULL;
- }
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_RODC_DCPROMO_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_RODC_DCPROMO_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid rodc_join control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_RODC_DCPROMO_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
-
- if (LDB_CONTROL_CMP(control_strings, LDB_CONTROL_PROVISION_NAME) == 0) {
- const char *p;
- int crit, ret;
-
- p = &(control_strings[sizeof(LDB_CONTROL_PROVISION_NAME)]);
- ret = sscanf(p, "%d", &crit);
- if ((ret != 1) || (crit < 0) || (crit > 1)) {
- error_string = talloc_asprintf(mem_ctx, "invalid provision control syntax\n");
- error_string = talloc_asprintf_append(error_string, " syntax: crit(b)\n");
- error_string = talloc_asprintf_append(error_string, " note: b = boolean");
- ldb_set_errstring(ldb, error_string);
- talloc_free(error_string);
- return NULL;
- }
-
- ctrl->oid = LDB_CONTROL_PROVISION_OID;
- ctrl->critical = crit;
- ctrl->data = NULL;
-
- return ctrl;
- }
- /*
- * When no matching control has been found.
- */
- return NULL;
-}
-
-/*
- * A little trick to allow to use constants defined in headers rather than
- * hardwritten in the file hardwritten in the file
- * sizeof will return the \0 char as well so it will take the place of ":" in the
- * length of the string
- */
-#define LDB_CONTROL_CMP(control, NAME) strncmp(control, NAME ":", sizeof(NAME))
-
-/* Parse controls from the format used on the command line and in ejs */
-struct ldb_control **ldb_parse_control_strings(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char **control_strings)
-{
- unsigned int i;
- struct ldb_control **ctrl;
-
- if (control_strings == NULL || control_strings[0] == NULL)
- return NULL;
-
- for (i = 0; control_strings[i]; i++);
-
- ctrl = talloc_array(mem_ctx, struct ldb_control *, i + 1);
-
- ldb_reset_err_string(ldb);
- for (i = 0; control_strings[i]; i++) {
- ctrl[i] = ldb_parse_control_from_string(ldb, ctrl, control_strings[i]);
- if (ctrl[i] == NULL) {
- if( ldb_errstring == NULL ) {
- /* no controls matched, throw an error */
- ldb_asprintf_errstring(ldb, "Invalid control name: '%s'", control_strings[i]);
- }
- talloc_free(ctrl);
- return NULL;
- }
- }
-
- ctrl[i] = NULL;
-
- return ctrl;
-}
-
-
diff --git a/source4/lib/ldb/common/ldb_debug.c b/source4/lib/ldb/common/ldb_debug.c
deleted file mode 100644
index 6aa58ccf71..0000000000
--- a/source4/lib/ldb/common/ldb_debug.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb debug
- *
- * Description: functions for printing debug messages
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb_private.h"
-
-/*
- this allows the user to choose their own debug function
-*/
-int ldb_set_debug(struct ldb_context *ldb,
- void (*debug)(void *context, enum ldb_debug_level level,
- const char *fmt, va_list ap),
- void *context)
-{
- ldb->debug_ops.debug = debug;
- ldb->debug_ops.context = context;
- return 0;
-}
-
-/*
- debug function for ldb_set_debug_stderr
-*/
-static void ldb_debug_stderr(void *context, enum ldb_debug_level level,
- const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
-static void ldb_debug_stderr(void *context, enum ldb_debug_level level,
- const char *fmt, va_list ap)
-{
- if (level <= LDB_DEBUG_WARNING) {
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
- }
-}
-
-static void ldb_debug_stderr_all(void *context, enum ldb_debug_level level,
- const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
-static void ldb_debug_stderr_all(void *context, enum ldb_debug_level level,
- const char *fmt, va_list ap)
-{
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
-}
-
-/*
- convenience function to setup debug messages on stderr
- messages of level LDB_DEBUG_WARNING and higher are printed
-*/
-int ldb_set_debug_stderr(struct ldb_context *ldb)
-{
- return ldb_set_debug(ldb, ldb_debug_stderr, ldb);
-}
-
-/*
- log a message
-*/
-void ldb_debug(struct ldb_context *ldb, enum ldb_debug_level level, const char *fmt, ...)
-{
- va_list ap;
- if (ldb->debug_ops.debug == NULL) {
- if (ldb->flags & LDB_FLG_ENABLE_TRACING) {
- ldb_set_debug(ldb, ldb_debug_stderr_all, ldb);
- } else {
- ldb_set_debug_stderr(ldb);
- }
- }
- va_start(ap, fmt);
- ldb->debug_ops.debug(ldb->debug_ops.context, level, fmt, ap);
- va_end(ap);
-}
-
-/*
- add to an accumulated log message
- */
-void ldb_debug_add(struct ldb_context *ldb, const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- if (ldb->partial_debug == NULL) {
- ldb->partial_debug = talloc_vasprintf(ldb, fmt, ap);
- } else {
- ldb->partial_debug = talloc_vasprintf_append(ldb->partial_debug,
- fmt, ap);
- }
- va_end(ap);
-}
-
-/*
- send the accumulated log message, and free it
- */
-void ldb_debug_end(struct ldb_context *ldb, enum ldb_debug_level level)
-{
- ldb_debug(ldb, level, "%s", ldb->partial_debug);
- talloc_free(ldb->partial_debug);
- ldb->partial_debug = NULL;
-}
-
-/*
- log a message, and set the ldb error string to the same message
-*/
-void ldb_debug_set(struct ldb_context *ldb, enum ldb_debug_level level,
- const char *fmt, ...)
-{
- va_list ap;
- char *msg;
- va_start(ap, fmt);
- msg = talloc_vasprintf(ldb, fmt, ap);
- va_end(ap);
- if (msg != NULL) {
- ldb_set_errstring(ldb, msg);
- ldb_debug(ldb, level, "%s", msg);
- }
- talloc_free(msg);
-}
-
diff --git a/source4/lib/ldb/common/ldb_dn.c b/source4/lib/ldb/common/ldb_dn.c
deleted file mode 100644
index cd9055da92..0000000000
--- a/source4/lib/ldb/common/ldb_dn.c
+++ /dev/null
@@ -1,2101 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb dn creation and manipulation utility functions
- *
- * Description: - explode a dn into it's own basic elements
- * and put them in a structure (only if necessary)
- * - manipulate ldb_dn structures
- *
- * Author: Simo Sorce
- */
-
-#include "ldb_private.h"
-#include <ctype.h>
-
-#define LDB_DN_NULL_FAILED(x) if (!(x)) goto failed
-
-#define LDB_FREE(x) do { talloc_free(x); x = NULL; } while(0)
-
-/**
- internal ldb exploded dn structures
-*/
-struct ldb_dn_component {
-
- char *name;
- struct ldb_val value;
-
- char *cf_name;
- struct ldb_val cf_value;
-};
-
-struct ldb_dn_ext_component {
-
- char *name;
- struct ldb_val value;
-};
-
-struct ldb_dn {
-
- struct ldb_context *ldb;
-
- /* Special DNs are always linearized */
- bool special;
- bool invalid;
-
- bool valid_case;
-
- char *linearized;
- char *ext_linearized;
- char *casefold;
-
- unsigned int comp_num;
- struct ldb_dn_component *components;
-
- unsigned int ext_comp_num;
- struct ldb_dn_ext_component *ext_components;
-};
-
-/* it is helpful to be able to break on this in gdb */
-static void ldb_dn_mark_invalid(struct ldb_dn *dn)
-{
- dn->invalid = true;
-}
-
-/* strdn may be NULL */
-struct ldb_dn *ldb_dn_from_ldb_val(TALLOC_CTX *mem_ctx,
- struct ldb_context *ldb,
- const struct ldb_val *strdn)
-{
- struct ldb_dn *dn;
-
- if (! ldb) return NULL;
-
- if (strdn && strdn->data
- && (strnlen((const char*)strdn->data, strdn->length) != strdn->length)) {
- /* The RDN must not contain a character with value 0x0 */
- return NULL;
- }
-
- dn = talloc_zero(mem_ctx, struct ldb_dn);
- LDB_DN_NULL_FAILED(dn);
-
- dn->ldb = talloc_get_type(ldb, struct ldb_context);
- if (dn->ldb == NULL) {
- /* the caller probably got the arguments to
- ldb_dn_new() mixed up */
- talloc_free(dn);
- return NULL;
- }
-
- if (strdn->data && strdn->length) {
- const char *data = (const char *)strdn->data;
- size_t length = strdn->length;
-
- if (data[0] == '@') {
- dn->special = true;
- }
- dn->ext_linearized = talloc_strndup(dn, data, length);
- LDB_DN_NULL_FAILED(dn->ext_linearized);
-
- if (data[0] == '<') {
- const char *p_save, *p = dn->ext_linearized;
- do {
- p_save = p;
- p = strstr(p, ">;");
- if (p) {
- p = p + 2;
- }
- } while (p);
-
- if (p_save == dn->ext_linearized) {
- dn->linearized = talloc_strdup(dn, "");
- } else {
- dn->linearized = talloc_strdup(dn, p_save);
- }
- LDB_DN_NULL_FAILED(dn->linearized);
- } else {
- dn->linearized = dn->ext_linearized;
- dn->ext_linearized = NULL;
- }
- } else {
- dn->linearized = talloc_strdup(dn, "");
- LDB_DN_NULL_FAILED(dn->linearized);
- }
-
- return dn;
-
-failed:
- talloc_free(dn);
- return NULL;
-}
-
-/* strdn may be NULL */
-struct ldb_dn *ldb_dn_new(TALLOC_CTX *mem_ctx,
- struct ldb_context *ldb,
- const char *strdn)
-{
- struct ldb_val blob;
- blob.data = discard_const_p(uint8_t, strdn);
- blob.length = strdn ? strlen(strdn) : 0;
- return ldb_dn_from_ldb_val(mem_ctx, ldb, &blob);
-}
-
-struct ldb_dn *ldb_dn_new_fmt(TALLOC_CTX *mem_ctx,
- struct ldb_context *ldb,
- const char *new_fmt, ...)
-{
- char *strdn;
- va_list ap;
-
- if ( (! mem_ctx) || (! ldb)) return NULL;
-
- va_start(ap, new_fmt);
- strdn = talloc_vasprintf(mem_ctx, new_fmt, ap);
- va_end(ap);
-
- if (strdn) {
- struct ldb_dn *dn = ldb_dn_new(mem_ctx, ldb, strdn);
- talloc_free(strdn);
- return dn;
- }
-
- return NULL;
-}
-
-/* see RFC2253 section 2.4 */
-static int ldb_dn_escape_internal(char *dst, const char *src, int len)
-{
- const char *p, *s;
- char *d;
- size_t l;
-
- p = s = src;
- d = dst;
-
- while (p - src < len) {
- p += strcspn(p, ",=\n\r+<>#;\\\" ");
-
- if (p - src == len) /* found no escapable chars */
- break;
-
- /* copy the part of the string before the stop */
- memcpy(d, s, p - s);
- d += (p - s); /* move to current position */
-
- switch (*p) {
- case ' ':
- if (p == src || (p-src)==(len-1)) {
- /* if at the beginning or end
- * of the string then escape */
- *d++ = '\\';
- *d++ = *p++;
- } else {
- /* otherwise don't escape */
- *d++ = *p++;
- }
- break;
-
- case '#':
- /* despite the RFC, windows escapes a #
- anywhere in the string */
- case ',':
- case '+':
- case '"':
- case '\\':
- case '<':
- case '>':
- case '?':
- /* these must be escaped using \c form */
- *d++ = '\\';
- *d++ = *p++;
- break;
-
- default: {
- /* any others get \XX form */
- unsigned char v;
- const char *hexbytes = "0123456789ABCDEF";
- v = *(const unsigned char *)p;
- *d++ = '\\';
- *d++ = hexbytes[v>>4];
- *d++ = hexbytes[v&0xF];
- p++;
- break;
- }
- }
- s = p; /* move forward */
- }
-
- /* copy the last part (with zero) and return */
- l = len - (s - src);
- memcpy(d, s, l + 1);
-
- /* return the length of the resulting string */
- return (l + (d - dst));
-}
-
-char *ldb_dn_escape_value(TALLOC_CTX *mem_ctx, struct ldb_val value)
-{
- char *dst;
-
- if (!value.length)
- return NULL;
-
- /* allocate destination string, it will be at most 3 times the source */
- dst = talloc_array(mem_ctx, char, value.length * 3 + 1);
- if ( ! dst) {
- talloc_free(dst);
- return NULL;
- }
-
- ldb_dn_escape_internal(dst, (const char *)value.data, value.length);
-
- dst = talloc_realloc(mem_ctx, dst, char, strlen(dst) + 1);
-
- return dst;
-}
-
-/*
- explode a DN string into a ldb_dn structure
- based on RFC4514 except that we don't support multiple valued RDNs
-
- TODO: according to MS-ADTS:3.1.1.5.2 Naming Constraints
- DN must be compliant with RFC2253
-*/
-static bool ldb_dn_explode(struct ldb_dn *dn)
-{
- char *p, *ex_name, *ex_value, *data, *d, *dt, *t;
- bool trim = true;
- bool in_extended = true;
- bool in_ex_name = false;
- bool in_ex_value = false;
- bool in_attr = false;
- bool in_value = false;
- bool in_quote = false;
- bool is_oid = false;
- bool escape = false;
- unsigned int x;
- size_t l;
- int ret;
- char *parse_dn;
- bool is_index;
-
- if ( ! dn || dn->invalid) return false;
-
- if (dn->components) {
- return true;
- }
-
- if (dn->ext_linearized) {
- parse_dn = dn->ext_linearized;
- } else {
- parse_dn = dn->linearized;
- }
-
- if ( ! parse_dn ) {
- return false;
- }
-
- is_index = (strncmp(parse_dn, "DN=@INDEX:", 10) == 0);
-
- /* Empty DNs */
- if (parse_dn[0] == '\0') {
- return true;
- }
-
- /* Special DNs case */
- if (dn->special) {
- return true;
- }
-
- /* make sure we free this if allocated previously before replacing */
- LDB_FREE(dn->components);
- dn->comp_num = 0;
-
- LDB_FREE(dn->ext_components);
- dn->ext_comp_num = 0;
-
- /* in the common case we have 3 or more components */
- /* make sure all components are zeroed, other functions depend on it */
- dn->components = talloc_zero_array(dn, struct ldb_dn_component, 3);
- if ( ! dn->components) {
- return false;
- }
-
- /* Components data space is allocated here once */
- data = talloc_array(dn->components, char, strlen(parse_dn) + 1);
- if (!data) {
- return false;
- }
-
- p = parse_dn;
- t = NULL;
- d = dt = data;
-
- while (*p) {
- if (in_extended) {
-
- if (!in_ex_name && !in_ex_value) {
-
- if (p[0] == '<') {
- p++;
- ex_name = d;
- in_ex_name = true;
- continue;
- } else if (p[0] == '\0') {
- p++;
- continue;
- } else {
- in_extended = false;
- in_attr = true;
- dt = d;
-
- continue;
- }
- }
-
- if (in_ex_name && *p == '=') {
- *d++ = '\0';
- p++;
- ex_value = d;
- in_ex_name = false;
- in_ex_value = true;
- continue;
- }
-
- if (in_ex_value && *p == '>') {
- const struct ldb_dn_extended_syntax *ext_syntax;
- struct ldb_val ex_val = {
- .data = (uint8_t *)ex_value,
- .length = d - ex_value
- };
-
- *d++ = '\0';
- p++;
- in_ex_value = false;
-
- /* Process name and ex_value */
-
- dn->ext_components = talloc_realloc(dn,
- dn->ext_components,
- struct ldb_dn_ext_component,
- dn->ext_comp_num + 1);
- if ( ! dn->ext_components) {
- /* ouch ! */
- goto failed;
- }
-
- ext_syntax = ldb_dn_extended_syntax_by_name(dn->ldb, ex_name);
- if (!ext_syntax) {
- /* We don't know about this type of extended DN */
- goto failed;
- }
-
- dn->ext_components[dn->ext_comp_num].name = talloc_strdup(dn->ext_components, ex_name);
- if (!dn->ext_components[dn->ext_comp_num].name) {
- /* ouch */
- goto failed;
- }
- ret = ext_syntax->read_fn(dn->ldb, dn->ext_components,
- &ex_val, &dn->ext_components[dn->ext_comp_num].value);
- if (ret != LDB_SUCCESS) {
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
-
- dn->ext_comp_num++;
-
- if (*p == '\0') {
- /* We have reached the end (extended component only)! */
- talloc_free(data);
- return true;
-
- } else if (*p == ';') {
- p++;
- continue;
- } else {
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
- }
-
- *d++ = *p++;
- continue;
- }
- if (in_attr) {
- if (trim) {
- if (*p == ' ') {
- p++;
- continue;
- }
-
- /* first char */
- trim = false;
-
- if (!isascii(*p)) {
- /* attr names must be ascii only */
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
-
- if (isdigit(*p)) {
- is_oid = true;
- } else
- if ( ! isalpha(*p)) {
- /* not a digit nor an alpha,
- * invalid attribute name */
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
-
- /* Copy this character across from parse_dn,
- * now we have trimmed out spaces */
- *d++ = *p++;
- continue;
- }
-
- if (*p == ' ') {
- p++;
- /* valid only if we are at the end */
- trim = true;
- continue;
- }
-
- if (trim && (*p != '=')) {
- /* spaces/tabs are not allowed */
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
-
- if (*p == '=') {
- /* attribute terminated */
- in_attr = false;
- in_value = true;
- trim = true;
- l = 0;
-
- /* Terminate this string in d
- * (which is a copy of parse_dn
- * with spaces trimmed) */
- *d++ = '\0';
- dn->components[dn->comp_num].name = talloc_strdup(dn->components, dt);
- if ( ! dn->components[dn->comp_num].name) {
- /* ouch */
- goto failed;
- }
-
- dt = d;
-
- p++;
- continue;
- }
-
- if (!isascii(*p)) {
- /* attr names must be ascii only */
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
-
- if (is_oid && ( ! (isdigit(*p) || (*p == '.')))) {
- /* not a digit nor a dot,
- * invalid attribute oid */
- ldb_dn_mark_invalid(dn);
- goto failed;
- } else
- if ( ! (isalpha(*p) || isdigit(*p) || (*p == '-'))) {
- /* not ALPHA, DIGIT or HYPHEN */
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
-
- *d++ = *p++;
- continue;
- }
-
- if (in_value) {
- if (in_quote) {
- if (*p == '\"') {
- if (p[-1] != '\\') {
- p++;
- in_quote = false;
- continue;
- }
- }
- *d++ = *p++;
- l++;
- continue;
- }
-
- if (trim) {
- if (*p == ' ') {
- p++;
- continue;
- }
-
- /* first char */
- trim = false;
-
- if (*p == '\"') {
- in_quote = true;
- p++;
- continue;
- }
- }
-
- switch (*p) {
-
- /* TODO: support ber encoded values
- case '#':
- */
-
- case ',':
- if (escape) {
- *d++ = *p++;
- l++;
- escape = false;
- continue;
- }
- /* ok found value terminator */
-
- if ( t ) {
- /* trim back */
- d -= (p - t);
- l -= (p - t);
- }
-
- in_attr = true;
- in_value = false;
- trim = true;
-
- p++;
- *d++ = '\0';
- dn->components[dn->comp_num].value.data = (uint8_t *)talloc_strdup(dn->components, dt);
- dn->components[dn->comp_num].value.length = l;
- if ( ! dn->components[dn->comp_num].value.data) {
- /* ouch ! */
- goto failed;
- }
-
- dt = d;
-
- dn->comp_num++;
- if (dn->comp_num > 2) {
- dn->components = talloc_realloc(dn,
- dn->components,
- struct ldb_dn_component,
- dn->comp_num + 1);
- if ( ! dn->components) {
- /* ouch ! */
- goto failed;
- }
- /* make sure all components are zeroed, other functions depend on this */
- memset(&dn->components[dn->comp_num], '\0', sizeof(struct ldb_dn_component));
- }
-
- continue;
-
- case '+':
- case '=':
- /* to main compatibility with earlier
- versions of ldb indexing, we have to
- accept the base64 encoded binary index
- values, which contain a '+' or '='
- which should normally be escaped */
- if (is_index) {
- if ( t ) t = NULL;
- *d++ = *p++;
- l++;
- break;
- }
- /* fall through */
- case '\"':
- case '<':
- case '>':
- case ';':
- /* a string with not escaped specials is invalid (tested) */
- if ( ! escape) {
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
- escape = false;
-
- *d++ = *p++;
- l++;
-
- if ( t ) t = NULL;
- break;
-
- case '\\':
- if ( ! escape) {
- escape = true;
- p++;
- continue;
- }
- escape = false;
-
- *d++ = *p++;
- l++;
-
- if ( t ) t = NULL;
- break;
-
- default:
- if (escape) {
- if (isxdigit(p[0]) && isxdigit(p[1])) {
- if (sscanf(p, "%02x", &x) != 1) {
- /* invalid escaping sequence */
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
- p += 2;
- *d++ = (unsigned char)x;
- } else {
- *d++ = *p++;
- }
-
- escape = false;
- l++;
- if ( t ) t = NULL;
- break;
- }
-
- if (*p == ' ') {
- if ( ! t) t = p;
- } else {
- if ( t ) t = NULL;
- }
-
- *d++ = *p++;
- l++;
-
- break;
- }
-
- }
- }
-
- if (in_attr || in_quote) {
- /* invalid dn */
- ldb_dn_mark_invalid(dn);
- goto failed;
- }
-
- /* save last element */
- if ( t ) {
- /* trim back */
- d -= (p - t);
- l -= (p - t);
- }
-
- *d++ = '\0';
- dn->components[dn->comp_num].value.length = l;
- dn->components[dn->comp_num].value.data =
- (uint8_t *)talloc_strdup(dn->components, dt);
- if ( ! dn->components[dn->comp_num].value.data) {
- /* ouch */
- goto failed;
- }
-
- dn->comp_num++;
-
- talloc_free(data);
- return true;
-
-failed:
- LDB_FREE(dn->components); /* "data" is implicitly free'd */
- dn->comp_num = 0;
- LDB_FREE(dn->ext_components);
- dn->ext_comp_num = 0;
-
- return false;
-}
-
-bool ldb_dn_validate(struct ldb_dn *dn)
-{
- return ldb_dn_explode(dn);
-}
-
-const char *ldb_dn_get_linearized(struct ldb_dn *dn)
-{
- unsigned int i;
- size_t len;
- char *d, *n;
-
- if ( ! dn || ( dn->invalid)) return NULL;
-
- if (dn->linearized) return dn->linearized;
-
- if ( ! dn->components) {
- ldb_dn_mark_invalid(dn);
- return NULL;
- }
-
- if (dn->comp_num == 0) {
- dn->linearized = talloc_strdup(dn, "");
- if ( ! dn->linearized) return NULL;
- return dn->linearized;
- }
-
- /* calculate maximum possible length of DN */
- for (len = 0, i = 0; i < dn->comp_num; i++) {
- /* name len */
- len += strlen(dn->components[i].name);
- /* max escaped data len */
- len += (dn->components[i].value.length * 3);
- len += 2; /* '=' and ',' */
- }
- dn->linearized = talloc_array(dn, char, len);
- if ( ! dn->linearized) return NULL;
-
- d = dn->linearized;
-
- for (i = 0; i < dn->comp_num; i++) {
-
- /* copy the name */
- n = dn->components[i].name;
- while (*n) *d++ = *n++;
-
- *d++ = '=';
-
- /* and the value */
- d += ldb_dn_escape_internal( d,
- (char *)dn->components[i].value.data,
- dn->components[i].value.length);
- *d++ = ',';
- }
-
- *(--d) = '\0';
-
- /* don't waste more memory than necessary */
- dn->linearized = talloc_realloc(dn, dn->linearized,
- char, (d - dn->linearized + 1));
-
- return dn->linearized;
-}
-
-static int ldb_dn_extended_component_compare(const void *p1, const void *p2)
-{
- const struct ldb_dn_ext_component *ec1 = (const struct ldb_dn_ext_component *)p1;
- const struct ldb_dn_ext_component *ec2 = (const struct ldb_dn_ext_component *)p2;
- return strcmp(ec1->name, ec2->name);
-}
-
-char *ldb_dn_get_extended_linearized(TALLOC_CTX *mem_ctx, struct ldb_dn *dn, int mode)
-{
- const char *linearized = ldb_dn_get_linearized(dn);
- char *p = NULL;
- unsigned int i;
-
- if (!linearized) {
- return NULL;
- }
-
- if (!ldb_dn_has_extended(dn)) {
- return talloc_strdup(mem_ctx, linearized);
- }
-
- if (!ldb_dn_validate(dn)) {
- return NULL;
- }
-
- /* sort the extended components by name. The idea is to make
- * the resulting DNs consistent, plus to ensure that we put
- * 'DELETED' first, so it can be very quickly recognised
- */
- TYPESAFE_QSORT(dn->ext_components, dn->ext_comp_num,
- ldb_dn_extended_component_compare);
-
- for (i = 0; i < dn->ext_comp_num; i++) {
- const struct ldb_dn_extended_syntax *ext_syntax;
- const char *name = dn->ext_components[i].name;
- struct ldb_val ec_val = dn->ext_components[i].value;
- struct ldb_val val;
- int ret;
-
- ext_syntax = ldb_dn_extended_syntax_by_name(dn->ldb, name);
- if (!ext_syntax) {
- return NULL;
- }
-
- if (mode == 1) {
- ret = ext_syntax->write_clear_fn(dn->ldb, mem_ctx,
- &ec_val, &val);
- } else if (mode == 0) {
- ret = ext_syntax->write_hex_fn(dn->ldb, mem_ctx,
- &ec_val, &val);
- } else {
- ret = -1;
- }
-
- if (ret != LDB_SUCCESS) {
- return NULL;
- }
-
- if (i == 0) {
- p = talloc_asprintf(mem_ctx, "<%s=%s>",
- name, val.data);
- } else {
- p = talloc_asprintf_append_buffer(p, ";<%s=%s>",
- name, val.data);
- }
-
- talloc_free(val.data);
-
- if (!p) {
- return NULL;
- }
- }
-
- if (dn->ext_comp_num && *linearized) {
- p = talloc_asprintf_append_buffer(p, ";%s", linearized);
- }
-
- if (!p) {
- return NULL;
- }
-
- return p;
-}
-
-/*
- filter out all but an acceptable list of extended DN components
- */
-void ldb_dn_extended_filter(struct ldb_dn *dn, const char * const *accept_list)
-{
- unsigned int i;
- for (i=0; i<dn->ext_comp_num; i++) {
- if (!ldb_attr_in_list(accept_list, dn->ext_components[i].name)) {
- memmove(&dn->ext_components[i],
- &dn->ext_components[i+1],
- (dn->ext_comp_num-(i+1))*sizeof(dn->ext_components[0]));
- dn->ext_comp_num--;
- i--;
- }
- }
- LDB_FREE(dn->ext_linearized);
-}
-
-
-char *ldb_dn_alloc_linearized(TALLOC_CTX *mem_ctx, struct ldb_dn *dn)
-{
- return talloc_strdup(mem_ctx, ldb_dn_get_linearized(dn));
-}
-
-/*
- casefold a dn. We need to casefold the attribute names, and canonicalize
- attribute values of case insensitive attributes.
-*/
-
-static bool ldb_dn_casefold_internal(struct ldb_dn *dn)
-{
- unsigned int i;
- int ret;
-
- if ( ! dn || dn->invalid) return false;
-
- if (dn->valid_case) return true;
-
- if (( ! dn->components) && ( ! ldb_dn_explode(dn))) {
- return false;
- }
-
- for (i = 0; i < dn->comp_num; i++) {
- const struct ldb_schema_attribute *a;
-
- dn->components[i].cf_name =
- ldb_attr_casefold(dn->components,
- dn->components[i].name);
- if (!dn->components[i].cf_name) {
- goto failed;
- }
-
- a = ldb_schema_attribute_by_name(dn->ldb,
- dn->components[i].cf_name);
-
- ret = a->syntax->canonicalise_fn(dn->ldb, dn->components,
- &(dn->components[i].value),
- &(dn->components[i].cf_value));
- if (ret != 0) {
- goto failed;
- }
- }
-
- dn->valid_case = true;
-
- return true;
-
-failed:
- for (i = 0; i < dn->comp_num; i++) {
- LDB_FREE(dn->components[i].cf_name);
- LDB_FREE(dn->components[i].cf_value.data);
- }
- return false;
-}
-
-const char *ldb_dn_get_casefold(struct ldb_dn *dn)
-{
- unsigned int i;
- size_t len;
- char *d, *n;
-
- if (dn->casefold) return dn->casefold;
-
- if (dn->special) {
- dn->casefold = talloc_strdup(dn, dn->linearized);
- if (!dn->casefold) return NULL;
- dn->valid_case = true;
- return dn->casefold;
- }
-
- if ( ! ldb_dn_casefold_internal(dn)) {
- return NULL;
- }
-
- if (dn->comp_num == 0) {
- dn->casefold = talloc_strdup(dn, "");
- return dn->casefold;
- }
-
- /* calculate maximum possible length of DN */
- for (len = 0, i = 0; i < dn->comp_num; i++) {
- /* name len */
- len += strlen(dn->components[i].cf_name);
- /* max escaped data len */
- len += (dn->components[i].cf_value.length * 3);
- len += 2; /* '=' and ',' */
- }
- dn->casefold = talloc_array(dn, char, len);
- if ( ! dn->casefold) return NULL;
-
- d = dn->casefold;
-
- for (i = 0; i < dn->comp_num; i++) {
-
- /* copy the name */
- n = dn->components[i].cf_name;
- while (*n) *d++ = *n++;
-
- *d++ = '=';
-
- /* and the value */
- d += ldb_dn_escape_internal( d,
- (char *)dn->components[i].cf_value.data,
- dn->components[i].cf_value.length);
- *d++ = ',';
- }
- *(--d) = '\0';
-
- /* don't waste more memory than necessary */
- dn->casefold = talloc_realloc(dn, dn->casefold,
- char, strlen(dn->casefold) + 1);
-
- return dn->casefold;
-}
-
-char *ldb_dn_alloc_casefold(TALLOC_CTX *mem_ctx, struct ldb_dn *dn)
-{
- return talloc_strdup(mem_ctx, ldb_dn_get_casefold(dn));
-}
-
-/* Determine if dn is below base, in the ldap tree. Used for
- * evaluating a subtree search.
- * 0 if they match, otherwise non-zero
- */
-
-int ldb_dn_compare_base(struct ldb_dn *base, struct ldb_dn *dn)
-{
- int ret;
- unsigned int n_base, n_dn;
-
- if ( ! base || base->invalid) return 1;
- if ( ! dn || dn->invalid) return -1;
-
- if (( ! base->valid_case) || ( ! dn->valid_case)) {
- if (base->linearized && dn->linearized) {
- /* try with a normal compare first, if we are lucky
- * we will avoid exploding and casfolding */
- int dif;
- dif = strlen(dn->linearized) - strlen(base->linearized);
- if (dif < 0) {
- return dif;
- }
- if (strcmp(base->linearized,
- &dn->linearized[dif]) == 0) {
- return 0;
- }
- }
-
- if ( ! ldb_dn_casefold_internal(base)) {
- return 1;
- }
-
- if ( ! ldb_dn_casefold_internal(dn)) {
- return -1;
- }
-
- }
-
- /* if base has more components,
- * they don't have the same base */
- if (base->comp_num > dn->comp_num) {
- return (dn->comp_num - base->comp_num);
- }
-
- if ((dn->comp_num == 0) || (base->comp_num == 0)) {
- if (dn->special && base->special) {
- return strcmp(base->linearized, dn->linearized);
- } else if (dn->special) {
- return -1;
- } else if (base->special) {
- return 1;
- } else {
- return 0;
- }
- }
-
- n_base = base->comp_num - 1;
- n_dn = dn->comp_num - 1;
-
- while (n_base != (unsigned int) -1) {
- char *b_name = base->components[n_base].cf_name;
- char *dn_name = dn->components[n_dn].cf_name;
-
- char *b_vdata = (char *)base->components[n_base].cf_value.data;
- char *dn_vdata = (char *)dn->components[n_dn].cf_value.data;
-
- size_t b_vlen = base->components[n_base].cf_value.length;
- size_t dn_vlen = dn->components[n_dn].cf_value.length;
-
- /* compare attr names */
- ret = strcmp(b_name, dn_name);
- if (ret != 0) return ret;
-
- /* compare attr.cf_value. */
- if (b_vlen != dn_vlen) {
- return b_vlen - dn_vlen;
- }
- ret = strcmp(b_vdata, dn_vdata);
- if (ret != 0) return ret;
-
- n_base--;
- n_dn--;
- }
-
- return 0;
-}
-
-/* compare DNs using casefolding compare functions.
-
- If they match, then return 0
- */
-
-int ldb_dn_compare(struct ldb_dn *dn0, struct ldb_dn *dn1)
-{
- unsigned int i;
- int ret;
-
- if (( ! dn0) || dn0->invalid || ! dn1 || dn1->invalid) {
- return -1;
- }
-
- if (( ! dn0->valid_case) || ( ! dn1->valid_case)) {
- if (dn0->linearized && dn1->linearized) {
- /* try with a normal compare first, if we are lucky
- * we will avoid exploding and casfolding */
- if (strcmp(dn0->linearized, dn1->linearized) == 0) {
- return 0;
- }
- }
-
- if ( ! ldb_dn_casefold_internal(dn0)) {
- return 1;
- }
-
- if ( ! ldb_dn_casefold_internal(dn1)) {
- return -1;
- }
-
- }
-
- if (dn0->comp_num != dn1->comp_num) {
- return (dn1->comp_num - dn0->comp_num);
- }
-
- if (dn0->comp_num == 0) {
- if (dn0->special && dn1->special) {
- return strcmp(dn0->linearized, dn1->linearized);
- } else if (dn0->special) {
- return 1;
- } else if (dn1->special) {
- return -1;
- } else {
- return 0;
- }
- }
-
- for (i = 0; i < dn0->comp_num; i++) {
- char *dn0_name = dn0->components[i].cf_name;
- char *dn1_name = dn1->components[i].cf_name;
-
- char *dn0_vdata = (char *)dn0->components[i].cf_value.data;
- char *dn1_vdata = (char *)dn1->components[i].cf_value.data;
-
- size_t dn0_vlen = dn0->components[i].cf_value.length;
- size_t dn1_vlen = dn1->components[i].cf_value.length;
-
- /* compare attr names */
- ret = strcmp(dn0_name, dn1_name);
- if (ret != 0) {
- return ret;
- }
-
- /* compare attr.cf_value. */
- if (dn0_vlen != dn1_vlen) {
- return dn0_vlen - dn1_vlen;
- }
- ret = strcmp(dn0_vdata, dn1_vdata);
- if (ret != 0) {
- return ret;
- }
- }
-
- return 0;
-}
-
-static struct ldb_dn_component ldb_dn_copy_component(
- TALLOC_CTX *mem_ctx,
- struct ldb_dn_component *src)
-{
- struct ldb_dn_component dst;
-
- memset(&dst, 0, sizeof(dst));
-
- if (src == NULL) {
- return dst;
- }
-
- dst.value = ldb_val_dup(mem_ctx, &(src->value));
- if (dst.value.data == NULL) {
- return dst;
- }
-
- dst.name = talloc_strdup(mem_ctx, src->name);
- if (dst.name == NULL) {
- LDB_FREE(dst.value.data);
- return dst;
- }
-
- if (src->cf_value.data) {
- dst.cf_value = ldb_val_dup(mem_ctx, &(src->cf_value));
- if (dst.cf_value.data == NULL) {
- LDB_FREE(dst.value.data);
- LDB_FREE(dst.name);
- return dst;
- }
-
- dst.cf_name = talloc_strdup(mem_ctx, src->cf_name);
- if (dst.cf_name == NULL) {
- LDB_FREE(dst.cf_name);
- LDB_FREE(dst.value.data);
- LDB_FREE(dst.name);
- return dst;
- }
- } else {
- dst.cf_value.data = NULL;
- dst.cf_name = NULL;
- }
-
- return dst;
-}
-
-static struct ldb_dn_ext_component ldb_dn_ext_copy_component(
- TALLOC_CTX *mem_ctx,
- struct ldb_dn_ext_component *src)
-{
- struct ldb_dn_ext_component dst;
-
- memset(&dst, 0, sizeof(dst));
-
- if (src == NULL) {
- return dst;
- }
-
- dst.value = ldb_val_dup(mem_ctx, &(src->value));
- if (dst.value.data == NULL) {
- return dst;
- }
-
- dst.name = talloc_strdup(mem_ctx, src->name);
- if (dst.name == NULL) {
- LDB_FREE(dst.value.data);
- return dst;
- }
-
- return dst;
-}
-
-struct ldb_dn *ldb_dn_copy(TALLOC_CTX *mem_ctx, struct ldb_dn *dn)
-{
- struct ldb_dn *new_dn;
-
- if (!dn || dn->invalid) {
- return NULL;
- }
-
- new_dn = talloc_zero(mem_ctx, struct ldb_dn);
- if ( !new_dn) {
- return NULL;
- }
-
- *new_dn = *dn;
-
- if (dn->components) {
- unsigned int i;
-
- new_dn->components =
- talloc_zero_array(new_dn,
- struct ldb_dn_component,
- dn->comp_num);
- if ( ! new_dn->components) {
- talloc_free(new_dn);
- return NULL;
- }
-
- for (i = 0; i < dn->comp_num; i++) {
- new_dn->components[i] =
- ldb_dn_copy_component(new_dn->components,
- &dn->components[i]);
- if ( ! new_dn->components[i].value.data) {
- talloc_free(new_dn);
- return NULL;
- }
- }
- }
-
- if (dn->ext_components) {
- unsigned int i;
-
- new_dn->ext_components =
- talloc_zero_array(new_dn,
- struct ldb_dn_ext_component,
- dn->ext_comp_num);
- if ( ! new_dn->ext_components) {
- talloc_free(new_dn);
- return NULL;
- }
-
- for (i = 0; i < dn->ext_comp_num; i++) {
- new_dn->ext_components[i] =
- ldb_dn_ext_copy_component(
- new_dn->ext_components,
- &dn->ext_components[i]);
- if ( ! new_dn->ext_components[i].value.data) {
- talloc_free(new_dn);
- return NULL;
- }
- }
- }
-
- if (dn->casefold) {
- new_dn->casefold = talloc_strdup(new_dn, dn->casefold);
- if ( ! new_dn->casefold) {
- talloc_free(new_dn);
- return NULL;
- }
- }
-
- if (dn->linearized) {
- new_dn->linearized = talloc_strdup(new_dn, dn->linearized);
- if ( ! new_dn->linearized) {
- talloc_free(new_dn);
- return NULL;
- }
- }
-
- if (dn->ext_linearized) {
- new_dn->ext_linearized = talloc_strdup(new_dn,
- dn->ext_linearized);
- if ( ! new_dn->ext_linearized) {
- talloc_free(new_dn);
- return NULL;
- }
- }
-
- return new_dn;
-}
-
-/* modify the given dn by adding a base.
- *
- * return true if successful and false if not
- * if false is returned the dn may be marked invalid
- */
-bool ldb_dn_add_base(struct ldb_dn *dn, struct ldb_dn *base)
-{
- const char *s;
- char *t;
-
- if ( !base || base->invalid || !dn || dn->invalid) {
- return false;
- }
-
- if (dn->components) {
- unsigned int i;
-
- if ( ! ldb_dn_validate(base)) {
- return false;
- }
-
- s = NULL;
- if (dn->valid_case) {
- if ( ! (s = ldb_dn_get_casefold(base))) {
- return false;
- }
- }
-
- dn->components = talloc_realloc(dn,
- dn->components,
- struct ldb_dn_component,
- dn->comp_num + base->comp_num);
- if ( ! dn->components) {
- ldb_dn_mark_invalid(dn);
- return false;
- }
-
- for (i = 0; i < base->comp_num; dn->comp_num++, i++) {
- dn->components[dn->comp_num] =
- ldb_dn_copy_component(dn->components,
- &base->components[i]);
- if (dn->components[dn->comp_num].value.data == NULL) {
- ldb_dn_mark_invalid(dn);
- return false;
- }
- }
-
- if (dn->casefold && s) {
- if (*dn->casefold) {
- t = talloc_asprintf(dn, "%s,%s",
- dn->casefold, s);
- } else {
- t = talloc_strdup(dn, s);
- }
- LDB_FREE(dn->casefold);
- dn->casefold = t;
- }
- }
-
- if (dn->linearized) {
-
- s = ldb_dn_get_linearized(base);
- if ( ! s) {
- return false;
- }
-
- if (*dn->linearized) {
- t = talloc_asprintf(dn, "%s,%s",
- dn->linearized, s);
- } else {
- t = talloc_strdup(dn, s);
- }
- if ( ! t) {
- ldb_dn_mark_invalid(dn);
- return false;
- }
- LDB_FREE(dn->linearized);
- dn->linearized = t;
- }
-
- /* Wipe the ext_linearized DN,
- * the GUID and SID are almost certainly no longer valid */
- LDB_FREE(dn->ext_linearized);
- LDB_FREE(dn->ext_components);
- dn->ext_comp_num = 0;
-
- return true;
-}
-
-/* modify the given dn by adding a base.
- *
- * return true if successful and false if not
- * if false is returned the dn may be marked invalid
- */
-bool ldb_dn_add_base_fmt(struct ldb_dn *dn, const char *base_fmt, ...)
-{
- struct ldb_dn *base;
- char *base_str;
- va_list ap;
- bool ret;
-
- if ( !dn || dn->invalid) {
- return false;
- }
-
- va_start(ap, base_fmt);
- base_str = talloc_vasprintf(dn, base_fmt, ap);
- va_end(ap);
-
- if (base_str == NULL) {
- return false;
- }
-
- base = ldb_dn_new(base_str, dn->ldb, base_str);
-
- ret = ldb_dn_add_base(dn, base);
-
- talloc_free(base_str);
-
- return ret;
-}
-
-/* modify the given dn by adding children elements.
- *
- * return true if successful and false if not
- * if false is returned the dn may be marked invalid
- */
-bool ldb_dn_add_child(struct ldb_dn *dn, struct ldb_dn *child)
-{
- const char *s;
- char *t;
-
- if ( !child || child->invalid || !dn || dn->invalid) {
- return false;
- }
-
- if (dn->components) {
- unsigned int n;
- unsigned int i, j;
-
- if (dn->comp_num == 0) {
- return false;
- }
-
- if ( ! ldb_dn_validate(child)) {
- return false;
- }
-
- s = NULL;
- if (dn->valid_case) {
- if ( ! (s = ldb_dn_get_casefold(child))) {
- return false;
- }
- }
-
- n = dn->comp_num + child->comp_num;
-
- dn->components = talloc_realloc(dn,
- dn->components,
- struct ldb_dn_component,
- n);
- if ( ! dn->components) {
- ldb_dn_mark_invalid(dn);
- return false;
- }
-
- for (i = dn->comp_num - 1, j = n - 1; i != (unsigned int) -1;
- i--, j--) {
- dn->components[j] = dn->components[i];
- }
-
- for (i = 0; i < child->comp_num; i++) {
- dn->components[i] =
- ldb_dn_copy_component(dn->components,
- &child->components[i]);
- if (dn->components[i].value.data == NULL) {
- ldb_dn_mark_invalid(dn);
- return false;
- }
- }
-
- dn->comp_num = n;
-
- if (dn->casefold && s) {
- t = talloc_asprintf(dn, "%s,%s", s, dn->casefold);
- LDB_FREE(dn->casefold);
- dn->casefold = t;
- }
- }
-
- if (dn->linearized) {
- if (dn->linearized[0] == '\0') {
- return false;
- }
-
- s = ldb_dn_get_linearized(child);
- if ( ! s) {
- return false;
- }
-
- t = talloc_asprintf(dn, "%s,%s", s, dn->linearized);
- if ( ! t) {
- ldb_dn_mark_invalid(dn);
- return false;
- }
- LDB_FREE(dn->linearized);
- dn->linearized = t;
- }
-
- /* Wipe the ext_linearized DN,
- * the GUID and SID are almost certainly no longer valid */
- LDB_FREE(dn->ext_linearized);
- LDB_FREE(dn->ext_components);
- dn->ext_comp_num = 0;
-
- return true;
-}
-
-/* modify the given dn by adding children elements.
- *
- * return true if successful and false if not
- * if false is returned the dn may be marked invalid
- */
-bool ldb_dn_add_child_fmt(struct ldb_dn *dn, const char *child_fmt, ...)
-{
- struct ldb_dn *child;
- char *child_str;
- va_list ap;
- bool ret;
-
- if ( !dn || dn->invalid) {
- return false;
- }
-
- va_start(ap, child_fmt);
- child_str = talloc_vasprintf(dn, child_fmt, ap);
- va_end(ap);
-
- if (child_str == NULL) {
- return false;
- }
-
- child = ldb_dn_new(child_str, dn->ldb, child_str);
-
- ret = ldb_dn_add_child(dn, child);
-
- talloc_free(child_str);
-
- return ret;
-}
-
-bool ldb_dn_remove_base_components(struct ldb_dn *dn, unsigned int num)
-{
- unsigned int i;
-
- if ( ! ldb_dn_validate(dn)) {
- return false;
- }
-
- if (dn->comp_num < num) {
- return false;
- }
-
- /* free components */
- for (i = dn->comp_num - num; i < dn->comp_num; i++) {
- LDB_FREE(dn->components[i].name);
- LDB_FREE(dn->components[i].value.data);
- LDB_FREE(dn->components[i].cf_name);
- LDB_FREE(dn->components[i].cf_value.data);
- }
-
- dn->comp_num -= num;
-
- if (dn->valid_case) {
- for (i = 0; i < dn->comp_num; i++) {
- LDB_FREE(dn->components[i].cf_name);
- LDB_FREE(dn->components[i].cf_value.data);
- }
- dn->valid_case = false;
- }
-
- LDB_FREE(dn->casefold);
- LDB_FREE(dn->linearized);
-
- /* Wipe the ext_linearized DN,
- * the GUID and SID are almost certainly no longer valid */
- LDB_FREE(dn->ext_linearized);
- LDB_FREE(dn->ext_components);
- dn->ext_comp_num = 0;
-
- return true;
-}
-
-bool ldb_dn_remove_child_components(struct ldb_dn *dn, unsigned int num)
-{
- unsigned int i, j;
-
- if ( ! ldb_dn_validate(dn)) {
- return false;
- }
-
- if (dn->comp_num < num) {
- return false;
- }
-
- for (i = 0, j = num; j < dn->comp_num; i++, j++) {
- if (i < num) {
- LDB_FREE(dn->components[i].name);
- LDB_FREE(dn->components[i].value.data);
- LDB_FREE(dn->components[i].cf_name);
- LDB_FREE(dn->components[i].cf_value.data);
- }
- dn->components[i] = dn->components[j];
- }
-
- dn->comp_num -= num;
-
- if (dn->valid_case) {
- for (i = 0; i < dn->comp_num; i++) {
- LDB_FREE(dn->components[i].cf_name);
- LDB_FREE(dn->components[i].cf_value.data);
- }
- dn->valid_case = false;
- }
-
- LDB_FREE(dn->casefold);
- LDB_FREE(dn->linearized);
-
- /* Wipe the ext_linearized DN,
- * the GUID and SID are almost certainly no longer valid */
- LDB_FREE(dn->ext_linearized);
- LDB_FREE(dn->ext_components);
- dn->ext_comp_num = 0;
-
- return true;
-}
-
-struct ldb_dn *ldb_dn_get_parent(TALLOC_CTX *mem_ctx, struct ldb_dn *dn)
-{
- struct ldb_dn *new_dn;
-
- new_dn = ldb_dn_copy(mem_ctx, dn);
- if ( !new_dn ) {
- return NULL;
- }
-
- if ( ! ldb_dn_remove_child_components(new_dn, 1)) {
- talloc_free(new_dn);
- return NULL;
- }
-
- return new_dn;
-}
-
-/* Create a 'canonical name' string from a DN:
-
- ie dc=samba,dc=org -> samba.org/
- uid=administrator,ou=users,dc=samba,dc=org = samba.org/users/administrator
-
- There are two formats,
- the EX format has the last '/' replaced with a newline (\n).
-
-*/
-static char *ldb_dn_canonical(TALLOC_CTX *mem_ctx, struct ldb_dn *dn, int ex_format) {
- unsigned int i;
- TALLOC_CTX *tmpctx;
- char *cracked = NULL;
- const char *format = (ex_format ? "\n" : "/" );
-
- if ( ! ldb_dn_validate(dn)) {
- return NULL;
- }
-
- tmpctx = talloc_new(mem_ctx);
-
- /* Walk backwards down the DN, grabbing 'dc' components at first */
- for (i = dn->comp_num - 1; i != (unsigned int) -1; i--) {
- if (ldb_attr_cmp(dn->components[i].name, "dc") != 0) {
- break;
- }
- if (cracked) {
- cracked = talloc_asprintf(tmpctx, "%s.%s",
- ldb_dn_escape_value(tmpctx,
- dn->components[i].value),
- cracked);
- } else {
- cracked = ldb_dn_escape_value(tmpctx,
- dn->components[i].value);
- }
- if (!cracked) {
- goto done;
- }
- }
-
- /* Only domain components? Finish here */
- if (i == (unsigned int) -1) {
- cracked = talloc_strdup_append_buffer(cracked, format);
- talloc_steal(mem_ctx, cracked);
- goto done;
- }
-
- /* Now walk backwards appending remaining components */
- for (; i > 0; i--) {
- cracked = talloc_asprintf_append_buffer(cracked, "/%s",
- ldb_dn_escape_value(tmpctx,
- dn->components[i].value));
- if (!cracked) {
- goto done;
- }
- }
-
- /* Last one, possibly a newline for the 'ex' format */
- cracked = talloc_asprintf_append_buffer(cracked, "%s%s", format,
- ldb_dn_escape_value(tmpctx,
- dn->components[i].value));
-
- talloc_steal(mem_ctx, cracked);
-done:
- talloc_free(tmpctx);
- return cracked;
-}
-
-/* Wrapper functions for the above, for the two different string formats */
-char *ldb_dn_canonical_string(TALLOC_CTX *mem_ctx, struct ldb_dn *dn) {
- return ldb_dn_canonical(mem_ctx, dn, 0);
-
-}
-
-char *ldb_dn_canonical_ex_string(TALLOC_CTX *mem_ctx, struct ldb_dn *dn) {
- return ldb_dn_canonical(mem_ctx, dn, 1);
-}
-
-int ldb_dn_get_comp_num(struct ldb_dn *dn)
-{
- if ( ! ldb_dn_validate(dn)) {
- return -1;
- }
- return dn->comp_num;
-}
-
-int ldb_dn_get_extended_comp_num(struct ldb_dn *dn)
-{
- if ( ! ldb_dn_validate(dn)) {
- return -1;
- }
- return dn->ext_comp_num;
-}
-
-const char *ldb_dn_get_component_name(struct ldb_dn *dn, unsigned int num)
-{
- if ( ! ldb_dn_validate(dn)) {
- return NULL;
- }
- if (num >= dn->comp_num) return NULL;
- return dn->components[num].name;
-}
-
-const struct ldb_val *ldb_dn_get_component_val(struct ldb_dn *dn,
- unsigned int num)
-{
- if ( ! ldb_dn_validate(dn)) {
- return NULL;
- }
- if (num >= dn->comp_num) return NULL;
- return &dn->components[num].value;
-}
-
-const char *ldb_dn_get_rdn_name(struct ldb_dn *dn)
-{
- if ( ! ldb_dn_validate(dn)) {
- return NULL;
- }
- if (dn->comp_num == 0) return NULL;
- return dn->components[0].name;
-}
-
-const struct ldb_val *ldb_dn_get_rdn_val(struct ldb_dn *dn)
-{
- if ( ! ldb_dn_validate(dn)) {
- return NULL;
- }
- if (dn->comp_num == 0) return NULL;
- return &dn->components[0].value;
-}
-
-int ldb_dn_set_component(struct ldb_dn *dn, int num,
- const char *name, const struct ldb_val val)
-{
- char *n;
- struct ldb_val v;
-
- if ( ! ldb_dn_validate(dn)) {
- return LDB_ERR_OTHER;
- }
-
- if (num >= dn->comp_num) {
- return LDB_ERR_OTHER;
- }
-
- n = talloc_strdup(dn, name);
- if ( ! n) {
- return LDB_ERR_OTHER;
- }
-
- v.length = val.length;
- v.data = (uint8_t *)talloc_memdup(dn, val.data, v.length+1);
- if ( ! v.data) {
- talloc_free(n);
- return LDB_ERR_OTHER;
- }
-
- talloc_free(dn->components[num].name);
- talloc_free(dn->components[num].value.data);
- dn->components[num].name = n;
- dn->components[num].value = v;
-
- if (dn->valid_case) {
- unsigned int i;
- for (i = 0; i < dn->comp_num; i++) {
- LDB_FREE(dn->components[i].cf_name);
- LDB_FREE(dn->components[i].cf_value.data);
- }
- dn->valid_case = false;
- }
- LDB_FREE(dn->casefold);
- LDB_FREE(dn->linearized);
-
- /* Wipe the ext_linearized DN,
- * the GUID and SID are almost certainly no longer valid */
- LDB_FREE(dn->ext_linearized);
- LDB_FREE(dn->ext_components);
- dn->ext_comp_num = 0;
-
- return LDB_SUCCESS;
-}
-
-const struct ldb_val *ldb_dn_get_extended_component(struct ldb_dn *dn,
- const char *name)
-{
- unsigned int i;
- if ( ! ldb_dn_validate(dn)) {
- return NULL;
- }
- for (i=0; i < dn->ext_comp_num; i++) {
- if (ldb_attr_cmp(dn->ext_components[i].name, name) == 0) {
- return &dn->ext_components[i].value;
- }
- }
- return NULL;
-}
-
-int ldb_dn_set_extended_component(struct ldb_dn *dn,
- const char *name, const struct ldb_val *val)
-{
- struct ldb_dn_ext_component *p;
- unsigned int i;
- struct ldb_val v2;
-
- if ( ! ldb_dn_validate(dn)) {
- return LDB_ERR_OTHER;
- }
-
- if (!ldb_dn_extended_syntax_by_name(dn->ldb, name)) {
- /* We don't know how to handle this type of thing */
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- for (i=0; i < dn->ext_comp_num; i++) {
- if (ldb_attr_cmp(dn->ext_components[i].name, name) == 0) {
- if (val) {
- dn->ext_components[i].value =
- ldb_val_dup(dn->ext_components, val);
-
- dn->ext_components[i].name =
- talloc_strdup(dn->ext_components, name);
- if (!dn->ext_components[i].name ||
- !dn->ext_components[i].value.data) {
- ldb_dn_mark_invalid(dn);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- } else {
- if (i != (dn->ext_comp_num - 1)) {
- memmove(&dn->ext_components[i],
- &dn->ext_components[i+1],
- ((dn->ext_comp_num-1) - i) *
- sizeof(*dn->ext_components));
- }
- dn->ext_comp_num--;
-
- dn->ext_components = talloc_realloc(dn,
- dn->ext_components,
- struct ldb_dn_ext_component,
- dn->ext_comp_num);
- if (!dn->ext_components) {
- ldb_dn_mark_invalid(dn);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
- LDB_FREE(dn->ext_linearized);
-
- return LDB_SUCCESS;
- }
- }
-
- if (val == NULL) {
- /* removing a value that doesn't exist is not an error */
- return LDB_SUCCESS;
- }
-
- v2 = *val;
-
- p = dn->ext_components
- = talloc_realloc(dn,
- dn->ext_components,
- struct ldb_dn_ext_component,
- dn->ext_comp_num + 1);
- if (!dn->ext_components) {
- ldb_dn_mark_invalid(dn);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- p[dn->ext_comp_num].value = ldb_val_dup(dn->ext_components, &v2);
- p[dn->ext_comp_num].name = talloc_strdup(p, name);
-
- if (!dn->ext_components[i].name || !dn->ext_components[i].value.data) {
- ldb_dn_mark_invalid(dn);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- dn->ext_components = p;
- dn->ext_comp_num++;
-
- LDB_FREE(dn->ext_linearized);
-
- return LDB_SUCCESS;
-}
-
-void ldb_dn_remove_extended_components(struct ldb_dn *dn)
-{
- LDB_FREE(dn->ext_linearized);
- LDB_FREE(dn->ext_components);
- dn->ext_comp_num = 0;
-}
-
-bool ldb_dn_is_valid(struct ldb_dn *dn)
-{
- if ( ! dn) return false;
- return ! dn->invalid;
-}
-
-bool ldb_dn_is_special(struct ldb_dn *dn)
-{
- if ( ! dn || dn->invalid) return false;
- return dn->special;
-}
-
-bool ldb_dn_has_extended(struct ldb_dn *dn)
-{
- if ( ! dn || dn->invalid) return false;
- if (dn->ext_linearized && (dn->ext_linearized[0] == '<')) return true;
- return dn->ext_comp_num != 0;
-}
-
-bool ldb_dn_check_special(struct ldb_dn *dn, const char *check)
-{
- if ( ! dn || dn->invalid) return false;
- return ! strcmp(dn->linearized, check);
-}
-
-bool ldb_dn_is_null(struct ldb_dn *dn)
-{
- if ( ! dn || dn->invalid) return false;
- if (ldb_dn_has_extended(dn)) return false;
- if (dn->linearized && (dn->linearized[0] == '\0')) return true;
- return false;
-}
-
-/*
- this updates dn->components, taking the components from ref_dn.
- This is used by code that wants to update the DN path of a DN
- while not impacting on the extended DN components
- */
-int ldb_dn_update_components(struct ldb_dn *dn, const struct ldb_dn *ref_dn)
-{
- dn->components = talloc_realloc(dn, dn->components,
- struct ldb_dn_component, ref_dn->comp_num);
- if (!dn->components) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- memcpy(dn->components, ref_dn->components,
- sizeof(struct ldb_dn_component)*ref_dn->comp_num);
- dn->comp_num = ref_dn->comp_num;
-
- LDB_FREE(dn->casefold);
- LDB_FREE(dn->linearized);
- LDB_FREE(dn->ext_linearized);
-
- return LDB_SUCCESS;
-}
-
-/*
- minimise a DN. The caller must pass in a validated DN.
-
- If the DN has an extended component then only the first extended
- component is kept, the DN string is stripped.
-
- The existing dn is modified
- */
-bool ldb_dn_minimise(struct ldb_dn *dn)
-{
- unsigned int i;
-
- if (!ldb_dn_validate(dn)) {
- return false;
- }
- if (dn->ext_comp_num == 0) {
- return true;
- }
-
- /* free components */
- for (i = 0; i < dn->comp_num; i++) {
- LDB_FREE(dn->components[i].name);
- LDB_FREE(dn->components[i].value.data);
- LDB_FREE(dn->components[i].cf_name);
- LDB_FREE(dn->components[i].cf_value.data);
- }
- dn->comp_num = 0;
- dn->valid_case = false;
-
- LDB_FREE(dn->casefold);
- LDB_FREE(dn->linearized);
-
- /* note that we don't free dn->components as this there are
- * several places in ldb_dn.c that rely on it being non-NULL
- * for an exploded DN
- */
-
- for (i = 1; i < dn->ext_comp_num; i++) {
- LDB_FREE(dn->ext_components[i].name);
- LDB_FREE(dn->ext_components[i].value.data);
- }
- dn->ext_comp_num = 1;
-
- dn->ext_components = talloc_realloc(dn, dn->ext_components, struct ldb_dn_ext_component, 1);
- if (dn->ext_components == NULL) {
- ldb_dn_mark_invalid(dn);
- return false;
- }
-
- LDB_FREE(dn->ext_linearized);
-
- return true;
-}
diff --git a/source4/lib/ldb/common/ldb_ldif.c b/source4/lib/ldb/common/ldb_ldif.c
deleted file mode 100644
index 63b797c4f3..0000000000
--- a/source4/lib/ldb/common/ldb_ldif.c
+++ /dev/null
@@ -1,1026 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldif routines
- *
- * Description: ldif pack/unpack routines
- *
- * Author: Andrew Tridgell
- */
-
-/*
- see RFC2849 for the LDIF format definition
-*/
-
-#include "ldb_private.h"
-#include "system/locale.h"
-
-/*
-
-*/
-static int ldb_read_data_file(TALLOC_CTX *mem_ctx, struct ldb_val *value)
-{
- struct stat statbuf;
- char *buf;
- int count, size, bytes;
- int ret;
- int f;
- const char *fname = (const char *)value->data;
-
- if (strncmp(fname, "file://", 7) != 0) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- fname += 7;
-
- f = open(fname, O_RDONLY);
- if (f == -1) {
- return -1;
- }
-
- if (fstat(f, &statbuf) != 0) {
- ret = -1;
- goto done;
- }
-
- if (statbuf.st_size == 0) {
- ret = -1;
- goto done;
- }
-
- value->data = (uint8_t *)talloc_size(mem_ctx, statbuf.st_size + 1);
- if (value->data == NULL) {
- ret = -1;
- goto done;
- }
- value->data[statbuf.st_size] = 0;
-
- count = 0;
- size = statbuf.st_size;
- buf = (char *)value->data;
- while (count < statbuf.st_size) {
- bytes = read(f, buf, size);
- if (bytes == -1) {
- talloc_free(value->data);
- ret = -1;
- goto done;
- }
- count += bytes;
- buf += bytes;
- size -= bytes;
- }
-
- value->length = statbuf.st_size;
- ret = statbuf.st_size;
-
-done:
- close(f);
- return ret;
-}
-
-/*
- this base64 decoder was taken from jitterbug (written by tridge).
- we might need to replace it with a new version
-*/
-int ldb_base64_decode(char *s)
-{
- const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- int bit_offset=0, byte_offset, idx, i, n;
- uint8_t *d = (uint8_t *)s;
- char *p=NULL;
-
- n=i=0;
-
- while (*s && (p=strchr(b64,*s))) {
- idx = (int)(p - b64);
- byte_offset = (i*6)/8;
- bit_offset = (i*6)%8;
- d[byte_offset] &= ~((1<<(8-bit_offset))-1);
- if (bit_offset < 3) {
- d[byte_offset] |= (idx << (2-bit_offset));
- n = byte_offset+1;
- } else {
- d[byte_offset] |= (idx >> (bit_offset-2));
- d[byte_offset+1] = 0;
- d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF;
- n = byte_offset+2;
- }
- s++; i++;
- }
- if (bit_offset >= 3) {
- n--;
- }
-
- if (*s && !p) {
- /* the only termination allowed */
- if (*s != '=') {
- return -1;
- }
- }
-
- /* null terminate */
- d[n] = 0;
- return n;
-}
-
-
-/*
- encode as base64
- caller frees
-*/
-char *ldb_base64_encode(TALLOC_CTX *mem_ctx, const char *buf, int len)
-{
- const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- int bit_offset, byte_offset, idx, i;
- const uint8_t *d = (const uint8_t *)buf;
- int bytes = (len*8 + 5)/6, pad_bytes = (bytes % 4) ? 4 - (bytes % 4) : 0;
- char *out;
-
- out = talloc_array(mem_ctx, char, bytes+pad_bytes+1);
- if (!out) return NULL;
-
- for (i=0;i<bytes;i++) {
- byte_offset = (i*6)/8;
- bit_offset = (i*6)%8;
- if (bit_offset < 3) {
- idx = (d[byte_offset] >> (2-bit_offset)) & 0x3F;
- } else {
- idx = (d[byte_offset] << (bit_offset-2)) & 0x3F;
- if (byte_offset+1 < len) {
- idx |= (d[byte_offset+1] >> (8-(bit_offset-2)));
- }
- }
- out[i] = b64[idx];
- }
-
- for (;i<bytes+pad_bytes;i++)
- out[i] = '=';
- out[i] = 0;
-
- return out;
-}
-
-/*
- see if a buffer should be base64 encoded
-*/
-int ldb_should_b64_encode(struct ldb_context *ldb, const struct ldb_val *val)
-{
- unsigned int i;
- uint8_t *p = val->data;
-
- if (val->length == 0) {
- return 0;
- }
-
- if (p[0] == ' ' || p[0] == ':') {
- return 1;
- }
-
- for (i=0; i<val->length; i++) {
- if (!isprint(p[i]) || p[i] == '\n') {
- return 1;
- }
- }
- return 0;
-}
-
-/* this macro is used to handle the return checking on fprintf_fn() */
-#define CHECK_RET do { if (ret < 0) return ret; total += ret; } while (0)
-
-/*
- write a line folded string onto a file
-*/
-static int fold_string(int (*fprintf_fn)(void *, const char *, ...), void *private_data,
- const char *buf, size_t length, int start_pos)
-{
- size_t i;
- int total=0, ret;
-
- for (i=0;i<length;i++) {
- ret = fprintf_fn(private_data, "%c", buf[i]);
- CHECK_RET;
- if (i != (length-1) && (i + start_pos) % 77 == 0) {
- ret = fprintf_fn(private_data, "\n ");
- CHECK_RET;
- }
- }
-
- return total;
-}
-
-#undef CHECK_RET
-
-/*
- encode as base64 to a file
-*/
-static int base64_encode_f(struct ldb_context *ldb,
- int (*fprintf_fn)(void *, const char *, ...),
- void *private_data,
- const char *buf, int len, int start_pos)
-{
- char *b = ldb_base64_encode(ldb, buf, len);
- int ret;
-
- if (!b) {
- return -1;
- }
-
- ret = fold_string(fprintf_fn, private_data, b, strlen(b), start_pos);
-
- talloc_free(b);
- return ret;
-}
-
-
-static const struct {
- const char *name;
- enum ldb_changetype changetype;
-} ldb_changetypes[] = {
- {"add", LDB_CHANGETYPE_ADD},
- {"delete", LDB_CHANGETYPE_DELETE},
- {"modify", LDB_CHANGETYPE_MODIFY},
- {"modrdn", LDB_CHANGETYPE_MODRDN},
- {"moddn", LDB_CHANGETYPE_MODRDN},
- {NULL, 0}
-};
-
-/* this macro is used to handle the return checking on fprintf_fn() */
-#define CHECK_RET do { if (ret < 0) { talloc_free(mem_ctx); return ret; } total += ret; } while (0)
-
-/*
- write to ldif, using a caller supplied write method
-*/
-int ldb_ldif_write(struct ldb_context *ldb,
- int (*fprintf_fn)(void *, const char *, ...),
- void *private_data,
- const struct ldb_ldif *ldif)
-{
- TALLOC_CTX *mem_ctx;
- unsigned int i, j;
- int total=0, ret;
- char *p;
- const struct ldb_message *msg;
-
- mem_ctx = talloc_named_const(NULL, 0, "ldb_ldif_write");
-
- msg = ldif->msg;
- p = ldb_dn_get_extended_linearized(mem_ctx, msg->dn, 1);
- ret = fprintf_fn(private_data, "dn: %s\n", p);
- talloc_free(p);
- CHECK_RET;
-
- if (ldif->changetype != LDB_CHANGETYPE_NONE) {
- for (i=0;ldb_changetypes[i].name;i++) {
- if (ldb_changetypes[i].changetype == ldif->changetype) {
- break;
- }
- }
- if (!ldb_changetypes[i].name) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Error: Invalid ldif changetype %d",
- ldif->changetype);
- talloc_free(mem_ctx);
- return -1;
- }
- ret = fprintf_fn(private_data, "changetype: %s\n", ldb_changetypes[i].name);
- CHECK_RET;
- }
-
- for (i=0;i<msg->num_elements;i++) {
- const struct ldb_schema_attribute *a;
-
- a = ldb_schema_attribute_by_name(ldb, msg->elements[i].name);
-
- if (ldif->changetype == LDB_CHANGETYPE_MODIFY) {
- switch (msg->elements[i].flags & LDB_FLAG_MOD_MASK) {
- case LDB_FLAG_MOD_ADD:
- fprintf_fn(private_data, "add: %s\n",
- msg->elements[i].name);
- break;
- case LDB_FLAG_MOD_DELETE:
- fprintf_fn(private_data, "delete: %s\n",
- msg->elements[i].name);
- break;
- case LDB_FLAG_MOD_REPLACE:
- fprintf_fn(private_data, "replace: %s\n",
- msg->elements[i].name);
- break;
- }
- }
-
- for (j=0;j<msg->elements[i].num_values;j++) {
- struct ldb_val v;
- bool use_b64_encode;
- ret = a->syntax->ldif_write_fn(ldb, mem_ctx, &msg->elements[i].values[j], &v);
- if (ret != LDB_SUCCESS) {
- v = msg->elements[i].values[j];
- }
- use_b64_encode = !(ldb->flags & LDB_FLG_SHOW_BINARY)
- && ldb_should_b64_encode(ldb, &v);
- if (ret != LDB_SUCCESS || use_b64_encode) {
- ret = fprintf_fn(private_data, "%s:: ",
- msg->elements[i].name);
- CHECK_RET;
- ret = base64_encode_f(ldb, fprintf_fn, private_data,
- (char *)v.data, v.length,
- strlen(msg->elements[i].name)+3);
- CHECK_RET;
- ret = fprintf_fn(private_data, "\n");
- CHECK_RET;
- } else {
- ret = fprintf_fn(private_data, "%s: ", msg->elements[i].name);
- CHECK_RET;
- if (ldb->flags & LDB_FLG_SHOW_BINARY) {
- ret = fprintf_fn(private_data, "%*.*s",
- v.length, v.length, (char *)v.data);
- } else {
- ret = fold_string(fprintf_fn, private_data,
- (char *)v.data, v.length,
- strlen(msg->elements[i].name)+2);
- }
- CHECK_RET;
- ret = fprintf_fn(private_data, "\n");
- CHECK_RET;
- }
- if (v.data != msg->elements[i].values[j].data) {
- talloc_free(v.data);
- }
- }
- if (ldif->changetype == LDB_CHANGETYPE_MODIFY) {
- fprintf_fn(private_data, "-\n");
- }
- }
- ret = fprintf_fn(private_data,"\n");
- CHECK_RET;
-
- talloc_free(mem_ctx);
-
- return total;
-}
-
-#undef CHECK_RET
-
-
-/*
- pull a ldif chunk, which is defined as a piece of data ending in \n\n or EOF
- this routine removes any RFC2849 continuations and comments
-
- caller frees
-*/
-static char *next_chunk(struct ldb_context *ldb,
- int (*fgetc_fn)(void *), void *private_data)
-{
- size_t alloc_size=0, chunk_size = 0;
- char *chunk = NULL;
- int c;
- int in_comment = 0;
-
- while ((c = fgetc_fn(private_data)) != EOF) {
- if (chunk_size+1 >= alloc_size) {
- char *c2;
- alloc_size += 1024;
- c2 = talloc_realloc(ldb, chunk, char, alloc_size);
- if (!c2) {
- talloc_free(chunk);
- errno = ENOMEM;
- return NULL;
- }
- chunk = c2;
- }
-
- if (in_comment) {
- if (c == '\n') {
- in_comment = 0;
- }
- continue;
- }
-
- /* handle continuation lines - see RFC2849 */
- if (c == ' ' && chunk_size > 1 && chunk[chunk_size-1] == '\n') {
- chunk_size--;
- continue;
- }
-
- /* chunks are terminated by a double line-feed */
- if (c == '\n' && chunk_size > 0 && chunk[chunk_size-1] == '\n') {
- chunk[chunk_size-1] = 0;
- return chunk;
- }
-
- if (c == '#' && (chunk_size == 0 || chunk[chunk_size-1] == '\n')) {
- in_comment = 1;
- continue;
- }
-
- /* ignore leading blank lines */
- if (chunk_size == 0 && c == '\n') {
- continue;
- }
-
- chunk[chunk_size++] = c;
- }
-
- if (chunk) {
- chunk[chunk_size] = 0;
- }
-
- return chunk;
-}
-
-
-/* simple ldif attribute parser */
-static int next_attr(TALLOC_CTX *mem_ctx, char **s, const char **attr, struct ldb_val *value)
-{
- char *p;
- int base64_encoded = 0;
- int binary_file = 0;
-
- if (strncmp(*s, "-\n", 2) == 0) {
- value->length = 0;
- *attr = "-";
- *s += 2;
- return 0;
- }
-
- p = strchr(*s, ':');
- if (!p) {
- return -1;
- }
-
- *p++ = 0;
-
- if (*p == ':') {
- base64_encoded = 1;
- p++;
- }
-
- if (*p == '<') {
- binary_file = 1;
- p++;
- }
-
- *attr = *s;
-
- while (*p == ' ' || *p == '\t') {
- p++;
- }
-
- value->data = (uint8_t *)p;
-
- p = strchr(p, '\n');
-
- if (!p) {
- value->length = strlen((char *)value->data);
- *s = ((char *)value->data) + value->length;
- } else {
- value->length = p - (char *)value->data;
- *s = p+1;
- *p = 0;
- }
-
- if (base64_encoded) {
- int len = ldb_base64_decode((char *)value->data);
- if (len == -1) {
- /* it wasn't valid base64 data */
- return -1;
- }
- value->length = len;
- }
-
- if (binary_file) {
- int len = ldb_read_data_file(mem_ctx, value);
- if (len == -1) {
- /* an error occurred while trying to retrieve the file */
- return -1;
- }
- }
-
- return 0;
-}
-
-
-/*
- free a message from a ldif_read
-*/
-void ldb_ldif_read_free(struct ldb_context *ldb, struct ldb_ldif *ldif)
-{
- talloc_free(ldif);
-}
-
-int ldb_ldif_parse_modrdn(struct ldb_context *ldb,
- const struct ldb_ldif *ldif,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn **_olddn,
- struct ldb_dn **_newrdn,
- bool *_deleteoldrdn,
- struct ldb_dn **_newsuperior,
- struct ldb_dn **_newdn)
-{
- struct ldb_message *msg = ldif->msg;
- struct ldb_val *newrdn_val = NULL;
- struct ldb_val *deleteoldrdn_val = NULL;
- struct ldb_val *newsuperior_val = NULL;
- struct ldb_dn *olddn = NULL;
- struct ldb_dn *newrdn = NULL;
- bool deleteoldrdn = true;
- struct ldb_dn *newsuperior = NULL;
- struct ldb_dn *newdn = NULL;
- struct ldb_val tmp_false;
- struct ldb_val tmp_true;
- bool ok;
- TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
-
- if (tmp_ctx == NULL) {
- ldb_debug(ldb, LDB_DEBUG_FATAL,
- "Error: talloc_new() failed");
- goto err_op;
- }
-
- if (ldif->changetype != LDB_CHANGETYPE_MODRDN) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: invalid changetype '%d'",
- ldif->changetype);
- goto err_other;
- }
-
- if (msg->num_elements < 2) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: num_elements[%u] < 2",
- msg->num_elements);
- goto err_other;
- }
-
- if (msg->num_elements > 3) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: num_elements[%u] > 3",
- msg->num_elements);
- goto err_other;
- }
-
-#define CHECK_ELEMENT(i, _name, v, needed) do { \
- v = NULL; \
- if (msg->num_elements < (i + 1)) { \
- if (needed) { \
- ldb_debug(ldb, LDB_DEBUG_ERROR, \
- "Error: num_elements[%u] < (%u + 1)", \
- msg->num_elements, i); \
- goto err_other; \
- } \
- } else if (ldb_attr_cmp(msg->elements[i].name, _name) != 0) { \
- ldb_debug(ldb, LDB_DEBUG_ERROR, \
- "Error: elements[%u].name[%s] != [%s]", \
- i, msg->elements[i].name, _name); \
- goto err_other; \
- } else if (msg->elements[i].flags != 0) { \
- ldb_debug(ldb, LDB_DEBUG_ERROR, \
- "Error: elements[%u].flags[0x%X} != [0x0]", \
- i, msg->elements[i].flags); \
- goto err_other; \
- } else if (msg->elements[i].num_values != 1) { \
- ldb_debug(ldb, LDB_DEBUG_ERROR, \
- "Error: elements[%u].num_values[%u] != 1", \
- i, msg->elements[i].num_values); \
- goto err_other; \
- } else { \
- v = &msg->elements[i].values[0]; \
- } \
-} while (0)
-
- CHECK_ELEMENT(0, "newrdn", newrdn_val, true);
- CHECK_ELEMENT(1, "deleteoldrdn", deleteoldrdn_val, true);
- CHECK_ELEMENT(2, "newsuperior", newsuperior_val, false);
-
-#undef CHECK_ELEMENT
-
- olddn = ldb_dn_copy(tmp_ctx, msg->dn);
- if (olddn == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: failed to copy olddn '%s'",
- ldb_dn_get_linearized(msg->dn));
- goto err_op;
- }
-
- newrdn = ldb_dn_from_ldb_val(tmp_ctx, ldb, newrdn_val);
- if (!ldb_dn_validate(newrdn)) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: Unable to parse dn '%s'",
- (char *)newrdn_val->data);
- goto err_dn;
- }
-
- tmp_false.length = 1;
- tmp_false.data = discard_const_p(uint8_t, "0");
- tmp_true.length = 1;
- tmp_true.data = discard_const_p(uint8_t, "1");
- if (ldb_val_equal_exact(deleteoldrdn_val, &tmp_false) == 1) {
- deleteoldrdn = false;
- } else if (ldb_val_equal_exact(deleteoldrdn_val, &tmp_true) == 1) {
- deleteoldrdn = true;
- } else {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: deleteoldrdn value invalid '%s' not '0'/'1'",
- (char *)deleteoldrdn_val->data);
- goto err_attr;
- }
-
- if (newsuperior_val) {
- newsuperior = ldb_dn_from_ldb_val(tmp_ctx, ldb, newsuperior_val);
- if (!ldb_dn_validate(newsuperior)) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: Unable to parse dn '%s'",
- (char *)newsuperior_val->data);
- goto err_dn;
- }
- } else {
- newsuperior = ldb_dn_get_parent(tmp_ctx, msg->dn);
- if (newsuperior == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: Unable to get parent dn '%s'",
- ldb_dn_get_linearized(msg->dn));
- goto err_dn;
- }
- }
-
- newdn = ldb_dn_copy(tmp_ctx, newrdn);
- if (newdn == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: failed to copy newrdn '%s'",
- ldb_dn_get_linearized(newrdn));
- goto err_op;
- }
-
- ok = ldb_dn_add_base(newdn, newsuperior);
- if (!ok) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: failed to base '%s' to newdn '%s'",
- ldb_dn_get_linearized(newsuperior),
- ldb_dn_get_linearized(newdn));
- goto err_op;
- }
-
- if (_olddn) {
- *_olddn = talloc_move(mem_ctx, &olddn);
- }
- if (_newrdn) {
- *_newrdn = talloc_move(mem_ctx, &newrdn);
- }
- if (_deleteoldrdn) {
- *_deleteoldrdn = deleteoldrdn;
- }
- if (_newsuperior) {
- if (newsuperior_val) {
- *_newrdn = talloc_move(mem_ctx, &newrdn);
- } else {
- *_newrdn = NULL;
- }
- }
- if (_newdn) {
- *_newdn = talloc_move(mem_ctx, &newdn);
- }
-
- talloc_free(tmp_ctx);
- return LDB_SUCCESS;
-err_other:
- talloc_free(tmp_ctx);
- return LDB_ERR_OTHER;
-err_op:
- talloc_free(tmp_ctx);
- return LDB_ERR_OPERATIONS_ERROR;
-err_attr:
- talloc_free(tmp_ctx);
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
-err_dn:
- talloc_free(tmp_ctx);
- return LDB_ERR_INVALID_DN_SYNTAX;
-}
-
-/*
- read from a LDIF source, creating a ldb_message
-*/
-struct ldb_ldif *ldb_ldif_read(struct ldb_context *ldb,
- int (*fgetc_fn)(void *), void *private_data)
-{
- struct ldb_ldif *ldif;
- struct ldb_message *msg;
- const char *attr=NULL;
- char *chunk=NULL, *s;
- struct ldb_val value;
- unsigned flags = 0;
-
- value.data = NULL;
-
- ldif = talloc(ldb, struct ldb_ldif);
- if (!ldif) return NULL;
-
- ldif->msg = talloc(ldif, struct ldb_message);
- if (ldif->msg == NULL) {
- talloc_free(ldif);
- return NULL;
- }
-
- ldif->changetype = LDB_CHANGETYPE_NONE;
- msg = ldif->msg;
-
- msg->dn = NULL;
- msg->elements = NULL;
- msg->num_elements = 0;
-
- chunk = next_chunk(ldb, fgetc_fn, private_data);
- if (!chunk) {
- goto failed;
- }
- talloc_steal(ldif, chunk);
-
- s = chunk;
-
- if (next_attr(ldif, &s, &attr, &value) != 0) {
- goto failed;
- }
-
- /* first line must be a dn */
- if (ldb_attr_cmp(attr, "dn") != 0) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Error: First line of ldif must be a dn not '%s'",
- attr);
- goto failed;
- }
-
- msg->dn = ldb_dn_from_ldb_val(msg, ldb, &value);
-
- if ( ! ldb_dn_validate(msg->dn)) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Error: Unable to parse dn '%s'",
- (char *)value.data);
- goto failed;
- }
-
- while (next_attr(ldif, &s, &attr, &value) == 0) {
- const struct ldb_schema_attribute *a;
- struct ldb_message_element *el;
- int ret, empty = 0;
-
- if (ldb_attr_cmp(attr, "changetype") == 0) {
- int i;
- for (i=0;ldb_changetypes[i].name;i++) {
- if (ldb_attr_cmp((char *)value.data, ldb_changetypes[i].name) == 0) {
- ldif->changetype = ldb_changetypes[i].changetype;
- break;
- }
- }
- if (!ldb_changetypes[i].name) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: Bad ldif changetype '%s'",(char *)value.data);
- }
- flags = 0;
- continue;
- }
-
- if (ldb_attr_cmp(attr, "add") == 0) {
- flags = LDB_FLAG_MOD_ADD;
- empty = 1;
- }
- if (ldb_attr_cmp(attr, "delete") == 0) {
- flags = LDB_FLAG_MOD_DELETE;
- empty = 1;
- }
- if (ldb_attr_cmp(attr, "replace") == 0) {
- flags = LDB_FLAG_MOD_REPLACE;
- empty = 1;
- }
- if (ldb_attr_cmp(attr, "-") == 0) {
- flags = 0;
- continue;
- }
-
- if (empty) {
- if (ldb_msg_add_empty(msg, (char *)value.data, flags, NULL) != 0) {
- goto failed;
- }
- continue;
- }
-
- el = &msg->elements[msg->num_elements-1];
-
- a = ldb_schema_attribute_by_name(ldb, attr);
-
- if (msg->num_elements > 0 && ldb_attr_cmp(attr, el->name) == 0 &&
- flags == el->flags) {
- /* its a continuation */
- el->values =
- talloc_realloc(msg->elements, el->values,
- struct ldb_val, el->num_values+1);
- if (!el->values) {
- goto failed;
- }
- ret = a->syntax->ldif_read_fn(ldb, el->values, &value, &el->values[el->num_values]);
- if (ret != 0) {
- goto failed;
- }
- if (value.length == 0) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: Attribute value cannot be empty for attribute '%s'", el->name);
- goto failed;
- }
- if (value.data != el->values[el->num_values].data) {
- talloc_steal(el->values, el->values[el->num_values].data);
- }
- el->num_values++;
- } else {
- /* its a new attribute */
- msg->elements = talloc_realloc(msg, msg->elements,
- struct ldb_message_element,
- msg->num_elements+1);
- if (!msg->elements) {
- goto failed;
- }
- el = &msg->elements[msg->num_elements];
- el->flags = flags;
- el->name = talloc_strdup(msg->elements, attr);
- el->values = talloc(msg->elements, struct ldb_val);
- if (!el->values || !el->name) {
- goto failed;
- }
- el->num_values = 1;
- ret = a->syntax->ldif_read_fn(ldb, el->values, &value, &el->values[0]);
- if (ret != 0) {
- goto failed;
- }
- if (value.data != el->values[0].data) {
- talloc_steal(el->values, el->values[0].data);
- }
- msg->num_elements++;
- }
- }
-
- if (ldif->changetype == LDB_CHANGETYPE_MODRDN) {
- int ret;
-
- ret = ldb_ldif_parse_modrdn(ldb, ldif, ldif,
- NULL, NULL, NULL, NULL, NULL);
- if (ret != LDB_SUCCESS) {
- goto failed;
- }
- }
-
- return ldif;
-
-failed:
- talloc_free(ldif);
- return NULL;
-}
-
-
-
-/*
- a wrapper around ldif_read() for reading from FILE*
-*/
-struct ldif_read_file_state {
- FILE *f;
-};
-
-static int fgetc_file(void *private_data)
-{
- struct ldif_read_file_state *state =
- (struct ldif_read_file_state *)private_data;
- return fgetc(state->f);
-}
-
-struct ldb_ldif *ldb_ldif_read_file(struct ldb_context *ldb, FILE *f)
-{
- struct ldif_read_file_state state;
- state.f = f;
- return ldb_ldif_read(ldb, fgetc_file, &state);
-}
-
-
-/*
- a wrapper around ldif_read() for reading from const char*
-*/
-struct ldif_read_string_state {
- const char *s;
-};
-
-static int fgetc_string(void *private_data)
-{
- struct ldif_read_string_state *state =
- (struct ldif_read_string_state *)private_data;
- if (state->s[0] != 0) {
- return *state->s++;
- }
- return EOF;
-}
-
-struct ldb_ldif *ldb_ldif_read_string(struct ldb_context *ldb, const char **s)
-{
- struct ldif_read_string_state state;
- struct ldb_ldif *ldif;
- state.s = *s;
- ldif = ldb_ldif_read(ldb, fgetc_string, &state);
- *s = state.s;
- return ldif;
-}
-
-
-/*
- wrapper around ldif_write() for a file
-*/
-struct ldif_write_file_state {
- FILE *f;
-};
-
-static int fprintf_file(void *private_data, const char *fmt, ...) PRINTF_ATTRIBUTE(2, 3);
-
-static int fprintf_file(void *private_data, const char *fmt, ...)
-{
- struct ldif_write_file_state *state =
- (struct ldif_write_file_state *)private_data;
- int ret;
- va_list ap;
-
- va_start(ap, fmt);
- ret = vfprintf(state->f, fmt, ap);
- va_end(ap);
- return ret;
-}
-
-int ldb_ldif_write_file(struct ldb_context *ldb, FILE *f, const struct ldb_ldif *ldif)
-{
- struct ldif_write_file_state state;
- state.f = f;
- return ldb_ldif_write(ldb, fprintf_file, &state, ldif);
-}
-
-/*
- wrapper around ldif_write() for a string
-*/
-struct ldif_write_string_state {
- char *string;
-};
-
-static int ldif_printf_string(void *private_data, const char *fmt, ...) PRINTF_ATTRIBUTE(2, 3);
-
-static int ldif_printf_string(void *private_data, const char *fmt, ...)
-{
- struct ldif_write_string_state *state =
- (struct ldif_write_string_state *)private_data;
- va_list ap;
- size_t oldlen = talloc_get_size(state->string);
- va_start(ap, fmt);
-
- state->string = talloc_vasprintf_append(state->string, fmt, ap);
- va_end(ap);
- if (!state->string) {
- return -1;
- }
-
- return talloc_get_size(state->string) - oldlen;
-}
-
-char *ldb_ldif_write_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
- const struct ldb_ldif *ldif)
-{
- struct ldif_write_string_state state;
- state.string = talloc_strdup(mem_ctx, "");
- if (!state.string) {
- return NULL;
- }
- if (ldb_ldif_write(ldb, ldif_printf_string, &state, ldif) == -1) {
- return NULL;
- }
- return state.string;
-}
-
-/*
- convenient function to turn a ldb_message into a string. Useful for
- debugging
- */
-char *ldb_ldif_message_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
- enum ldb_changetype changetype,
- const struct ldb_message *msg)
-{
- struct ldb_ldif ldif;
-
- ldif.changetype = changetype;
- ldif.msg = discard_const_p(struct ldb_message, msg);
-
- return ldb_ldif_write_string(ldb, mem_ctx, &ldif);
-}
diff --git a/source4/lib/ldb/common/ldb_match.c b/source4/lib/ldb/common/ldb_match.c
deleted file mode 100644
index a42cf9449d..0000000000
--- a/source4/lib/ldb/common/ldb_match.c
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004-2005
- Copyright (C) Simo Sorce 2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb expression matching
- *
- * Description: ldb expression matching
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb_private.h"
-
-/*
- check if the scope matches in a search result
-*/
-static int ldb_match_scope(struct ldb_context *ldb,
- struct ldb_dn *base,
- struct ldb_dn *dn,
- enum ldb_scope scope)
-{
- int ret = 0;
-
- if (base == NULL || dn == NULL) {
- return 1;
- }
-
- switch (scope) {
- case LDB_SCOPE_BASE:
- if (ldb_dn_compare(base, dn) == 0) {
- ret = 1;
- }
- break;
-
- case LDB_SCOPE_ONELEVEL:
- if (ldb_dn_get_comp_num(dn) == (ldb_dn_get_comp_num(base) + 1)) {
- if (ldb_dn_compare_base(base, dn) == 0) {
- ret = 1;
- }
- }
- break;
-
- case LDB_SCOPE_SUBTREE:
- default:
- if (ldb_dn_compare_base(base, dn) == 0) {
- ret = 1;
- }
- break;
- }
-
- return ret;
-}
-
-
-/*
- match if node is present
-*/
-static int ldb_match_present(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- enum ldb_scope scope, bool *matched)
-{
- const struct ldb_schema_attribute *a;
- struct ldb_message_element *el;
-
- if (ldb_attr_dn(tree->u.present.attr) == 0) {
- *matched = true;
- return LDB_SUCCESS;
- }
-
- el = ldb_msg_find_element(msg, tree->u.present.attr);
- if (el == NULL) {
- *matched = false;
- return LDB_SUCCESS;
- }
-
- a = ldb_schema_attribute_by_name(ldb, el->name);
- if (!a) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
-
- if (a->syntax->operator_fn) {
- unsigned int i;
- for (i = 0; i < el->num_values; i++) {
- int ret = a->syntax->operator_fn(ldb, LDB_OP_PRESENT, a, &el->values[i], NULL, matched);
- if (ret != LDB_SUCCESS) return ret;
- if (*matched) return LDB_SUCCESS;
- }
- *matched = false;
- return LDB_SUCCESS;
- }
-
- *matched = true;
- return LDB_SUCCESS;
-}
-
-static int ldb_match_comparison(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- enum ldb_scope scope,
- enum ldb_parse_op comp_op, bool *matched)
-{
- unsigned int i;
- struct ldb_message_element *el;
- const struct ldb_schema_attribute *a;
-
- /* FIXME: APPROX comparison not handled yet */
- if (comp_op == LDB_OP_APPROX) {
- return LDB_ERR_INAPPROPRIATE_MATCHING;
- }
-
- el = ldb_msg_find_element(msg, tree->u.comparison.attr);
- if (el == NULL) {
- *matched = false;
- return LDB_SUCCESS;
- }
-
- a = ldb_schema_attribute_by_name(ldb, el->name);
- if (!a) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
-
- for (i = 0; i < el->num_values; i++) {
- if (a->syntax->operator_fn) {
- int ret;
- ret = a->syntax->operator_fn(ldb, comp_op, a, &el->values[i], &tree->u.comparison.value, matched);
- if (ret != LDB_SUCCESS) return ret;
- if (*matched) return LDB_SUCCESS;
- } else {
- int ret = a->syntax->comparison_fn(ldb, ldb, &el->values[i], &tree->u.comparison.value);
-
- if (ret == 0) {
- *matched = true;
- return LDB_SUCCESS;
- }
- if (ret > 0 && comp_op == LDB_OP_GREATER) {
- *matched = true;
- return LDB_SUCCESS;
- }
- if (ret < 0 && comp_op == LDB_OP_LESS) {
- *matched = true;
- return LDB_SUCCESS;
- }
- }
- }
-
- *matched = false;
- return LDB_SUCCESS;
-}
-
-/*
- match a simple leaf node
-*/
-static int ldb_match_equality(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- enum ldb_scope scope,
- bool *matched)
-{
- unsigned int i;
- struct ldb_message_element *el;
- const struct ldb_schema_attribute *a;
- struct ldb_dn *valuedn;
- int ret;
-
- if (ldb_attr_dn(tree->u.equality.attr) == 0) {
- valuedn = ldb_dn_from_ldb_val(ldb, ldb, &tree->u.equality.value);
- if (valuedn == NULL) {
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- ret = ldb_dn_compare(msg->dn, valuedn);
-
- talloc_free(valuedn);
-
- *matched = (ret == 0);
- return LDB_SUCCESS;
- }
-
- /* TODO: handle the "*" case derived from an extended search
- operation without the attibute type defined */
- el = ldb_msg_find_element(msg, tree->u.equality.attr);
- if (el == NULL) {
- *matched = false;
- return LDB_SUCCESS;
- }
-
- a = ldb_schema_attribute_by_name(ldb, el->name);
- if (a == NULL) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
-
- for (i=0;i<el->num_values;i++) {
- if (a->syntax->operator_fn) {
- ret = a->syntax->operator_fn(ldb, LDB_OP_EQUALITY, a,
- &tree->u.equality.value, &el->values[i], matched);
- if (ret != LDB_SUCCESS) return ret;
- if (*matched) return LDB_SUCCESS;
- } else {
- if (a->syntax->comparison_fn(ldb, ldb, &tree->u.equality.value,
- &el->values[i]) == 0) {
- *matched = true;
- return LDB_SUCCESS;
- }
- }
- }
-
- *matched = false;
- return LDB_SUCCESS;
-}
-
-static int ldb_wildcard_compare(struct ldb_context *ldb,
- const struct ldb_parse_tree *tree,
- const struct ldb_val value, bool *matched)
-{
- const struct ldb_schema_attribute *a;
- struct ldb_val val;
- struct ldb_val cnk;
- struct ldb_val *chunk;
- char *p, *g;
- uint8_t *save_p = NULL;
- unsigned int c = 0;
-
- a = ldb_schema_attribute_by_name(ldb, tree->u.substring.attr);
- if (!a) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
-
- if (a->syntax->canonicalise_fn(ldb, ldb, &value, &val) != 0) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
-
- save_p = val.data;
- cnk.data = NULL;
-
- if ( ! tree->u.substring.start_with_wildcard ) {
-
- chunk = tree->u.substring.chunks[c];
- if (a->syntax->canonicalise_fn(ldb, ldb, chunk, &cnk) != 0) goto mismatch;
-
- /* This deals with wildcard prefix searches on binary attributes (eg objectGUID) */
- if (cnk.length > val.length) {
- goto mismatch;
- }
- if (memcmp((char *)val.data, (char *)cnk.data, cnk.length) != 0) goto mismatch;
- val.length -= cnk.length;
- val.data += cnk.length;
- c++;
- talloc_free(cnk.data);
- cnk.data = NULL;
- }
-
- while (tree->u.substring.chunks[c]) {
-
- chunk = tree->u.substring.chunks[c];
- if(a->syntax->canonicalise_fn(ldb, ldb, chunk, &cnk) != 0) goto mismatch;
-
- /* FIXME: case of embedded nulls */
- p = strstr((char *)val.data, (char *)cnk.data);
- if (p == NULL) goto mismatch;
- if ( (! tree->u.substring.chunks[c + 1]) && (! tree->u.substring.end_with_wildcard) ) {
- do { /* greedy */
- g = strstr((char *)p + cnk.length, (char *)cnk.data);
- if (g) p = g;
- } while(g);
- }
- val.length = val.length - (p - (char *)(val.data)) - cnk.length;
- val.data = (uint8_t *)(p + cnk.length);
- c++;
- talloc_free(cnk.data);
- cnk.data = NULL;
- }
-
- /* last chunk may not have reached end of string */
- if ( (! tree->u.substring.end_with_wildcard) && (*(val.data) != 0) ) goto mismatch;
- talloc_free(save_p);
- *matched = true;
- return LDB_SUCCESS;
-
-mismatch:
- *matched = false;
- talloc_free(save_p);
- talloc_free(cnk.data);
- return LDB_SUCCESS;
-}
-
-/*
- match a simple leaf node
-*/
-static int ldb_match_substring(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- enum ldb_scope scope, bool *matched)
-{
- unsigned int i;
- struct ldb_message_element *el;
-
- el = ldb_msg_find_element(msg, tree->u.substring.attr);
- if (el == NULL) {
- *matched = false;
- return LDB_SUCCESS;
- }
-
- for (i = 0; i < el->num_values; i++) {
- int ret;
- ret = ldb_wildcard_compare(ldb, tree, el->values[i], matched);
- if (ret != LDB_SUCCESS) return ret;
- if (*matched) return LDB_SUCCESS;
- }
-
- *matched = false;
- return LDB_SUCCESS;
-}
-
-
-/*
- bitwise-and comparator
-*/
-static int ldb_comparator_bitmask(const char *oid, const struct ldb_val *v1, const struct ldb_val *v2,
- bool *matched)
-{
- uint64_t i1, i2;
- char ibuf[100];
- char *endptr = NULL;
-
- if (v1->length >= sizeof(ibuf)-1) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- memcpy(ibuf, (char *)v1->data, v1->length);
- ibuf[v1->length] = 0;
- i1 = strtoull(ibuf, &endptr, 0);
- if (endptr != NULL) {
- if (endptr == ibuf || *endptr != 0) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- }
-
- if (v2->length >= sizeof(ibuf)-1) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- endptr = NULL;
- memcpy(ibuf, (char *)v2->data, v2->length);
- ibuf[v2->length] = 0;
- i2 = strtoull(ibuf, &endptr, 0);
- if (endptr != NULL) {
- if (endptr == ibuf || *endptr != 0) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- }
- if (strcmp(LDB_OID_COMPARATOR_AND, oid) == 0) {
- *matched = ((i1 & i2) == i2);
- } else if (strcmp(LDB_OID_COMPARATOR_OR, oid) == 0) {
- *matched = ((i1 & i2) != 0);
- } else {
- return LDB_ERR_INAPPROPRIATE_MATCHING;
- }
- return LDB_SUCCESS;
-}
-
-
-/*
- extended match, handles things like bitops
-*/
-static int ldb_match_extended(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- enum ldb_scope scope, bool *matched)
-{
- unsigned int i;
- const struct {
- const char *oid;
- int (*comparator)(const char *, const struct ldb_val *, const struct ldb_val *, bool *);
- } rules[] = {
- { LDB_OID_COMPARATOR_AND, ldb_comparator_bitmask},
- { LDB_OID_COMPARATOR_OR, ldb_comparator_bitmask}
- };
- int (*comp)(const char *,const struct ldb_val *, const struct ldb_val *, bool *) = NULL;
- struct ldb_message_element *el;
-
- if (tree->u.extended.dnAttributes) {
- /* FIXME: We really need to find out what this ":dn" part in
- * an extended match means and how to handle it. For now print
- * only a warning to have s3 winbind and other tools working
- * against us. - Matthias */
- ldb_debug(ldb, LDB_DEBUG_WARNING, "ldb: dnAttributes extended match not supported yet");
- }
- if (tree->u.extended.rule_id == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb: no-rule extended matches not supported yet");
- return LDB_ERR_INAPPROPRIATE_MATCHING;
- }
- if (tree->u.extended.attr == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb: no-attribute extended matches not supported yet");
- return LDB_ERR_INAPPROPRIATE_MATCHING;
- }
-
- for (i=0;i<ARRAY_SIZE(rules);i++) {
- if (strcmp(rules[i].oid, tree->u.extended.rule_id) == 0) {
- comp = rules[i].comparator;
- break;
- }
- }
- if (comp == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb: unknown extended rule_id %s",
- tree->u.extended.rule_id);
- return LDB_ERR_INAPPROPRIATE_MATCHING;
- }
-
- /* find the message element */
- el = ldb_msg_find_element(msg, tree->u.extended.attr);
- if (el == NULL) {
- *matched = false;
- return LDB_SUCCESS;
- }
-
- for (i=0;i<el->num_values;i++) {
- int ret = comp(tree->u.extended.rule_id, &el->values[i], &tree->u.extended.value, matched);
- if (ret != LDB_SUCCESS) return ret;
- if (*matched) return LDB_SUCCESS;
- }
-
- *matched = false;
- return LDB_SUCCESS;
-}
-
-/*
- return 0 if the given parse tree matches the given message. Assumes
- the message is in sorted order
-
- return 1 if it matches, and 0 if it doesn't match
-
- this is a recursive function, and does short-circuit evaluation
- */
-static int ldb_match_message(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- enum ldb_scope scope, bool *matched)
-{
- unsigned int i;
- int ret;
-
- *matched = false;
-
- switch (tree->operation) {
- case LDB_OP_AND:
- for (i=0;i<tree->u.list.num_elements;i++) {
- ret = ldb_match_message(ldb, msg, tree->u.list.elements[i], scope, matched);
- if (ret != LDB_SUCCESS) return ret;
- if (!*matched) return LDB_SUCCESS;
- }
- *matched = true;
- return LDB_SUCCESS;
-
- case LDB_OP_OR:
- for (i=0;i<tree->u.list.num_elements;i++) {
- ret = ldb_match_message(ldb, msg, tree->u.list.elements[i], scope, matched);
- if (ret != LDB_SUCCESS) return ret;
- if (*matched) return LDB_SUCCESS;
- }
- *matched = false;
- return LDB_SUCCESS;
-
- case LDB_OP_NOT:
- ret = ldb_match_message(ldb, msg, tree->u.isnot.child, scope, matched);
- if (ret != LDB_SUCCESS) return ret;
- *matched = ! *matched;
- return LDB_SUCCESS;
-
- case LDB_OP_EQUALITY:
- return ldb_match_equality(ldb, msg, tree, scope, matched);
-
- case LDB_OP_SUBSTRING:
- return ldb_match_substring(ldb, msg, tree, scope, matched);
-
- case LDB_OP_GREATER:
- return ldb_match_comparison(ldb, msg, tree, scope, LDB_OP_GREATER, matched);
-
- case LDB_OP_LESS:
- return ldb_match_comparison(ldb, msg, tree, scope, LDB_OP_LESS, matched);
-
- case LDB_OP_PRESENT:
- return ldb_match_present(ldb, msg, tree, scope, matched);
-
- case LDB_OP_APPROX:
- return ldb_match_comparison(ldb, msg, tree, scope, LDB_OP_APPROX, matched);
-
- case LDB_OP_EXTENDED:
- return ldb_match_extended(ldb, msg, tree, scope, matched);
- }
-
- return LDB_ERR_INAPPROPRIATE_MATCHING;
-}
-
-int ldb_match_msg(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- struct ldb_dn *base,
- enum ldb_scope scope)
-{
- bool matched;
- int ret;
-
- if ( ! ldb_match_scope(ldb, base, msg->dn, scope) ) {
- return 0;
- }
-
- ret = ldb_match_message(ldb, msg, tree, scope, &matched);
- if (ret != LDB_SUCCESS) {
- /* to match the old API, we need to consider this a
- failure to match */
- return 0;
- }
- return matched?1:0;
-}
-
-int ldb_match_msg_error(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- struct ldb_dn *base,
- enum ldb_scope scope,
- bool *matched)
-{
- if ( ! ldb_match_scope(ldb, base, msg->dn, scope) ) {
- *matched = false;
- return LDB_SUCCESS;
- }
-
- return ldb_match_message(ldb, msg, tree, scope, matched);
-}
-
-int ldb_match_msg_objectclass(const struct ldb_message *msg,
- const char *objectclass)
-{
- unsigned int i;
- struct ldb_message_element *el = ldb_msg_find_element(msg, "objectClass");
- if (!el) {
- return 0;
- }
- for (i=0; i < el->num_values; i++) {
- if (ldb_attr_cmp((const char *)el->values[i].data, objectclass) == 0) {
- return 1;
- }
- }
- return 0;
-}
-
-
-
diff --git a/source4/lib/ldb/common/ldb_modules.c b/source4/lib/ldb/common/ldb_modules.c
deleted file mode 100644
index 61d1901513..0000000000
--- a/source4/lib/ldb/common/ldb_modules.c
+++ /dev/null
@@ -1,1146 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2004-2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb modules core
- *
- * Description: core modules routines
- *
- * Author: Simo Sorce
- */
-
-#include "ldb_private.h"
-#include "dlinklist.h"
-#include "system/dir.h"
-
-static char *ldb_modules_strdup_no_spaces(TALLOC_CTX *mem_ctx, const char *string)
-{
- size_t i, len;
- char *trimmed;
-
- trimmed = talloc_strdup(mem_ctx, string);
- if (!trimmed) {
- return NULL;
- }
-
- len = strlen(trimmed);
- for (i = 0; trimmed[i] != '\0'; i++) {
- switch (trimmed[i]) {
- case ' ':
- case '\t':
- case '\n':
- memmove(&trimmed[i], &trimmed[i + 1], len -i -1);
- break;
- }
- }
-
- return trimmed;
-}
-
-
-/* modules are called in inverse order on the stack.
- Lets place them as an admin would think the right order is.
- Modules order is important */
-const char **ldb_modules_list_from_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char *string)
-{
- char **modules = NULL;
- const char **m;
- char *modstr, *p;
- unsigned int i;
-
- /* spaces not admitted */
- modstr = ldb_modules_strdup_no_spaces(mem_ctx, string);
- if ( ! modstr) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "Out of Memory in ldb_modules_strdup_no_spaces()");
- return NULL;
- }
-
- modules = talloc_realloc(mem_ctx, modules, char *, 2);
- if ( ! modules ) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "Out of Memory in ldb_modules_list_from_string()");
- talloc_free(modstr);
- return NULL;
- }
- talloc_steal(modules, modstr);
-
- if (modstr[0] == '\0') {
- modules[0] = NULL;
- m = (const char **)modules;
- return m;
- }
-
- i = 0;
- /* The str*r*chr walks backwards: This is how we get the inverse order mentioned above */
- while ((p = strrchr(modstr, ',')) != NULL) {
- *p = '\0';
- p++;
- modules[i] = p;
-
- i++;
- modules = talloc_realloc(mem_ctx, modules, char *, i + 2);
- if ( ! modules ) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "Out of Memory in ldb_modules_list_from_string()");
- return NULL;
- }
-
- }
- modules[i] = modstr;
-
- modules[i + 1] = NULL;
-
- m = (const char **)modules;
-
- return m;
-}
-
-static struct backends_list_entry {
- struct ldb_backend_ops *ops;
- struct backends_list_entry *prev, *next;
-} *ldb_backends = NULL;
-
-static struct ops_list_entry {
- const struct ldb_module_ops *ops;
- struct ops_list_entry *next;
-} *registered_modules = NULL;
-
-static struct backends_list_entry *ldb_find_backend(const char *url_prefix)
-{
- struct backends_list_entry *backend;
-
- for (backend = ldb_backends; backend; backend = backend->next) {
- if (strcmp(backend->ops->name, url_prefix) == 0) {
- return backend;
- }
- }
-
- return NULL;
-}
-
-/*
- register a new ldb backend
-
- if override is true, then override any existing backend for this prefix
-*/
-int ldb_register_backend(const char *url_prefix, ldb_connect_fn connectfn, bool override)
-{
- struct backends_list_entry *be;
-
- be = ldb_find_backend(url_prefix);
- if (be) {
- if (!override) {
- return LDB_SUCCESS;
- }
- } else {
- be = talloc_zero(ldb_backends, struct backends_list_entry);
- if (!be) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- be->ops = talloc_zero(be, struct ldb_backend_ops);
- if (!be->ops) {
- talloc_free(be);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- DLIST_ADD_END(ldb_backends, be, struct backends_list_entry);
- }
-
- be->ops->name = url_prefix;
- be->ops->connect_fn = connectfn;
-
- return LDB_SUCCESS;
-}
-
-/*
- Return the ldb module form of a database.
- The URL can either be one of the following forms
- ldb://path
- ldapi://path
-
- flags is made up of LDB_FLG_*
-
- the options are passed uninterpreted to the backend, and are
- backend specific.
-
- This allows modules to get at only the backend module, for example where a
- module may wish to direct certain requests at a particular backend.
-*/
-int ldb_module_connect_backend(struct ldb_context *ldb,
- const char *url,
- const char *options[],
- struct ldb_module **backend_module)
-{
- int ret;
- char *backend;
- struct backends_list_entry *be;
-
- if (strchr(url, ':') != NULL) {
- backend = talloc_strndup(ldb, url, strchr(url, ':')-url);
- } else {
- /* Default to tdb */
- backend = talloc_strdup(ldb, "tdb");
- }
- if (backend == NULL) {
- return ldb_oom(ldb);
- }
-
- be = ldb_find_backend(backend);
-
- talloc_free(backend);
-
- if (be == NULL) {
- ldb_debug(ldb, LDB_DEBUG_FATAL,
- "Unable to find backend for '%s' - do you need to set LDB_MODULES_PATH?", url);
- return LDB_ERR_OTHER;
- }
-
- ret = be->ops->connect_fn(ldb, url, ldb->flags, options, backend_module);
-
- if (ret != LDB_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Failed to connect to '%s' with backend '%s'", url, be->ops->name);
- return ret;
- }
- return ret;
-}
-
-static struct ldb_hooks {
- struct ldb_hooks *next, *prev;
- ldb_hook_fn hook_fn;
-} *ldb_hooks;
-
-/*
- register a ldb hook function
- */
-int ldb_register_hook(ldb_hook_fn hook_fn)
-{
- struct ldb_hooks *lc;
- lc = talloc_zero(ldb_hooks, struct ldb_hooks);
- if (lc == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- lc->hook_fn = hook_fn;
- DLIST_ADD_END(ldb_hooks, lc, struct ldb_hooks);
- return LDB_SUCCESS;
-}
-
-/*
- call ldb hooks of a given type
- */
-int ldb_modules_hook(struct ldb_context *ldb, enum ldb_module_hook_type t)
-{
- struct ldb_hooks *lc;
- for (lc = ldb_hooks; lc; lc=lc->next) {
- int ret = lc->hook_fn(ldb, t);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
- return LDB_SUCCESS;
-}
-
-
-static const struct ldb_module_ops *ldb_find_module_ops(const char *name)
-{
- struct ops_list_entry *e;
-
- for (e = registered_modules; e; e = e->next) {
- if (strcmp(e->ops->name, name) == 0)
- return e->ops;
- }
-
- return NULL;
-}
-
-
-int ldb_register_module(const struct ldb_module_ops *ops)
-{
- struct ops_list_entry *entry;
-
- if (ldb_find_module_ops(ops->name) != NULL)
- return LDB_ERR_ENTRY_ALREADY_EXISTS;
-
- entry = talloc(talloc_autofree_context(), struct ops_list_entry);
- if (entry == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- entry->ops = ops;
- entry->next = registered_modules;
- registered_modules = entry;
-
- return LDB_SUCCESS;
-}
-
-/*
- load a list of modules
- */
-int ldb_module_load_list(struct ldb_context *ldb, const char **module_list,
- struct ldb_module *backend, struct ldb_module **out)
-{
- struct ldb_module *module;
- unsigned int i;
-
- module = backend;
-
- for (i = 0; module_list && module_list[i] != NULL; i++) {
- struct ldb_module *current;
- const struct ldb_module_ops *ops;
-
- if (strcmp(module_list[i], "") == 0) {
- continue;
- }
-
- ops = ldb_find_module_ops(module_list[i]);
-
- if (ops == NULL) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "WARNING: Module [%s] not found - do you need to set LDB_MODULES_PATH?",
- module_list[i]);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- current = talloc_zero(ldb, struct ldb_module);
- if (current == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- talloc_set_name(current, "ldb_module: %s", module_list[i]);
-
- current->ldb = ldb;
- current->ops = ops;
-
- DLIST_ADD(module, current);
- }
- *out = module;
- return LDB_SUCCESS;
-}
-
-/*
- initialise a chain of modules
- */
-int ldb_module_init_chain(struct ldb_context *ldb, struct ldb_module *module)
-{
- while (module && module->ops->init_context == NULL)
- module = module->next;
-
- /* init is different in that it is not an error if modules
- * do not require initialization */
-
- if (module) {
- int ret = module->ops->init_context(module);
- if (ret != LDB_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "module %s initialization failed : %s",
- module->ops->name, ldb_strerror(ret));
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-int ldb_load_modules(struct ldb_context *ldb, const char *options[])
-{
- const char *modules_string;
- const char **modules = NULL;
- int ret;
- TALLOC_CTX *mem_ctx = talloc_new(ldb);
- if (!mem_ctx) {
- return ldb_oom(ldb);
- }
-
- /* find out which modules we are requested to activate */
-
- /* check if we have a custom module list passd as ldb option */
- if (options) {
- modules_string = ldb_options_find(ldb, options, "modules");
- if (modules_string) {
- modules = ldb_modules_list_from_string(ldb, mem_ctx, modules_string);
- }
- }
-
- /* if not overloaded by options and the backend is not ldap try to load the modules list from ldb */
- if ((modules == NULL) && (strcmp("ldap", ldb->modules->ops->name) != 0)) {
- const char * const attrs[] = { "@LIST" , NULL};
- struct ldb_result *res = NULL;
- struct ldb_dn *mods_dn;
-
- mods_dn = ldb_dn_new(mem_ctx, ldb, "@MODULES");
- if (mods_dn == NULL) {
- talloc_free(mem_ctx);
- return ldb_oom(ldb);
- }
-
- ret = ldb_search(ldb, mods_dn, &res, mods_dn, LDB_SCOPE_BASE, attrs, "@LIST=*");
-
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- ldb_debug(ldb, LDB_DEBUG_TRACE, "no modules required by the db");
- } else if (ret != LDB_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "ldb error (%s) occurred searching for modules, bailing out", ldb_errstring(ldb));
- talloc_free(mem_ctx);
- return ret;
- } else {
- const char *module_list;
- if (res->count == 0) {
- ldb_debug(ldb, LDB_DEBUG_TRACE, "no modules required by the db");
- } else if (res->count > 1) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "Too many records found (%u), bailing out", res->count);
- talloc_free(mem_ctx);
- return LDB_ERR_OPERATIONS_ERROR;
- } else {
- module_list = ldb_msg_find_attr_as_string(res->msgs[0], "@LIST", NULL);
- if (!module_list) {
- ldb_debug(ldb, LDB_DEBUG_TRACE, "no modules required by the db");
- }
- modules = ldb_modules_list_from_string(ldb, mem_ctx,
- module_list);
- }
- }
-
- talloc_free(mods_dn);
- }
-
- if (modules != NULL) {
- ret = ldb_module_load_list(ldb, modules, ldb->modules, &ldb->modules);
- if (ret != LDB_SUCCESS) {
- talloc_free(mem_ctx);
- return ret;
- }
- } else {
- ldb_debug(ldb, LDB_DEBUG_TRACE, "No modules specified for this database");
- }
-
- ret = ldb_module_init_chain(ldb, ldb->modules);
- talloc_free(mem_ctx);
- return ret;
-}
-
-/*
- by using this we allow ldb modules to only implement the functions they care about,
- which makes writing a module simpler, and makes it more likely to keep working
- when ldb is extended
-*/
-#define FIND_OP_NOERR(module, op) do { \
- module = module->next; \
- while (module && module->ops->op == NULL) module = module->next; \
- if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) { \
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_trace_next_request: (%s)->" #op, \
- module->ops->name); \
- } \
-} while (0)
-
-#define FIND_OP(module, op) do { \
- struct ldb_context *ldb = module->ldb; \
- FIND_OP_NOERR(module, op); \
- if (module == NULL) { \
- ldb_asprintf_errstring(ldb, "Unable to find backend operation for " #op ); \
- return LDB_ERR_OPERATIONS_ERROR; \
- } \
-} while (0)
-
-
-struct ldb_module *ldb_module_new(TALLOC_CTX *memctx,
- struct ldb_context *ldb,
- const char *module_name,
- const struct ldb_module_ops *ops)
-{
- struct ldb_module *module;
-
- module = talloc(memctx, struct ldb_module);
- if (!module) {
- ldb_oom(ldb);
- return NULL;
- }
- talloc_set_name_const(module, module_name);
- module->ldb = ldb;
- module->prev = module->next = NULL;
- module->ops = ops;
-
- return module;
-}
-
-const char * ldb_module_get_name(struct ldb_module *module)
-{
- return module->ops->name;
-}
-
-struct ldb_context *ldb_module_get_ctx(struct ldb_module *module)
-{
- return module->ldb;
-}
-
-const struct ldb_module_ops *ldb_module_get_ops(struct ldb_module *module)
-{
- return module->ops;
-}
-
-void *ldb_module_get_private(struct ldb_module *module)
-{
- return module->private_data;
-}
-
-void ldb_module_set_private(struct ldb_module *module, void *private_data)
-{
- module->private_data = private_data;
-}
-
-/*
- helper functions to call the next module in chain
-*/
-
-int ldb_next_request(struct ldb_module *module, struct ldb_request *request)
-{
- int ret;
-
- if (request->callback == NULL) {
- ldb_set_errstring(module->ldb, "Requests MUST define callbacks");
- return LDB_ERR_UNWILLING_TO_PERFORM;
- }
-
- request->handle->nesting++;
-
- switch (request->operation) {
- case LDB_SEARCH:
- FIND_OP(module, search);
- ret = module->ops->search(module, request);
- break;
- case LDB_ADD:
- FIND_OP(module, add);
- ret = module->ops->add(module, request);
- break;
- case LDB_MODIFY:
- FIND_OP(module, modify);
- ret = module->ops->modify(module, request);
- break;
- case LDB_DELETE:
- FIND_OP(module, del);
- ret = module->ops->del(module, request);
- break;
- case LDB_RENAME:
- FIND_OP(module, rename);
- ret = module->ops->rename(module, request);
- break;
- case LDB_EXTENDED:
- FIND_OP(module, extended);
- ret = module->ops->extended(module, request);
- break;
- default:
- FIND_OP(module, request);
- ret = module->ops->request(module, request);
- break;
- }
-
- request->handle->nesting--;
-
- if (ret == LDB_SUCCESS) {
- return ret;
- }
- if (!ldb_errstring(module->ldb)) {
- /* Set a default error string, to place the blame somewhere */
- ldb_asprintf_errstring(module->ldb, "error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
- }
-
- if (!(request->handle->flags & LDB_HANDLE_FLAG_DONE_CALLED)) {
- /* It is _extremely_ common that a module returns a
- * failure without calling ldb_module_done(), but that
- * guarantees we will end up hanging in
- * ldb_wait(). This fixes it without having to rewrite
- * all our modules, and leaves us one less sharp
- * corner for module developers to cut themselves on
- */
- ret = ldb_module_done(request, NULL, NULL, ret);
- }
- return ret;
-}
-
-int ldb_next_init(struct ldb_module *module)
-{
- module = module->next;
-
- return ldb_module_init_chain(module->ldb, module);
-}
-
-int ldb_next_start_trans(struct ldb_module *module)
-{
- int ret;
- FIND_OP(module, start_transaction);
- ret = module->ops->start_transaction(module);
- if (ret == LDB_SUCCESS) {
- return ret;
- }
- if (!ldb_errstring(module->ldb)) {
- /* Set a default error string, to place the blame somewhere */
- ldb_asprintf_errstring(module->ldb, "start_trans error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
- }
- if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_next_start_trans error: %s",
- ldb_errstring(module->ldb));
- }
- return ret;
-}
-
-int ldb_next_end_trans(struct ldb_module *module)
-{
- int ret;
- FIND_OP(module, end_transaction);
- ret = module->ops->end_transaction(module);
- if (ret == LDB_SUCCESS) {
- return ret;
- }
- if (!ldb_errstring(module->ldb)) {
- /* Set a default error string, to place the blame somewhere */
- ldb_asprintf_errstring(module->ldb, "end_trans error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
- }
- if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_next_end_trans error: %s",
- ldb_errstring(module->ldb));
- }
- return ret;
-}
-
-int ldb_next_prepare_commit(struct ldb_module *module)
-{
- int ret;
- FIND_OP_NOERR(module, prepare_commit);
- if (module == NULL) {
- /* we are allowed to have no prepare commit in
- backends */
- return LDB_SUCCESS;
- }
- ret = module->ops->prepare_commit(module);
- if (ret == LDB_SUCCESS) {
- return ret;
- }
- if (!ldb_errstring(module->ldb)) {
- /* Set a default error string, to place the blame somewhere */
- ldb_asprintf_errstring(module->ldb, "prepare_commit error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
- }
- if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_next_prepare_commit error: %s",
- ldb_errstring(module->ldb));
- }
- return ret;
-}
-
-int ldb_next_del_trans(struct ldb_module *module)
-{
- int ret;
- FIND_OP(module, del_transaction);
- ret = module->ops->del_transaction(module);
- if (ret == LDB_SUCCESS) {
- return ret;
- }
- if (!ldb_errstring(module->ldb)) {
- /* Set a default error string, to place the blame somewhere */
- ldb_asprintf_errstring(module->ldb, "del_trans error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
- }
- if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
- ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_next_del_trans error: %s",
- ldb_errstring(module->ldb));
- }
- return ret;
-}
-
-struct ldb_handle *ldb_handle_new(TALLOC_CTX *mem_ctx, struct ldb_context *ldb)
-{
- struct ldb_handle *h;
-
- h = talloc_zero(mem_ctx, struct ldb_handle);
- if (h == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return NULL;
- }
-
- h->status = LDB_SUCCESS;
- h->state = LDB_ASYNC_INIT;
- h->ldb = ldb;
- h->flags = 0;
- h->location = NULL;
- h->parent = NULL;
-
- return h;
-}
-
-/* calls the request callback to send an entry
- *
- * params:
- * req: the original request passed to your module
- * msg: reply message (must be a talloc pointer, and it will be stolen
- * on the ldb_reply that is sent to the callback)
- * ctrls: controls to send in the reply (must be a talloc pointer, and it will be stolen
- * on the ldb_reply that is sent to the callback)
- */
-
-int ldb_module_send_entry(struct ldb_request *req,
- struct ldb_message *msg,
- struct ldb_control **ctrls)
-{
- struct ldb_reply *ares;
-
- ares = talloc_zero(req, struct ldb_reply);
- if (!ares) {
- ldb_oom(req->handle->ldb);
- req->callback(req, NULL);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ares->type = LDB_REPLY_ENTRY;
- ares->message = talloc_steal(ares, msg);
- ares->controls = talloc_steal(ares, ctrls);
- ares->error = LDB_SUCCESS;
-
- if ((req->handle->ldb->flags & LDB_FLG_ENABLE_TRACING) &&
- req->handle->nesting == 0) {
- char *s;
- ldb_debug_add(req->handle->ldb, "ldb_trace_response: ENTRY\n");
- s = ldb_ldif_message_string(req->handle->ldb, msg, LDB_CHANGETYPE_NONE, msg);
- ldb_debug_add(req->handle->ldb, "%s\n", s);
- talloc_free(s);
- ldb_debug_end(req->handle->ldb, LDB_DEBUG_TRACE);
- }
-
- return req->callback(req, ares);
-}
-
-/* calls the request callback to send an referrals
- *
- * params:
- * req: the original request passed to your module
- * ref: referral string (must be a talloc pointeri, steal)
- */
-
-int ldb_module_send_referral(struct ldb_request *req,
- char *ref)
-{
- struct ldb_reply *ares;
-
- ares = talloc_zero(req, struct ldb_reply);
- if (!ares) {
- ldb_oom(req->handle->ldb);
- req->callback(req, NULL);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ares->type = LDB_REPLY_REFERRAL;
- ares->referral = talloc_steal(ares, ref);
- ares->error = LDB_SUCCESS;
-
- if ((req->handle->ldb->flags & LDB_FLG_ENABLE_TRACING) &&
- req->handle->nesting == 0) {
- ldb_debug_add(req->handle->ldb, "ldb_trace_response: REFERRAL\n");
- ldb_debug_add(req->handle->ldb, "ref: %s\n", ref);
- ldb_debug_end(req->handle->ldb, LDB_DEBUG_TRACE);
- }
-
- return req->callback(req, ares);
-}
-
-/* calls the original request callback
- *
- * params:
- * req: the original request passed to your module
- * ctrls: controls to send in the reply (must be a talloc pointer, steal)
- * response: results for extended request (steal)
- * error: LDB_SUCCESS for a successful return
- * any other ldb error otherwise
- */
-int ldb_module_done(struct ldb_request *req,
- struct ldb_control **ctrls,
- struct ldb_extended *response,
- int error)
-{
- struct ldb_reply *ares;
-
- ares = talloc_zero(req, struct ldb_reply);
- if (!ares) {
- ldb_oom(req->handle->ldb);
- req->callback(req, NULL);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ares->type = LDB_REPLY_DONE;
- ares->controls = talloc_steal(ares, ctrls);
- ares->response = talloc_steal(ares, response);
- ares->error = error;
-
- req->handle->flags |= LDB_HANDLE_FLAG_DONE_CALLED;
-
- if ((req->handle->ldb->flags & LDB_FLG_ENABLE_TRACING) &&
- req->handle->nesting == 0) {
- ldb_debug_add(req->handle->ldb, "ldb_trace_response: DONE\n");
- ldb_debug_add(req->handle->ldb, "error: %d\n", error);
- if (ldb_errstring(req->handle->ldb)) {
- ldb_debug_add(req->handle->ldb, "msg: %s\n",
- ldb_errstring(req->handle->ldb));
- }
- ldb_debug_end(req->handle->ldb, LDB_DEBUG_TRACE);
- }
-
- return req->callback(req, ares);
-}
-
-/* to be used *only* in modules init functions.
- * this function is synchronous and will register
- * the requested OID in the rootdse module if present
- * otherwise it will return an error */
-int ldb_mod_register_control(struct ldb_module *module, const char *oid)
-{
- struct ldb_request *req;
- int ret;
-
- req = talloc_zero(module, struct ldb_request);
- if (req == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- req->operation = LDB_REQ_REGISTER_CONTROL;
- req->op.reg_control.oid = oid;
- req->callback = ldb_op_default_callback;
-
- ldb_set_timeout(module->ldb, req, 0);
-
- req->handle = ldb_handle_new(req, module->ldb);
- if (req->handle == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_request(module->ldb, req);
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
- talloc_free(req);
-
- return ret;
-}
-
-static int ldb_modules_load_dir(const char *modules_dir, const char *version);
-
-
-/*
- load one module. A static list of loaded module inode numbers is
- used to prevent a module being loaded twice
-
- dlopen() is used on the module, and dlsym() is then used to look for
- a ldb_init_module() function. If present, that function is called
- with the ldb version number as an argument.
-
- The ldb_init_module() function will typically call
- ldb_register_module() and ldb_register_backend() to register a
- module or backend, but it may also be used to register command line
- handling functions, ldif handlers or any other local
- modififications.
-
- The ldb_init_module() function does not get a ldb_context passed in,
- as modules will be used for multiple ldb context handles. The call
- from the first ldb_init() is just a convenient way to ensure it is
- called early enough.
- */
-static int ldb_modules_load_path(const char *path, const char *version)
-{
- void *handle;
- int (*init_fn)(const char *);
- int ret;
- struct stat st;
- static struct loaded {
- struct loaded *next, *prev;
- ino_t st_ino;
- dev_t st_dev;
- } *loaded;
- struct loaded *le;
- int dlopen_flags;
-
- ret = stat(path, &st);
- if (ret != 0) {
- fprintf(stderr, "ldb: unable to stat module %s : %s\n", path, strerror(errno));
- return LDB_ERR_UNAVAILABLE;
- }
-
- for (le=loaded; le; le=le->next) {
- if (le->st_ino == st.st_ino &&
- le->st_dev == st.st_dev) {
- /* its already loaded */
- return LDB_SUCCESS;
- }
- }
-
- le = talloc(loaded, struct loaded);
- if (le == NULL) {
- fprintf(stderr, "ldb: unable to allocated loaded entry\n");
- return LDB_ERR_UNAVAILABLE;
- }
-
- le->st_ino = st.st_ino;
- le->st_dev = st.st_dev;
-
- DLIST_ADD_END(loaded, le, struct loaded);
-
- /* if it is a directory, recurse */
- if (S_ISDIR(st.st_mode)) {
- return ldb_modules_load_dir(path, version);
- }
-
- dlopen_flags = RTLD_NOW;
-#ifdef RTLD_DEEPBIND
- /* use deepbind if possible, to avoid issues with different
- system library varients, for example ldb modules may be linked
- against Heimdal while the application may use MIT kerberos
-
- See the dlopen manpage for details
- */
- dlopen_flags |= RTLD_DEEPBIND;
-#endif
-
- handle = dlopen(path, dlopen_flags);
- if (handle == NULL) {
- fprintf(stderr, "ldb: unable to dlopen %s : %s\n", path, dlerror());
- return LDB_SUCCESS;
- }
-
- init_fn = dlsym(handle, "ldb_init_module");
- if (init_fn == NULL) {
- /* ignore it, it could be an old-style
- * module. Once we've converted all modules we
- * could consider this an error */
- dlclose(handle);
- return LDB_SUCCESS;
- }
-
- ret = init_fn(version);
- if (ret == LDB_ERR_ENTRY_ALREADY_EXISTS) {
- /* the module is already registered - ignore this, as
- * it can happen if LDB_MODULES_PATH points at both
- * the build and install directory
- */
- ret = LDB_SUCCESS;
- }
- return ret;
-}
-
-static int qsort_string(const char **s1, const char **s2)
-{
- return strcmp(*s1, *s2);
-}
-
-
-/*
- load all modules from the given ldb modules directory. This is run once
- during the first ldb_init() call.
-
- Modules are loaded in alphabetical order to ensure that any module
- load ordering dependencies are reproducible. Modules should avoid
- relying on load order
- */
-static int ldb_modules_load_dir(const char *modules_dir, const char *version)
-{
- DIR *dir;
- struct dirent *de;
- const char **modlist = NULL;
- TALLOC_CTX *tmp_ctx = talloc_new(NULL);
- unsigned i, num_modules = 0;
-
- dir = opendir(modules_dir);
- if (dir == NULL) {
- if (errno == ENOENT) {
- talloc_free(tmp_ctx);
- /* we don't have any modules */
- return LDB_SUCCESS;
- }
- talloc_free(tmp_ctx);
- fprintf(stderr, "ldb: unable to open modules directory '%s' - %s\n",
- modules_dir, strerror(errno));
- return LDB_ERR_UNAVAILABLE;
- }
-
-
- while ((de = readdir(dir))) {
- if (ISDOT(de->d_name) || ISDOTDOT(de->d_name))
- continue;
-
- modlist = talloc_realloc(tmp_ctx, modlist, const char *, num_modules+1);
- if (modlist == NULL) {
- talloc_free(tmp_ctx);
- closedir(dir);
- fprintf(stderr, "ldb: unable to allocate modules list\n");
- return LDB_ERR_UNAVAILABLE;
- }
- modlist[num_modules] = talloc_asprintf(modlist, "%s/%s", modules_dir, de->d_name);
- if (modlist[num_modules] == NULL) {
- talloc_free(tmp_ctx);
- closedir(dir);
- fprintf(stderr, "ldb: unable to allocate module list entry\n");
- return LDB_ERR_UNAVAILABLE;
- }
- num_modules++;
- }
-
- closedir(dir);
-
- /* sort the directory, so we get consistent load ordering */
- TYPESAFE_QSORT(modlist, num_modules, qsort_string);
-
- for (i=0; i<num_modules; i++) {
- int ret = ldb_modules_load_path(modlist[i], version);
- if (ret != LDB_SUCCESS) {
- fprintf(stderr, "ldb: failed to initialise module %s : %s\n",
- modlist[i], ldb_strerror(ret));
- talloc_free(tmp_ctx);
- return ret;
- }
- }
-
- talloc_free(tmp_ctx);
-
- return LDB_SUCCESS;
-}
-
-/*
- load any additional modules from the given directory
-*/
-void ldb_set_modules_dir(struct ldb_context *ldb, const char *path)
-{
- int ret = ldb_modules_load_path(path, LDB_VERSION);
- if (ret != LDB_SUCCESS) {
- ldb_asprintf_errstring(ldb, "Failed to load modules from: %s\n", path);
- }
-}
-
-
-/*
- load all modules static (builtin) modules
- */
-static int ldb_modules_load_static(const char *version)
-{
- static bool initialised;
-#define _MODULE_PROTO(init) extern int init(const char *);
- STATIC_ldb_MODULES_PROTO;
- const ldb_module_init_fn static_init_functions[] = { STATIC_ldb_MODULES };
- unsigned i;
-
- if (initialised) {
- return LDB_SUCCESS;
- }
- initialised = true;
-
- for (i=0; static_init_functions[i]; i++) {
- int ret = static_init_functions[i](version);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
- return LDB_SUCCESS;
-}
-
-/*
- load all modules from the given ldb modules path, colon
- separated.
-
- modules are loaded recursively for all subdirectories in the paths
- */
-int ldb_modules_load(const char *modules_path, const char *version)
-{
- char *tok, *path, *tok_ptr=NULL;
- int ret;
-
- ret = ldb_modules_load_static(version);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- path = talloc_strdup(NULL, modules_path);
- if (path == NULL) {
- fprintf(stderr, "ldb: failed to allocate modules_path\n");
- return LDB_ERR_UNAVAILABLE;
- }
-
- for (tok=strtok_r(path, ":", &tok_ptr);
- tok;
- tok=strtok_r(NULL, ":", &tok_ptr)) {
- ret = ldb_modules_load_path(tok, version);
- if (ret != LDB_SUCCESS) {
- talloc_free(path);
- return ret;
- }
- }
- talloc_free(path);
-
- return LDB_SUCCESS;
-}
-
-
-/*
- return a string representation of the calling chain for the given
- ldb request
- */
-char *ldb_module_call_chain(struct ldb_request *req, TALLOC_CTX *mem_ctx)
-{
- char *ret;
- unsigned int i = 0;
-
- ret = talloc_strdup(mem_ctx, "");
- if (ret == NULL) {
- return NULL;
- }
-
- while (req && req->handle) {
- char *s = talloc_asprintf_append_buffer(ret, "req[%u] %p : %s\n",
- i++, req, ldb_req_location(req));
- if (s == NULL) {
- talloc_free(ret);
- return NULL;
- }
- ret = s;
- req = req->handle->parent;
- }
- return ret;
-}
-
-
-/*
- return the next module in the chain
- */
-struct ldb_module *ldb_module_next(struct ldb_module *module)
-{
- return module->next;
-}
-
-/*
- set the next module in the module chain
- */
-void ldb_module_set_next(struct ldb_module *module, struct ldb_module *next)
-{
- module->next = next;
-}
-
-
-/*
- get the popt_options pointer in the ldb structure. This allows a ldb
- module to change the command line parsing
- */
-struct poptOption **ldb_module_popt_options(struct ldb_context *ldb)
-{
- return &ldb->popt_options;
-}
-
-
-/*
- return the current ldb flags LDB_FLG_*
- */
-uint32_t ldb_module_flags(struct ldb_context *ldb)
-{
- return ldb->flags;
-}
diff --git a/source4/lib/ldb/common/ldb_msg.c b/source4/lib/ldb/common/ldb_msg.c
deleted file mode 100644
index 28c414e6b2..0000000000
--- a/source4/lib/ldb/common/ldb_msg.c
+++ /dev/null
@@ -1,1187 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb message component utility functions
- *
- * Description: functions for manipulating ldb_message structures
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb_private.h"
-
-/*
- create a new ldb_message in a given memory context (NULL for top level)
-*/
-struct ldb_message *ldb_msg_new(TALLOC_CTX *mem_ctx)
-{
- return talloc_zero(mem_ctx, struct ldb_message);
-}
-
-/*
- find an element in a message by attribute name
-*/
-struct ldb_message_element *ldb_msg_find_element(const struct ldb_message *msg,
- const char *attr_name)
-{
- unsigned int i;
- for (i=0;i<msg->num_elements;i++) {
- if (ldb_attr_cmp(msg->elements[i].name, attr_name) == 0) {
- return &msg->elements[i];
- }
- }
- return NULL;
-}
-
-/*
- see if two ldb_val structures contain exactly the same data
- return 1 for a match, 0 for a mis-match
-*/
-int ldb_val_equal_exact(const struct ldb_val *v1, const struct ldb_val *v2)
-{
- if (v1->length != v2->length) return 0;
- if (v1->data == v2->data) return 1;
- if (v1->length == 0) return 1;
-
- if (memcmp(v1->data, v2->data, v1->length) == 0) {
- return 1;
- }
-
- return 0;
-}
-
-/*
- find a value in an element
- assumes case sensitive comparison
-*/
-struct ldb_val *ldb_msg_find_val(const struct ldb_message_element *el,
- struct ldb_val *val)
-{
- unsigned int i;
- for (i=0;i<el->num_values;i++) {
- if (ldb_val_equal_exact(val, &el->values[i])) {
- return &el->values[i];
- }
- }
- return NULL;
-}
-
-/*
- duplicate a ldb_val structure
-*/
-struct ldb_val ldb_val_dup(TALLOC_CTX *mem_ctx, const struct ldb_val *v)
-{
- struct ldb_val v2;
- v2.length = v->length;
- if (v->data == NULL) {
- v2.data = NULL;
- return v2;
- }
-
- /* the +1 is to cope with buggy C library routines like strndup
- that look one byte beyond */
- v2.data = talloc_array(mem_ctx, uint8_t, v->length+1);
- if (!v2.data) {
- v2.length = 0;
- return v2;
- }
-
- memcpy(v2.data, v->data, v->length);
- ((char *)v2.data)[v->length] = 0;
- return v2;
-}
-
-/**
- * Adds new empty element to msg->elements
- */
-static int _ldb_msg_add_el(struct ldb_message *msg,
- struct ldb_message_element **return_el)
-{
- struct ldb_message_element *els;
-
- /*
- * TODO: Find out a way to assert on input parameters.
- * msg and return_el must be valid
- */
-
- els = talloc_realloc(msg, msg->elements,
- struct ldb_message_element, msg->num_elements + 1);
- if (!els) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ZERO_STRUCT(els[msg->num_elements]);
-
- msg->elements = els;
- msg->num_elements++;
-
- *return_el = &els[msg->num_elements-1];
-
- return LDB_SUCCESS;
-}
-
-/**
- * Add an empty element with a given name to a message
- */
-int ldb_msg_add_empty(struct ldb_message *msg,
- const char *attr_name,
- int flags,
- struct ldb_message_element **return_el)
-{
- int ret;
- struct ldb_message_element *el;
-
- ret = _ldb_msg_add_el(msg, &el);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- /* initialize newly added element */
- el->flags = flags;
- el->name = talloc_strdup(msg->elements, attr_name);
- if (!el->name) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (return_el) {
- *return_el = el;
- }
-
- return LDB_SUCCESS;
-}
-
-/**
- * Adds an element to a message.
- *
- * NOTE: Ownership of ldb_message_element fields
- * is NOT transferred. Thus, if *el pointer
- * is invalidated for some reason, this will
- * corrupt *msg contents also
- */
-int ldb_msg_add(struct ldb_message *msg,
- const struct ldb_message_element *el,
- int flags)
-{
- int ret;
- struct ldb_message_element *el_new;
- /* We have to copy this, just in case *el is a pointer into
- * what ldb_msg_add_empty() is about to realloc() */
- struct ldb_message_element el_copy = *el;
-
- ret = _ldb_msg_add_el(msg, &el_new);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- el_new->flags = flags;
- el_new->name = el_copy.name;
- el_new->num_values = el_copy.num_values;
- el_new->values = el_copy.values;
-
- return LDB_SUCCESS;
-}
-
-/*
- add a value to a message
-*/
-int ldb_msg_add_value(struct ldb_message *msg,
- const char *attr_name,
- const struct ldb_val *val,
- struct ldb_message_element **return_el)
-{
- struct ldb_message_element *el;
- struct ldb_val *vals;
- int ret;
-
- el = ldb_msg_find_element(msg, attr_name);
- if (!el) {
- ret = ldb_msg_add_empty(msg, attr_name, 0, &el);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- vals = talloc_realloc(msg->elements, el->values, struct ldb_val,
- el->num_values+1);
- if (!vals) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- el->values = vals;
- el->values[el->num_values] = *val;
- el->num_values++;
-
- if (return_el) {
- *return_el = el;
- }
-
- return LDB_SUCCESS;
-}
-
-
-/*
- add a value to a message, stealing it into the 'right' place
-*/
-int ldb_msg_add_steal_value(struct ldb_message *msg,
- const char *attr_name,
- struct ldb_val *val)
-{
- int ret;
- struct ldb_message_element *el;
-
- ret = ldb_msg_add_value(msg, attr_name, val, &el);
- if (ret == LDB_SUCCESS) {
- talloc_steal(el->values, val->data);
- }
- return ret;
-}
-
-
-/*
- add a string element to a message
-*/
-int ldb_msg_add_string(struct ldb_message *msg,
- const char *attr_name, const char *str)
-{
- struct ldb_val val;
-
- val.data = discard_const_p(uint8_t, str);
- val.length = strlen(str);
-
- if (val.length == 0) {
- /* allow empty strings as non-existent attributes */
- return LDB_SUCCESS;
- }
-
- return ldb_msg_add_value(msg, attr_name, &val, NULL);
-}
-
-/*
- add a string element to a message, stealing it into the 'right' place
-*/
-int ldb_msg_add_steal_string(struct ldb_message *msg,
- const char *attr_name, char *str)
-{
- struct ldb_val val;
-
- val.data = (uint8_t *)str;
- val.length = strlen(str);
-
- if (val.length == 0) {
- /* allow empty strings as non-existent attributes */
- return LDB_SUCCESS;
- }
-
- return ldb_msg_add_steal_value(msg, attr_name, &val);
-}
-
-/*
- add a DN element to a message
- WARNING: this uses the linearized string from the dn, and does not
- copy the string.
-*/
-int ldb_msg_add_linearized_dn(struct ldb_message *msg, const char *attr_name,
- struct ldb_dn *dn)
-{
- char *str = ldb_dn_alloc_linearized(msg, dn);
-
- if (str == NULL) {
- /* we don't want to have unknown DNs added */
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_msg_add_steal_string(msg, attr_name, str);
-}
-
-/*
- add a printf formatted element to a message
-*/
-int ldb_msg_add_fmt(struct ldb_message *msg,
- const char *attr_name, const char *fmt, ...)
-{
- struct ldb_val val;
- va_list ap;
- char *str;
-
- va_start(ap, fmt);
- str = talloc_vasprintf(msg, fmt, ap);
- va_end(ap);
-
- if (str == NULL) return LDB_ERR_OPERATIONS_ERROR;
-
- val.data = (uint8_t *)str;
- val.length = strlen(str);
-
- return ldb_msg_add_steal_value(msg, attr_name, &val);
-}
-
-/*
- compare two ldb_message_element structures
- assumes case sensitive comparison
-*/
-int ldb_msg_element_compare(struct ldb_message_element *el1,
- struct ldb_message_element *el2)
-{
- unsigned int i;
-
- if (el1->num_values != el2->num_values) {
- return el1->num_values - el2->num_values;
- }
-
- for (i=0;i<el1->num_values;i++) {
- if (!ldb_msg_find_val(el2, &el1->values[i])) {
- return -1;
- }
- }
-
- return 0;
-}
-
-/*
- compare two ldb_message_element structures
- comparing by element name
-*/
-int ldb_msg_element_compare_name(struct ldb_message_element *el1,
- struct ldb_message_element *el2)
-{
- return ldb_attr_cmp(el1->name, el2->name);
-}
-
-/*
- convenience functions to return common types from a message
- these return the first value if the attribute is multi-valued
-*/
-const struct ldb_val *ldb_msg_find_ldb_val(const struct ldb_message *msg,
- const char *attr_name)
-{
- struct ldb_message_element *el = ldb_msg_find_element(msg, attr_name);
- if (!el || el->num_values == 0) {
- return NULL;
- }
- return &el->values[0];
-}
-
-int ldb_msg_find_attr_as_int(const struct ldb_message *msg,
- const char *attr_name,
- int default_value)
-{
- const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr_name);
- char buf[sizeof("-2147483648")];
- char *end = NULL;
- int ret;
-
- if (!v || !v->data) {
- return default_value;
- }
-
- ZERO_STRUCT(buf);
- if (v->length >= sizeof(buf)) {
- return default_value;
- }
-
- memcpy(buf, v->data, v->length);
- errno = 0;
- ret = (int) strtoll(buf, &end, 10);
- if (errno != 0) {
- return default_value;
- }
- if (end && end[0] != '\0') {
- return default_value;
- }
- return ret;
-}
-
-unsigned int ldb_msg_find_attr_as_uint(const struct ldb_message *msg,
- const char *attr_name,
- unsigned int default_value)
-{
- const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr_name);
- char buf[sizeof("-2147483648")];
- char *end = NULL;
- unsigned int ret;
-
- if (!v || !v->data) {
- return default_value;
- }
-
- ZERO_STRUCT(buf);
- if (v->length >= sizeof(buf)) {
- return default_value;
- }
-
- memcpy(buf, v->data, v->length);
- errno = 0;
- ret = (unsigned int) strtoll(buf, &end, 10);
- if (errno != 0) {
- errno = 0;
- ret = (unsigned int) strtoull(buf, &end, 10);
- if (errno != 0) {
- return default_value;
- }
- }
- if (end && end[0] != '\0') {
- return default_value;
- }
- return ret;
-}
-
-int64_t ldb_msg_find_attr_as_int64(const struct ldb_message *msg,
- const char *attr_name,
- int64_t default_value)
-{
- const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr_name);
- char buf[sizeof("-9223372036854775808")];
- char *end = NULL;
- int64_t ret;
-
- if (!v || !v->data) {
- return default_value;
- }
-
- ZERO_STRUCT(buf);
- if (v->length >= sizeof(buf)) {
- return default_value;
- }
-
- memcpy(buf, v->data, v->length);
- errno = 0;
- ret = (int64_t) strtoll(buf, &end, 10);
- if (errno != 0) {
- return default_value;
- }
- if (end && end[0] != '\0') {
- return default_value;
- }
- return ret;
-}
-
-uint64_t ldb_msg_find_attr_as_uint64(const struct ldb_message *msg,
- const char *attr_name,
- uint64_t default_value)
-{
- const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr_name);
- char buf[sizeof("-9223372036854775808")];
- char *end = NULL;
- uint64_t ret;
-
- if (!v || !v->data) {
- return default_value;
- }
-
- ZERO_STRUCT(buf);
- if (v->length >= sizeof(buf)) {
- return default_value;
- }
-
- memcpy(buf, v->data, v->length);
- errno = 0;
- ret = (uint64_t) strtoll(buf, &end, 10);
- if (errno != 0) {
- errno = 0;
- ret = (uint64_t) strtoull(buf, &end, 10);
- if (errno != 0) {
- return default_value;
- }
- }
- if (end && end[0] != '\0') {
- return default_value;
- }
- return ret;
-}
-
-double ldb_msg_find_attr_as_double(const struct ldb_message *msg,
- const char *attr_name,
- double default_value)
-{
- const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr_name);
- char *buf;
- char *end = NULL;
- double ret;
-
- if (!v || !v->data) {
- return default_value;
- }
- buf = talloc_strndup(msg, (const char *)v->data, v->length);
- if (buf == NULL) {
- return default_value;
- }
-
- errno = 0;
- ret = strtod(buf, &end);
- talloc_free(buf);
- if (errno != 0) {
- return default_value;
- }
- if (end && end[0] != '\0') {
- return default_value;
- }
- return ret;
-}
-
-int ldb_msg_find_attr_as_bool(const struct ldb_message *msg,
- const char *attr_name,
- int default_value)
-{
- const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr_name);
- if (!v || !v->data) {
- return default_value;
- }
- if (v->length == 5 && strncasecmp((const char *)v->data, "FALSE", 5) == 0) {
- return 0;
- }
- if (v->length == 4 && strncasecmp((const char *)v->data, "TRUE", 4) == 0) {
- return 1;
- }
- return default_value;
-}
-
-const char *ldb_msg_find_attr_as_string(const struct ldb_message *msg,
- const char *attr_name,
- const char *default_value)
-{
- const struct ldb_val *v = ldb_msg_find_ldb_val(msg, attr_name);
- if (!v || !v->data) {
- return default_value;
- }
- if (v->data[v->length] != '\0') {
- return default_value;
- }
- return (const char *)v->data;
-}
-
-struct ldb_dn *ldb_msg_find_attr_as_dn(struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const struct ldb_message *msg,
- const char *attr_name)
-{
- struct ldb_dn *res_dn;
- const struct ldb_val *v;
-
- v = ldb_msg_find_ldb_val(msg, attr_name);
- if (!v || !v->data) {
- return NULL;
- }
- res_dn = ldb_dn_from_ldb_val(mem_ctx, ldb, v);
- if ( ! ldb_dn_validate(res_dn)) {
- talloc_free(res_dn);
- return NULL;
- }
- return res_dn;
-}
-
-/*
- sort the elements of a message by name
-*/
-void ldb_msg_sort_elements(struct ldb_message *msg)
-{
- TYPESAFE_QSORT(msg->elements, msg->num_elements,
- ldb_msg_element_compare_name);
-}
-
-/*
- shallow copy a message - copying only the elements array so that the caller
- can safely add new elements without changing the message
-*/
-struct ldb_message *ldb_msg_copy_shallow(TALLOC_CTX *mem_ctx,
- const struct ldb_message *msg)
-{
- struct ldb_message *msg2;
- unsigned int i;
-
- msg2 = talloc(mem_ctx, struct ldb_message);
- if (msg2 == NULL) return NULL;
-
- *msg2 = *msg;
-
- msg2->elements = talloc_array(msg2, struct ldb_message_element,
- msg2->num_elements);
- if (msg2->elements == NULL) goto failed;
-
- for (i=0;i<msg2->num_elements;i++) {
- msg2->elements[i] = msg->elements[i];
- }
-
- return msg2;
-
-failed:
- talloc_free(msg2);
- return NULL;
-}
-
-
-/*
- copy a message, allocating new memory for all parts
-*/
-struct ldb_message *ldb_msg_copy(TALLOC_CTX *mem_ctx,
- const struct ldb_message *msg)
-{
- struct ldb_message *msg2;
- unsigned int i, j;
-
- msg2 = ldb_msg_copy_shallow(mem_ctx, msg);
- if (msg2 == NULL) return NULL;
-
- msg2->dn = ldb_dn_copy(msg2, msg2->dn);
- if (msg2->dn == NULL) goto failed;
-
- for (i=0;i<msg2->num_elements;i++) {
- struct ldb_message_element *el = &msg2->elements[i];
- struct ldb_val *values = el->values;
- el->name = talloc_strdup(msg2->elements, el->name);
- if (el->name == NULL) goto failed;
- el->values = talloc_array(msg2->elements, struct ldb_val, el->num_values);
- for (j=0;j<el->num_values;j++) {
- el->values[j] = ldb_val_dup(el->values, &values[j]);
- if (el->values[j].data == NULL && values[j].length != 0) {
- goto failed;
- }
- }
- }
-
- return msg2;
-
-failed:
- talloc_free(msg2);
- return NULL;
-}
-
-
-/**
- * Canonicalize a message, merging elements of the same name
- */
-struct ldb_message *ldb_msg_canonicalize(struct ldb_context *ldb,
- const struct ldb_message *msg)
-{
- int ret;
- struct ldb_message *msg2;
-
- /*
- * Preserve previous behavior and allocate
- * *msg2 into *ldb context
- */
- ret = ldb_msg_normalize(ldb, ldb, msg, &msg2);
- if (ret != LDB_SUCCESS) {
- return NULL;
- }
-
- return msg2;
-}
-
-/**
- * Canonicalize a message, merging elements of the same name
- */
-int ldb_msg_normalize(struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const struct ldb_message *msg,
- struct ldb_message **_msg_out)
-{
- unsigned int i;
- struct ldb_message *msg2;
-
- msg2 = ldb_msg_copy(mem_ctx, msg);
- if (msg2 == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ldb_msg_sort_elements(msg2);
-
- for (i=1; i < msg2->num_elements; i++) {
- struct ldb_message_element *el1 = &msg2->elements[i-1];
- struct ldb_message_element *el2 = &msg2->elements[i];
-
- if (ldb_msg_element_compare_name(el1, el2) == 0) {
- el1->values = talloc_realloc(msg2->elements,
- el1->values, struct ldb_val,
- el1->num_values + el2->num_values);
- if (el1->num_values + el2->num_values > 0 && el1->values == NULL) {
- talloc_free(msg2);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- memcpy(el1->values + el1->num_values,
- el2->values,
- sizeof(struct ldb_val) * el2->num_values);
- el1->num_values += el2->num_values;
- talloc_free(discard_const_p(char, el2->name));
- if ((i+1) < msg2->num_elements) {
- memmove(el2, el2+1, sizeof(struct ldb_message_element) *
- (msg2->num_elements - (i+1)));
- }
- msg2->num_elements--;
- i--;
- }
- }
-
- *_msg_out = msg2;
- return LDB_SUCCESS;
-}
-
-
-/**
- * return a ldb_message representing the differences between msg1 and msg2.
- * If you then use this in a ldb_modify() call,
- * it can be used to save edits to a message
- */
-struct ldb_message *ldb_msg_diff(struct ldb_context *ldb,
- struct ldb_message *msg1,
- struct ldb_message *msg2)
-{
- int ldb_ret;
- struct ldb_message *mod;
-
- ldb_ret = ldb_msg_difference(ldb, ldb, msg1, msg2, &mod);
- if (ldb_ret != LDB_SUCCESS) {
- return NULL;
- }
-
- return mod;
-}
-
-/**
- * return a ldb_message representing the differences between msg1 and msg2.
- * If you then use this in a ldb_modify() call it can be used to save edits to a message
- *
- * Result message is constructed as follows:
- * - LDB_FLAG_MOD_ADD - elements found only in msg2
- * - LDB_FLAG_MOD_REPLACE - elements in msg2 that have different value in msg1
- * Value for msg2 element is used
- * - LDB_FLAG_MOD_DELETE - elements found only in msg2
- *
- * @return LDB_SUCCESS or LDB_ERR_OPERATIONS_ERROR
- */
-int ldb_msg_difference(struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_message *msg1,
- struct ldb_message *msg2,
- struct ldb_message **_msg_out)
-{
- int ldb_res;
- unsigned int i;
- struct ldb_message *mod;
- struct ldb_message_element *el;
- TALLOC_CTX *temp_ctx;
-
- temp_ctx = talloc_new(mem_ctx);
- if (!temp_ctx) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- mod = ldb_msg_new(temp_ctx);
- if (mod == NULL) {
- goto failed;
- }
-
- mod->dn = msg1->dn;
- mod->num_elements = 0;
- mod->elements = NULL;
-
- /*
- * Canonicalize *msg2 so we have no repeated elements
- * Resulting message is allocated in *mod's mem context,
- * as we are going to move some elements from *msg2 to
- * *mod object later
- */
- ldb_res = ldb_msg_normalize(ldb, mod, msg2, &msg2);
- if (ldb_res != LDB_SUCCESS) {
- goto failed;
- }
-
- /* look in msg2 to find elements that need to be added or modified */
- for (i=0;i<msg2->num_elements;i++) {
- el = ldb_msg_find_element(msg1, msg2->elements[i].name);
-
- if (el && ldb_msg_element_compare(el, &msg2->elements[i]) == 0) {
- continue;
- }
-
- ldb_res = ldb_msg_add(mod,
- &msg2->elements[i],
- el ? LDB_FLAG_MOD_REPLACE : LDB_FLAG_MOD_ADD);
- if (ldb_res != LDB_SUCCESS) {
- goto failed;
- }
- }
-
- /* look in msg1 to find elements that need to be deleted */
- for (i=0;i<msg1->num_elements;i++) {
- el = ldb_msg_find_element(msg2, msg1->elements[i].name);
- if (el == NULL) {
- ldb_res = ldb_msg_add_empty(mod,
- msg1->elements[i].name,
- LDB_FLAG_MOD_DELETE, NULL);
- if (ldb_res != LDB_SUCCESS) {
- goto failed;
- }
- }
- }
-
- /* steal resulting message into supplied context */
- talloc_steal(mem_ctx, mod);
- *_msg_out = mod;
-
- talloc_free(temp_ctx);
- return LDB_SUCCESS;
-
-failed:
- talloc_free(temp_ctx);
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-
-int ldb_msg_sanity_check(struct ldb_context *ldb,
- const struct ldb_message *msg)
-{
- unsigned int i, j;
-
- /* basic check on DN */
- if (msg->dn == NULL) {
- ldb_set_errstring(ldb, "ldb message lacks a DN!");
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- /* basic syntax checks */
- for (i = 0; i < msg->num_elements; i++) {
- for (j = 0; j < msg->elements[i].num_values; j++) {
- if (msg->elements[i].values[j].length == 0) {
- /* an attribute cannot be empty */
- ldb_asprintf_errstring(ldb, "Element %s has empty attribute in ldb message (%s)!",
- msg->elements[i].name,
- ldb_dn_get_linearized(msg->dn));
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- }
- }
-
- return LDB_SUCCESS;
-}
-
-
-
-
-/*
- copy an attribute list. This only copies the array, not the elements
- (ie. the elements are left as the same pointers)
-*/
-const char **ldb_attr_list_copy(TALLOC_CTX *mem_ctx, const char * const *attrs)
-{
- const char **ret;
- unsigned int i;
-
- for (i=0;attrs && attrs[i];i++) /* noop */ ;
- ret = talloc_array(mem_ctx, const char *, i+1);
- if (ret == NULL) {
- return NULL;
- }
- for (i=0;attrs && attrs[i];i++) {
- ret[i] = attrs[i];
- }
- ret[i] = attrs[i];
- return ret;
-}
-
-
-/*
- copy an attribute list. This only copies the array, not the elements
- (ie. the elements are left as the same pointers). The new attribute is added to the list.
-*/
-const char **ldb_attr_list_copy_add(TALLOC_CTX *mem_ctx, const char * const *attrs, const char *new_attr)
-{
- const char **ret;
- unsigned int i;
- bool found = false;
-
- for (i=0;attrs && attrs[i];i++) {
- if (ldb_attr_cmp(attrs[i], new_attr) == 0) {
- found = true;
- }
- }
- if (found) {
- return ldb_attr_list_copy(mem_ctx, attrs);
- }
- ret = talloc_array(mem_ctx, const char *, i+2);
- if (ret == NULL) {
- return NULL;
- }
- for (i=0;attrs && attrs[i];i++) {
- ret[i] = attrs[i];
- }
- ret[i] = new_attr;
- ret[i+1] = NULL;
- return ret;
-}
-
-
-/*
- return 1 if an attribute is in a list of attributes, or 0 otherwise
-*/
-int ldb_attr_in_list(const char * const *attrs, const char *attr)
-{
- unsigned int i;
- for (i=0;attrs && attrs[i];i++) {
- if (ldb_attr_cmp(attrs[i], attr) == 0) {
- return 1;
- }
- }
- return 0;
-}
-
-
-/*
- rename the specified attribute in a search result
-*/
-int ldb_msg_rename_attr(struct ldb_message *msg, const char *attr, const char *replace)
-{
- struct ldb_message_element *el = ldb_msg_find_element(msg, attr);
- if (el == NULL) {
- return LDB_SUCCESS;
- }
- el->name = talloc_strdup(msg->elements, replace);
- if (el->name == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- return LDB_SUCCESS;
-}
-
-
-/*
- copy the specified attribute in a search result to a new attribute
-*/
-int ldb_msg_copy_attr(struct ldb_message *msg, const char *attr, const char *replace)
-{
- struct ldb_message_element *el = ldb_msg_find_element(msg, attr);
- int ret;
-
- if (el == NULL) {
- return LDB_SUCCESS;
- }
- ret = ldb_msg_add(msg, el, 0);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- return ldb_msg_rename_attr(msg, attr, replace);
-}
-
-/*
- remove the specified element in a search result
-*/
-void ldb_msg_remove_element(struct ldb_message *msg, struct ldb_message_element *el)
-{
- ptrdiff_t n = (el - msg->elements);
- if (n >= msg->num_elements) {
- /* should we abort() here? */
- return;
- }
- if (n != msg->num_elements-1) {
- memmove(el, el+1, ((msg->num_elements-1) - n)*sizeof(*el));
- }
- msg->num_elements--;
-}
-
-
-/*
- remove the specified attribute in a search result
-*/
-void ldb_msg_remove_attr(struct ldb_message *msg, const char *attr)
-{
- struct ldb_message_element *el;
-
- while ((el = ldb_msg_find_element(msg, attr)) != NULL) {
- ldb_msg_remove_element(msg, el);
- }
-}
-
-/*
- return a LDAP formatted GeneralizedTime string
-*/
-char *ldb_timestring(TALLOC_CTX *mem_ctx, time_t t)
-{
- struct tm *tm = gmtime(&t);
- char *ts;
- int r;
-
- if (!tm) {
- return NULL;
- }
-
- /* we now excatly how long this string will be */
- ts = talloc_array(mem_ctx, char, 18);
-
- /* formatted like: 20040408072012.0Z */
- r = snprintf(ts, 18,
- "%04u%02u%02u%02u%02u%02u.0Z",
- tm->tm_year+1900, tm->tm_mon+1,
- tm->tm_mday, tm->tm_hour, tm->tm_min,
- tm->tm_sec);
-
- if (r != 17) {
- talloc_free(ts);
- return NULL;
- }
-
- return ts;
-}
-
-/*
- convert a LDAP GeneralizedTime string to a time_t. Return 0 if unable to convert
-*/
-time_t ldb_string_to_time(const char *s)
-{
- struct tm tm;
-
- if (s == NULL) return 0;
-
- memset(&tm, 0, sizeof(tm));
- if (sscanf(s, "%04u%02u%02u%02u%02u%02u.0Z",
- &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
- &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
- return 0;
- }
- tm.tm_year -= 1900;
- tm.tm_mon -= 1;
-
- return timegm(&tm);
-}
-
-/*
- convert a LDAP GeneralizedTime string in ldb_val format to a
- time_t.
-*/
-int ldb_val_to_time(const struct ldb_val *v, time_t *t)
-{
- struct tm tm;
-
- if (v == NULL || !v->data || v->length < 17) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
-
- memset(&tm, 0, sizeof(tm));
-
- if (sscanf((char *)v->data, "%04u%02u%02u%02u%02u%02u.0Z",
- &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
- &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- tm.tm_year -= 1900;
- tm.tm_mon -= 1;
-
- *t = timegm(&tm);
-
- return LDB_SUCCESS;
-}
-
-/*
- return a LDAP formatted UTCTime string
-*/
-char *ldb_timestring_utc(TALLOC_CTX *mem_ctx, time_t t)
-{
- struct tm *tm = gmtime(&t);
- char *ts;
- int r;
-
- if (!tm) {
- return NULL;
- }
-
- /* we now excatly how long this string will be */
- ts = talloc_array(mem_ctx, char, 14);
-
- /* formatted like: 20040408072012.0Z => 040408072012Z */
- r = snprintf(ts, 14,
- "%02u%02u%02u%02u%02u%02uZ",
- (tm->tm_year+1900)%100, tm->tm_mon+1,
- tm->tm_mday, tm->tm_hour, tm->tm_min,
- tm->tm_sec);
-
- if (r != 13) {
- talloc_free(ts);
- return NULL;
- }
-
- return ts;
-}
-
-/*
- convert a LDAP UTCTime string to a time_t. Return 0 if unable to convert
-*/
-time_t ldb_string_utc_to_time(const char *s)
-{
- struct tm tm;
-
- if (s == NULL) return 0;
-
- memset(&tm, 0, sizeof(tm));
- if (sscanf(s, "%02u%02u%02u%02u%02u%02uZ",
- &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
- &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) {
- return 0;
- }
- if (tm.tm_year < 50) {
- tm.tm_year += 100;
- }
- tm.tm_mon -= 1;
-
- return timegm(&tm);
-}
-
-
-/*
- dump a set of results to a file. Useful from within gdb
-*/
-void ldb_dump_results(struct ldb_context *ldb, struct ldb_result *result, FILE *f)
-{
- unsigned int i;
-
- for (i = 0; i < result->count; i++) {
- struct ldb_ldif ldif;
- fprintf(f, "# record %d\n", i+1);
- ldif.changetype = LDB_CHANGETYPE_NONE;
- ldif.msg = result->msgs[i];
- ldb_ldif_write_file(ldb, f, &ldif);
- }
-}
-
-/*
- checks for a string attribute. Returns "1" on match and otherwise "0".
-*/
-int ldb_msg_check_string_attribute(const struct ldb_message *msg,
- const char *name, const char *value)
-{
- struct ldb_message_element *el;
- struct ldb_val val;
-
- el = ldb_msg_find_element(msg, name);
- if (el == NULL) {
- return 0;
- }
-
- val.data = discard_const_p(uint8_t, value);
- val.length = strlen(value);
-
- if (ldb_msg_find_val(el, &val)) {
- return 1;
- }
-
- return 0;
-}
-
diff --git a/source4/lib/ldb/common/ldb_options.c b/source4/lib/ldb/common/ldb_options.c
deleted file mode 100644
index f07f393562..0000000000
--- a/source4/lib/ldb/common/ldb_options.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2010
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb options[] handling
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb_private.h"
-
-/*
- find an option within an options array
-
- accepts the following forms:
-
- NAME
- NAME:value
- NAME=value
-
- returns a pointer into an element of the options[] array, or NULL is
- not found.
-
- For the NAME form, returns a pointer to an empty string (thus
- allowing for boolean options).
- */
-const char *ldb_options_find(struct ldb_context *ldb, const char *options[],
- const char *option_name)
-{
- size_t len = strlen(option_name);
- int i;
-
- if (options == NULL) {
- return NULL;
- }
-
- for (i=0; options[i]; i++) {
- if (strncmp(option_name, options[i], len) != 0) {
- continue;
- }
- if (options[i][len] == ':' || options[i][len] == '=') {
- return &options[i][len+1];
- }
- if (options[i][len] == 0) {
- return &options[i][len];
- }
- }
-
- return NULL;
-}
diff --git a/source4/lib/ldb/common/ldb_parse.c b/source4/lib/ldb/common/ldb_parse.c
deleted file mode 100644
index b4eabf8375..0000000000
--- a/source4/lib/ldb/common/ldb_parse.c
+++ /dev/null
@@ -1,903 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb expression parsing
- *
- * Description: parse LDAP-like search expressions
- *
- * Author: Andrew Tridgell
- */
-
-/*
- TODO:
- - add RFC2254 binary string handling
- - possibly add ~=, <= and >= handling
- - expand the test suite
- - add better parse error handling
-
-*/
-
-#include "ldb_private.h"
-#include "system/locale.h"
-
-static int ldb_parse_hex2char(const char *x)
-{
- if (isxdigit(x[0]) && isxdigit(x[1])) {
- const char h1 = x[0], h2 = x[1];
- int c = 0;
-
- if (h1 >= 'a') c = h1 - (int)'a' + 10;
- else if (h1 >= 'A') c = h1 - (int)'A' + 10;
- else if (h1 >= '0') c = h1 - (int)'0';
- c = c << 4;
- if (h2 >= 'a') c += h2 - (int)'a' + 10;
- else if (h2 >= 'A') c += h2 - (int)'A' + 10;
- else if (h2 >= '0') c += h2 - (int)'0';
-
- return c;
- }
-
- return -1;
-}
-
-/*
-a filter is defined by:
- <filter> ::= '(' <filtercomp> ')'
- <filtercomp> ::= <and> | <or> | <not> | <simple>
- <and> ::= '&' <filterlist>
- <or> ::= '|' <filterlist>
- <not> ::= '!' <filter>
- <filterlist> ::= <filter> | <filter> <filterlist>
- <simple> ::= <attributetype> <filtertype> <attributevalue>
- <filtertype> ::= '=' | '~=' | '<=' | '>='
-*/
-
-/*
- decode a RFC2254 binary string representation of a buffer.
- Used in LDAP filters.
-*/
-struct ldb_val ldb_binary_decode(TALLOC_CTX *mem_ctx, const char *str)
-{
- size_t i, j;
- struct ldb_val ret;
- size_t slen = str?strlen(str):0;
-
- ret.data = (uint8_t *)talloc_size(mem_ctx, slen+1);
- ret.length = 0;
- if (ret.data == NULL) return ret;
-
- for (i=j=0;i<slen;i++) {
- if (str[i] == '\\') {
- int c;
-
- c = ldb_parse_hex2char(&str[i+1]);
- if (c == -1) {
- talloc_free(ret.data);
- memset(&ret, 0, sizeof(ret));
- return ret;
- }
- ((uint8_t *)ret.data)[j++] = c;
- i += 2;
- } else {
- ((uint8_t *)ret.data)[j++] = str[i];
- }
- }
- ret.length = j;
- ((uint8_t *)ret.data)[j] = 0;
-
- return ret;
-}
-
-
-/*
- encode a blob as a RFC2254 binary string, escaping any
- non-printable or '\' characters
-*/
-char *ldb_binary_encode(TALLOC_CTX *mem_ctx, struct ldb_val val)
-{
- size_t i;
- char *ret;
- size_t len = val.length;
- unsigned char *buf = val.data;
-
- for (i=0;i<val.length;i++) {
- if (!isprint(buf[i]) || strchr(" *()\\&|!\"", buf[i])) {
- len += 2;
- }
- }
- ret = talloc_array(mem_ctx, char, len+1);
- if (ret == NULL) return NULL;
-
- len = 0;
- for (i=0;i<val.length;i++) {
- if (!isprint(buf[i]) || strchr(" *()\\&|!\"", buf[i])) {
- snprintf(ret+len, 4, "\\%02X", buf[i]);
- len += 3;
- } else {
- ret[len++] = buf[i];
- }
- }
-
- ret[len] = 0;
-
- return ret;
-}
-
-/*
- encode a string as a RFC2254 binary string, escaping any
- non-printable or '\' characters. This routine is suitable for use
- in escaping user data in ldap filters.
-*/
-char *ldb_binary_encode_string(TALLOC_CTX *mem_ctx, const char *string)
-{
- struct ldb_val val;
- if (string == NULL) {
- return NULL;
- }
- val.data = discard_const_p(uint8_t, string);
- val.length = strlen(string);
- return ldb_binary_encode(mem_ctx, val);
-}
-
-/* find the first matching wildcard */
-static char *ldb_parse_find_wildcard(char *value)
-{
- while (*value) {
- value = strpbrk(value, "\\*");
- if (value == NULL) return NULL;
-
- if (value[0] == '\\') {
- if (value[1] == '\0') return NULL;
- value += 2;
- continue;
- }
-
- if (value[0] == '*') return value;
- }
-
- return NULL;
-}
-
-/* return a NULL terminated list of binary strings representing the value
- chunks separated by wildcards that makes the value portion of the filter
-*/
-static struct ldb_val **ldb_wildcard_decode(TALLOC_CTX *mem_ctx, const char *string)
-{
- struct ldb_val **ret = NULL;
- unsigned int val = 0;
- char *wc, *str;
-
- wc = talloc_strdup(mem_ctx, string);
- if (wc == NULL) return NULL;
-
- while (wc && *wc) {
- str = wc;
- wc = ldb_parse_find_wildcard(str);
- if (wc && *wc) {
- if (wc == str) {
- wc++;
- continue;
- }
- *wc = 0;
- wc++;
- }
-
- ret = talloc_realloc(mem_ctx, ret, struct ldb_val *, val + 2);
- if (ret == NULL) return NULL;
-
- ret[val] = talloc(mem_ctx, struct ldb_val);
- if (ret[val] == NULL) return NULL;
-
- *(ret[val]) = ldb_binary_decode(mem_ctx, str);
- if ((ret[val])->data == NULL) return NULL;
-
- val++;
- }
-
- if (ret != NULL) {
- ret[val] = NULL;
- }
-
- return ret;
-}
-
-static struct ldb_parse_tree *ldb_parse_filter(TALLOC_CTX *mem_ctx, const char **s);
-
-
-/*
- parse an extended match
-
- possible forms:
- (attr:oid:=value)
- (attr:dn:oid:=value)
- (attr:dn:=value)
- (:dn:oid:=value)
-
- the ':dn' part sets the dnAttributes boolean if present
- the oid sets the rule_id string
-
-*/
-static struct ldb_parse_tree *ldb_parse_extended(struct ldb_parse_tree *ret,
- char *attr, char *value)
-{
- char *p1, *p2;
-
- ret->operation = LDB_OP_EXTENDED;
- ret->u.extended.value = ldb_binary_decode(ret, value);
- if (ret->u.extended.value.data == NULL) goto failed;
-
- p1 = strchr(attr, ':');
- if (p1 == NULL) goto failed;
- p2 = strchr(p1+1, ':');
-
- *p1 = 0;
- if (p2) *p2 = 0;
-
- ret->u.extended.attr = attr;
- if (strcmp(p1+1, "dn") == 0) {
- ret->u.extended.dnAttributes = 1;
- if (p2) {
- ret->u.extended.rule_id = talloc_strdup(ret, p2+1);
- if (ret->u.extended.rule_id == NULL) goto failed;
- } else {
- ret->u.extended.rule_id = NULL;
- }
- } else {
- ret->u.extended.dnAttributes = 0;
- ret->u.extended.rule_id = talloc_strdup(ret, p1+1);
- if (ret->u.extended.rule_id == NULL) goto failed;
- }
-
- return ret;
-
-failed:
- talloc_free(ret);
- return NULL;
-}
-
-static enum ldb_parse_op ldb_parse_filtertype(TALLOC_CTX *mem_ctx, char **type, char **value, const char **s)
-{
- enum ldb_parse_op filter = 0;
- char *name, *val, *k;
- const char *p = *s;
- const char *t, *t1;
-
- /* retrieve attributetype name */
- t = p;
-
- if (*p == '@') { /* for internal attributes the first char can be @ */
- p++;
- }
-
- while ((isascii(*p) && isalnum((unsigned char)*p)) || (*p == '-') || (*p == '.')) {
- /* attribute names can only be alphanums */
- p++;
- }
-
- if (*p == ':') { /* but extended searches have : and . chars too */
- p = strstr(p, ":=");
- if (p == NULL) { /* malformed attribute name */
- return 0;
- }
- }
-
- t1 = p;
-
- while (isspace((unsigned char)*p)) p++;
-
- if (!strchr("=<>~:", *p)) {
- return 0;
- }
-
- /* save name */
- name = (char *)talloc_memdup(mem_ctx, t, t1 - t + 1);
- if (name == NULL) return 0;
- name[t1 - t] = '\0';
-
- /* retrieve filtertype */
-
- if (*p == '=') {
- filter = LDB_OP_EQUALITY;
- } else if (*(p + 1) == '=') {
- switch (*p) {
- case '<':
- filter = LDB_OP_LESS;
- p++;
- break;
- case '>':
- filter = LDB_OP_GREATER;
- p++;
- break;
- case '~':
- filter = LDB_OP_APPROX;
- p++;
- break;
- case ':':
- filter = LDB_OP_EXTENDED;
- p++;
- break;
- }
- }
- if (!filter) {
- talloc_free(name);
- return filter;
- }
- p++;
-
- while (isspace((unsigned char)*p)) p++;
-
- /* retrieve value */
- t = p;
-
- while (*p && ((*p != ')') || ((*p == ')') && (*(p - 1) == '\\')))) p++;
-
- val = (char *)talloc_memdup(mem_ctx, t, p - t + 1);
- if (val == NULL) {
- talloc_free(name);
- return 0;
- }
- val[p - t] = '\0';
-
- k = &(val[p - t]);
-
- /* remove trailing spaces from value */
- while ((k > val) && (isspace((unsigned char)*(k - 1)))) k--;
- *k = '\0';
-
- *type = name;
- *value = val;
- *s = p;
- return filter;
-}
-
-/*
- <simple> ::= <attributetype> <filtertype> <attributevalue>
-*/
-static struct ldb_parse_tree *ldb_parse_simple(TALLOC_CTX *mem_ctx, const char **s)
-{
- char *attr, *value;
- struct ldb_parse_tree *ret;
- enum ldb_parse_op filtertype;
-
- ret = talloc(mem_ctx, struct ldb_parse_tree);
- if (!ret) {
- errno = ENOMEM;
- return NULL;
- }
-
- filtertype = ldb_parse_filtertype(ret, &attr, &value, s);
- if (!filtertype) {
- talloc_free(ret);
- return NULL;
- }
-
- switch (filtertype) {
-
- case LDB_OP_PRESENT:
- ret->operation = LDB_OP_PRESENT;
- ret->u.present.attr = attr;
- break;
-
- case LDB_OP_EQUALITY:
-
- if (strcmp(value, "*") == 0) {
- ret->operation = LDB_OP_PRESENT;
- ret->u.present.attr = attr;
- break;
- }
-
- if (ldb_parse_find_wildcard(value) != NULL) {
- ret->operation = LDB_OP_SUBSTRING;
- ret->u.substring.attr = attr;
- ret->u.substring.start_with_wildcard = 0;
- ret->u.substring.end_with_wildcard = 0;
- ret->u.substring.chunks = ldb_wildcard_decode(ret, value);
- if (ret->u.substring.chunks == NULL){
- talloc_free(ret);
- return NULL;
- }
- if (value[0] == '*')
- ret->u.substring.start_with_wildcard = 1;
- if (value[strlen(value) - 1] == '*')
- ret->u.substring.end_with_wildcard = 1;
- talloc_free(value);
-
- break;
- }
-
- ret->operation = LDB_OP_EQUALITY;
- ret->u.equality.attr = attr;
- ret->u.equality.value = ldb_binary_decode(ret, value);
- if (ret->u.equality.value.data == NULL) {
- talloc_free(ret);
- return NULL;
- }
- talloc_free(value);
- break;
-
- case LDB_OP_GREATER:
- ret->operation = LDB_OP_GREATER;
- ret->u.comparison.attr = attr;
- ret->u.comparison.value = ldb_binary_decode(ret, value);
- if (ret->u.comparison.value.data == NULL) {
- talloc_free(ret);
- return NULL;
- }
- talloc_free(value);
- break;
-
- case LDB_OP_LESS:
- ret->operation = LDB_OP_LESS;
- ret->u.comparison.attr = attr;
- ret->u.comparison.value = ldb_binary_decode(ret, value);
- if (ret->u.comparison.value.data == NULL) {
- talloc_free(ret);
- return NULL;
- }
- talloc_free(value);
- break;
-
- case LDB_OP_APPROX:
- ret->operation = LDB_OP_APPROX;
- ret->u.comparison.attr = attr;
- ret->u.comparison.value = ldb_binary_decode(ret, value);
- if (ret->u.comparison.value.data == NULL) {
- talloc_free(ret);
- return NULL;
- }
- talloc_free(value);
- break;
-
- case LDB_OP_EXTENDED:
-
- ret = ldb_parse_extended(ret, attr, value);
- break;
-
- default:
- talloc_free(ret);
- return NULL;
- }
-
- return ret;
-}
-
-
-/*
- parse a filterlist
- <and> ::= '&' <filterlist>
- <or> ::= '|' <filterlist>
- <filterlist> ::= <filter> | <filter> <filterlist>
-*/
-static struct ldb_parse_tree *ldb_parse_filterlist(TALLOC_CTX *mem_ctx, const char **s)
-{
- struct ldb_parse_tree *ret, *next;
- enum ldb_parse_op op;
- const char *p = *s;
-
- switch (*p) {
- case '&':
- op = LDB_OP_AND;
- break;
- case '|':
- op = LDB_OP_OR;
- break;
- default:
- return NULL;
- }
- p++;
-
- while (isspace((unsigned char)*p)) p++;
-
- ret = talloc(mem_ctx, struct ldb_parse_tree);
- if (!ret) {
- errno = ENOMEM;
- return NULL;
- }
-
- ret->operation = op;
- ret->u.list.num_elements = 1;
- ret->u.list.elements = talloc(ret, struct ldb_parse_tree *);
- if (!ret->u.list.elements) {
- errno = ENOMEM;
- talloc_free(ret);
- return NULL;
- }
-
- ret->u.list.elements[0] = ldb_parse_filter(ret->u.list.elements, &p);
- if (!ret->u.list.elements[0]) {
- talloc_free(ret);
- return NULL;
- }
-
- while (isspace((unsigned char)*p)) p++;
-
- while (*p && (next = ldb_parse_filter(ret->u.list.elements, &p))) {
- struct ldb_parse_tree **e;
- e = talloc_realloc(ret, ret->u.list.elements,
- struct ldb_parse_tree *,
- ret->u.list.num_elements + 1);
- if (!e) {
- errno = ENOMEM;
- talloc_free(ret);
- return NULL;
- }
- ret->u.list.elements = e;
- ret->u.list.elements[ret->u.list.num_elements] = next;
- ret->u.list.num_elements++;
- while (isspace((unsigned char)*p)) p++;
- }
-
- *s = p;
-
- return ret;
-}
-
-
-/*
- <not> ::= '!' <filter>
-*/
-static struct ldb_parse_tree *ldb_parse_not(TALLOC_CTX *mem_ctx, const char **s)
-{
- struct ldb_parse_tree *ret;
- const char *p = *s;
-
- if (*p != '!') {
- return NULL;
- }
- p++;
-
- ret = talloc(mem_ctx, struct ldb_parse_tree);
- if (!ret) {
- errno = ENOMEM;
- return NULL;
- }
-
- ret->operation = LDB_OP_NOT;
- ret->u.isnot.child = ldb_parse_filter(ret, &p);
- if (!ret->u.isnot.child) {
- talloc_free(ret);
- return NULL;
- }
-
- *s = p;
-
- return ret;
-}
-
-/*
- parse a filtercomp
- <filtercomp> ::= <and> | <or> | <not> | <simple>
-*/
-static struct ldb_parse_tree *ldb_parse_filtercomp(TALLOC_CTX *mem_ctx, const char **s)
-{
- struct ldb_parse_tree *ret;
- const char *p = *s;
-
- while (isspace((unsigned char)*p)) p++;
-
- switch (*p) {
- case '&':
- ret = ldb_parse_filterlist(mem_ctx, &p);
- break;
-
- case '|':
- ret = ldb_parse_filterlist(mem_ctx, &p);
- break;
-
- case '!':
- ret = ldb_parse_not(mem_ctx, &p);
- break;
-
- case '(':
- case ')':
- return NULL;
-
- default:
- ret = ldb_parse_simple(mem_ctx, &p);
-
- }
-
- *s = p;
- return ret;
-}
-
-
-/*
- <filter> ::= '(' <filtercomp> ')'
-*/
-static struct ldb_parse_tree *ldb_parse_filter(TALLOC_CTX *mem_ctx, const char **s)
-{
- struct ldb_parse_tree *ret;
- const char *p = *s;
-
- if (*p != '(') {
- return NULL;
- }
- p++;
-
- ret = ldb_parse_filtercomp(mem_ctx, &p);
-
- if (*p != ')') {
- return NULL;
- }
- p++;
-
- while (isspace((unsigned char)*p)) {
- p++;
- }
-
- *s = p;
-
- return ret;
-}
-
-
-/*
- main parser entry point. Takes a search string and returns a parse tree
-
- expression ::= <simple> | <filter>
-*/
-struct ldb_parse_tree *ldb_parse_tree(TALLOC_CTX *mem_ctx, const char *s)
-{
- if (s == NULL || *s == 0) {
- s = "(|(objectClass=*)(distinguishedName=*))";
- }
-
- while (isspace((unsigned char)*s)) s++;
-
- if (*s == '(') {
- return ldb_parse_filter(mem_ctx, &s);
- }
-
- return ldb_parse_simple(mem_ctx, &s);
-}
-
-
-/*
- construct a ldap parse filter given a parse tree
-*/
-char *ldb_filter_from_tree(TALLOC_CTX *mem_ctx, const struct ldb_parse_tree *tree)
-{
- char *s, *s2, *ret;
- unsigned int i;
-
- if (tree == NULL) {
- return NULL;
- }
-
- switch (tree->operation) {
- case LDB_OP_AND:
- case LDB_OP_OR:
- ret = talloc_asprintf(mem_ctx, "(%c", tree->operation==LDB_OP_AND?'&':'|');
- if (ret == NULL) return NULL;
- for (i=0;i<tree->u.list.num_elements;i++) {
- s = ldb_filter_from_tree(mem_ctx, tree->u.list.elements[i]);
- if (s == NULL) {
- talloc_free(ret);
- return NULL;
- }
- s2 = talloc_asprintf_append(ret, "%s", s);
- talloc_free(s);
- if (s2 == NULL) {
- talloc_free(ret);
- return NULL;
- }
- ret = s2;
- }
- s = talloc_asprintf_append(ret, ")");
- if (s == NULL) {
- talloc_free(ret);
- return NULL;
- }
- return s;
- case LDB_OP_NOT:
- s = ldb_filter_from_tree(mem_ctx, tree->u.isnot.child);
- if (s == NULL) return NULL;
-
- ret = talloc_asprintf(mem_ctx, "(!%s)", s);
- talloc_free(s);
- return ret;
- case LDB_OP_EQUALITY:
- s = ldb_binary_encode(mem_ctx, tree->u.equality.value);
- if (s == NULL) return NULL;
- ret = talloc_asprintf(mem_ctx, "(%s=%s)",
- tree->u.equality.attr, s);
- talloc_free(s);
- return ret;
- case LDB_OP_SUBSTRING:
- ret = talloc_asprintf(mem_ctx, "(%s=%s", tree->u.substring.attr,
- tree->u.substring.start_with_wildcard?"*":"");
- if (ret == NULL) return NULL;
- for (i = 0; tree->u.substring.chunks[i]; i++) {
- s2 = ldb_binary_encode(mem_ctx, *(tree->u.substring.chunks[i]));
- if (s2 == NULL) {
- talloc_free(ret);
- return NULL;
- }
- if (tree->u.substring.chunks[i+1] ||
- tree->u.substring.end_with_wildcard) {
- s = talloc_asprintf_append(ret, "%s*", s2);
- } else {
- s = talloc_asprintf_append(ret, "%s", s2);
- }
- if (s == NULL) {
- talloc_free(ret);
- return NULL;
- }
- ret = s;
- }
- s = talloc_asprintf_append(ret, ")");
- if (s == NULL) {
- talloc_free(ret);
- return NULL;
- }
- ret = s;
- return ret;
- case LDB_OP_GREATER:
- s = ldb_binary_encode(mem_ctx, tree->u.equality.value);
- if (s == NULL) return NULL;
- ret = talloc_asprintf(mem_ctx, "(%s>=%s)",
- tree->u.equality.attr, s);
- talloc_free(s);
- return ret;
- case LDB_OP_LESS:
- s = ldb_binary_encode(mem_ctx, tree->u.equality.value);
- if (s == NULL) return NULL;
- ret = talloc_asprintf(mem_ctx, "(%s<=%s)",
- tree->u.equality.attr, s);
- talloc_free(s);
- return ret;
- case LDB_OP_PRESENT:
- ret = talloc_asprintf(mem_ctx, "(%s=*)", tree->u.present.attr);
- return ret;
- case LDB_OP_APPROX:
- s = ldb_binary_encode(mem_ctx, tree->u.equality.value);
- if (s == NULL) return NULL;
- ret = talloc_asprintf(mem_ctx, "(%s~=%s)",
- tree->u.equality.attr, s);
- talloc_free(s);
- return ret;
- case LDB_OP_EXTENDED:
- s = ldb_binary_encode(mem_ctx, tree->u.extended.value);
- if (s == NULL) return NULL;
- ret = talloc_asprintf(mem_ctx, "(%s%s%s%s:=%s)",
- tree->u.extended.attr?tree->u.extended.attr:"",
- tree->u.extended.dnAttributes?":dn":"",
- tree->u.extended.rule_id?":":"",
- tree->u.extended.rule_id?tree->u.extended.rule_id:"",
- s);
- talloc_free(s);
- return ret;
- }
-
- return NULL;
-}
-
-
-/*
- replace any occurrences of an attribute name in the parse tree with a
- new name
-*/
-void ldb_parse_tree_attr_replace(struct ldb_parse_tree *tree,
- const char *attr,
- const char *replace)
-{
- unsigned int i;
- switch (tree->operation) {
- case LDB_OP_AND:
- case LDB_OP_OR:
- for (i=0;i<tree->u.list.num_elements;i++) {
- ldb_parse_tree_attr_replace(tree->u.list.elements[i],
- attr, replace);
- }
- break;
- case LDB_OP_NOT:
- ldb_parse_tree_attr_replace(tree->u.isnot.child, attr, replace);
- break;
- case LDB_OP_EQUALITY:
- case LDB_OP_GREATER:
- case LDB_OP_LESS:
- case LDB_OP_APPROX:
- if (ldb_attr_cmp(tree->u.equality.attr, attr) == 0) {
- tree->u.equality.attr = replace;
- }
- break;
- case LDB_OP_SUBSTRING:
- if (ldb_attr_cmp(tree->u.substring.attr, attr) == 0) {
- tree->u.substring.attr = replace;
- }
- break;
- case LDB_OP_PRESENT:
- if (ldb_attr_cmp(tree->u.present.attr, attr) == 0) {
- tree->u.present.attr = replace;
- }
- break;
- case LDB_OP_EXTENDED:
- if (tree->u.extended.attr &&
- ldb_attr_cmp(tree->u.extended.attr, attr) == 0) {
- tree->u.extended.attr = replace;
- }
- break;
- }
-}
-
-/*
- shallow copy a tree - copying only the elements array so that the caller
- can safely add new elements without changing the message
-*/
-struct ldb_parse_tree *ldb_parse_tree_copy_shallow(TALLOC_CTX *mem_ctx,
- const struct ldb_parse_tree *ot)
-{
- unsigned int i;
- struct ldb_parse_tree *nt;
-
- nt = talloc(mem_ctx, struct ldb_parse_tree);
- if (!nt) {
- return NULL;
- }
-
- *nt = *ot;
-
- switch (ot->operation) {
- case LDB_OP_AND:
- case LDB_OP_OR:
- nt->u.list.elements = talloc_array(nt, struct ldb_parse_tree *,
- ot->u.list.num_elements);
- if (!nt->u.list.elements) {
- talloc_free(nt);
- return NULL;
- }
-
- for (i=0;i<ot->u.list.num_elements;i++) {
- nt->u.list.elements[i] =
- ldb_parse_tree_copy_shallow(nt->u.list.elements,
- ot->u.list.elements[i]);
- if (!nt->u.list.elements[i]) {
- talloc_free(nt);
- return NULL;
- }
- }
- break;
- case LDB_OP_NOT:
- nt->u.isnot.child = ldb_parse_tree_copy_shallow(nt,
- ot->u.isnot.child);
- if (!nt->u.isnot.child) {
- talloc_free(nt);
- return NULL;
- }
- break;
- case LDB_OP_EQUALITY:
- case LDB_OP_GREATER:
- case LDB_OP_LESS:
- case LDB_OP_APPROX:
- case LDB_OP_SUBSTRING:
- case LDB_OP_PRESENT:
- case LDB_OP_EXTENDED:
- break;
- }
-
- return nt;
-}
diff --git a/source4/lib/ldb/common/ldb_utf8.c b/source4/lib/ldb/common/ldb_utf8.c
deleted file mode 100644
index 55d8f905d3..0000000000
--- a/source4/lib/ldb/common/ldb_utf8.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb utf8 handling
- *
- * Description: case folding and case comparison for UTF8 strings
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb_private.h"
-#include "system/locale.h"
-
-
-/*
- this allow the user to pass in a caseless comparison
- function to handle utf8 caseless comparisons
- */
-void ldb_set_utf8_fns(struct ldb_context *ldb,
- void *context,
- char *(*casefold)(void *, void *, const char *, size_t))
-{
- if (context)
- ldb->utf8_fns.context = context;
- if (casefold)
- ldb->utf8_fns.casefold = casefold;
-}
-
-/*
- a simple case folding function
- NOTE: does not handle UTF8
-*/
-char *ldb_casefold_default(void *context, TALLOC_CTX *mem_ctx, const char *s, size_t n)
-{
- size_t i;
- char *ret = talloc_strndup(mem_ctx, s, n);
- if (!s) {
- errno = ENOMEM;
- return NULL;
- }
- for (i=0;ret[i];i++) {
- ret[i] = toupper((unsigned char)ret[i]);
- }
- return ret;
-}
-
-void ldb_set_utf8_default(struct ldb_context *ldb)
-{
- ldb_set_utf8_fns(ldb, NULL, ldb_casefold_default);
-}
-
-char *ldb_casefold(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char *s, size_t n)
-{
- return ldb->utf8_fns.casefold(ldb->utf8_fns.context, mem_ctx, s, n);
-}
-
-/*
- check the attribute name is valid according to rfc2251
- returns 1 if the name is ok
- */
-
-int ldb_valid_attr_name(const char *s)
-{
- size_t i;
-
- if (!s || !s[0])
- return 0;
-
- /* handle special ldb_tdb wildcard */
- if (strcmp(s, "*") == 0) return 1;
-
- for (i = 0; s[i]; i++) {
- if (! isascii(s[i])) {
- return 0;
- }
- if (i == 0) { /* first char must be an alpha (or our special '@' identifier) */
- if (! (isalpha(s[i]) || (s[i] == '@'))) {
- return 0;
- }
- } else {
- if (! (isalnum(s[i]) || (s[i] == '-'))) {
- return 0;
- }
- }
- }
- return 1;
-}
-
-char *ldb_attr_casefold(TALLOC_CTX *mem_ctx, const char *s)
-{
- size_t i;
- char *ret = talloc_strdup(mem_ctx, s);
- if (!ret) {
- errno = ENOMEM;
- return NULL;
- }
- for (i = 0; ret[i]; i++) {
- ret[i] = toupper((unsigned char)ret[i]);
- }
- return ret;
-}
-
-/*
- we accept either 'dn' or 'distinguishedName' for a distinguishedName
-*/
-int ldb_attr_dn(const char *attr)
-{
- if (ldb_attr_cmp(attr, "dn") == 0 ||
- ldb_attr_cmp(attr, "distinguishedName") == 0) {
- return 0;
- }
- return -1;
-}
diff --git a/source4/lib/ldb/common/qsort.c b/source4/lib/ldb/common/qsort.c
deleted file mode 100644
index 1a0b886b8c..0000000000
--- a/source4/lib/ldb/common/qsort.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* Copyright (C) 1991,1992,1996,1997,1999,2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Written by Douglas C. Schmidt (schmidt@ics.uci.edu).
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */
-
-/* If you consider tuning this algorithm, you should consult first:
- Engineering a sort function; Jon Bentley and M. Douglas McIlroy;
- Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993. */
-
-/* Modified to be used in samba4 by
- * Simo Sorce <idra@samba.org> 2005
- */
-
-#include "ldb_private.h"
-
-/* Byte-wise swap two items of size SIZE. */
-#define SWAP(a, b, size) \
- do \
- { \
- register size_t __size = (size); \
- register char *__a = (a), *__b = (b); \
- do \
- { \
- char __tmp = *__a; \
- *__a++ = *__b; \
- *__b++ = __tmp; \
- } while (--__size > 0); \
- } while (0)
-
-/* Discontinue quicksort algorithm when partition gets below this size.
- This particular magic number was chosen to work best on a Sun 4/260. */
-#define MAX_THRESH 4
-
-/* Stack node declarations used to store unfulfilled partition obligations. */
-typedef struct
- {
- char *lo;
- char *hi;
- } stack_node;
-
-/* The next 4 #defines implement a very fast in-line stack abstraction. */
-/* The stack needs log (total_elements) entries (we could even subtract
- log(MAX_THRESH)). Since total_elements has type size_t, we get as
- upper bound for log (total_elements):
- bits per byte (CHAR_BIT) * sizeof(size_t). */
-#ifndef CHAR_BIT
-#define CHAR_BIT 8
-#endif
-#define STACK_SIZE (CHAR_BIT * sizeof(size_t))
-#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top))
-#define POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi)))
-#define STACK_NOT_EMPTY (stack < top)
-
-
-/* Order size using quicksort. This implementation incorporates
- four optimizations discussed in Sedgewick:
-
- 1. Non-recursive, using an explicit stack of pointer that store the
- next array partition to sort. To save time, this maximum amount
- of space required to store an array of SIZE_MAX is allocated on the
- stack. Assuming a 32-bit (64 bit) integer for size_t, this needs
- only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
- Pretty cheap, actually.
-
- 2. Chose the pivot element using a median-of-three decision tree.
- This reduces the probability of selecting a bad pivot value and
- eliminates certain extraneous comparisons.
-
- 3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
- insertion sort to order the MAX_THRESH items within each partition.
- This is a big win, since insertion sort is faster for small, mostly
- sorted array segments.
-
- 4. The larger of the two sub-partitions is always pushed onto the
- stack first, with the algorithm then concentrating on the
- smaller partition. This *guarantees* no more than log (total_elems)
- stack size is needed (actually O(1) in this case)! */
-
-void ldb_qsort (void *const pbase, size_t total_elems, size_t size,
- void *opaque, ldb_qsort_cmp_fn_t cmp)
-{
- register char *base_ptr = (char *) pbase;
-
- const size_t max_thresh = MAX_THRESH * size;
-
- if (total_elems == 0)
- /* Avoid lossage with unsigned arithmetic below. */
- return;
-
- if (total_elems > MAX_THRESH)
- {
- char *lo = base_ptr;
- char *hi = &lo[size * (total_elems - 1)];
- stack_node stack[STACK_SIZE];
- stack_node *top = stack;
-
- PUSH (NULL, NULL);
-
- while (STACK_NOT_EMPTY)
- {
- char *left_ptr;
- char *right_ptr;
-
- /* Select median value from among LO, MID, and HI. Rearrange
- LO and HI so the three values are sorted. This lowers the
- probability of picking a pathological pivot value and
- skips a comparison for both the LEFT_PTR and RIGHT_PTR in
- the while loops. */
-
- char *mid = lo + size * ((hi - lo) / size >> 1);
-
- if ((*cmp) ((void *) mid, (void *) lo, opaque) < 0)
- SWAP (mid, lo, size);
- if ((*cmp) ((void *) hi, (void *) mid, opaque) < 0)
- SWAP (mid, hi, size);
- else
- goto jump_over;
- if ((*cmp) ((void *) mid, (void *) lo, opaque) < 0)
- SWAP (mid, lo, size);
- jump_over:;
-
- left_ptr = lo + size;
- right_ptr = hi - size;
-
- /* Here's the famous ``collapse the walls'' section of quicksort.
- Gotta like those tight inner loops! They are the main reason
- that this algorithm runs much faster than others. */
- do
- {
- while ((*cmp) ((void *) left_ptr, (void *) mid, opaque) < 0)
- left_ptr += size;
-
- while ((*cmp) ((void *) mid, (void *) right_ptr, opaque) < 0)
- right_ptr -= size;
-
- if (left_ptr < right_ptr)
- {
- SWAP (left_ptr, right_ptr, size);
- if (mid == left_ptr)
- mid = right_ptr;
- else if (mid == right_ptr)
- mid = left_ptr;
- left_ptr += size;
- right_ptr -= size;
- }
- else if (left_ptr == right_ptr)
- {
- left_ptr += size;
- right_ptr -= size;
- break;
- }
- }
- while (left_ptr <= right_ptr);
-
- /* Set up pointers for next iteration. First determine whether
- left and right partitions are below the threshold size. If so,
- ignore one or both. Otherwise, push the larger partition's
- bounds on the stack and continue sorting the smaller one. */
-
- if ((size_t) (right_ptr - lo) <= max_thresh)
- {
- if ((size_t) (hi - left_ptr) <= max_thresh)
- /* Ignore both small partitions. */
- POP (lo, hi);
- else
- /* Ignore small left partition. */
- lo = left_ptr;
- }
- else if ((size_t) (hi - left_ptr) <= max_thresh)
- /* Ignore small right partition. */
- hi = right_ptr;
- else if ((right_ptr - lo) > (hi - left_ptr))
- {
- /* Push larger left partition indices. */
- PUSH (lo, right_ptr);
- lo = left_ptr;
- }
- else
- {
- /* Push larger right partition indices. */
- PUSH (left_ptr, hi);
- hi = right_ptr;
- }
- }
- }
-
- /* Once the BASE_PTR array is partially sorted by quicksort the rest
- is completely sorted using insertion sort, since this is efficient
- for partitions below MAX_THRESH size. BASE_PTR points to the beginning
- of the array to sort, and END_PTR points at the very last element in
- the array (*not* one beyond it!). */
-
-#define min(x, y) ((x) < (y) ? (x) : (y))
-
- {
- char *const end_ptr = &base_ptr[size * (total_elems - 1)];
- char *tmp_ptr = base_ptr;
- char *thresh = min(end_ptr, base_ptr + max_thresh);
- register char *run_ptr;
-
- /* Find smallest element in first threshold and place it at the
- array's beginning. This is the smallest array element,
- and the operation speeds up insertion sort's inner loop. */
-
- for (run_ptr = tmp_ptr + size; run_ptr <= thresh; run_ptr += size)
- if ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, opaque) < 0)
- tmp_ptr = run_ptr;
-
- if (tmp_ptr != base_ptr)
- SWAP (tmp_ptr, base_ptr, size);
-
- /* Insertion sort, running from left-hand-side up to right-hand-side. */
-
- run_ptr = base_ptr + size;
- while ((run_ptr += size) <= end_ptr)
- {
- tmp_ptr = run_ptr - size;
- while ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, opaque) < 0)
- tmp_ptr -= size;
-
- tmp_ptr += size;
- if (tmp_ptr != run_ptr)
- {
- char *trav;
-
- trav = run_ptr + size;
- while (--trav >= run_ptr)
- {
- char c = *trav;
- char *hi, *lo;
-
- for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo)
- *hi = *lo;
- *hi = c;
- }
- }
- }
- }
-}
diff --git a/source4/lib/ldb/configure b/source4/lib/ldb/configure
deleted file mode 100755
index 137a26bcbe..0000000000
--- a/source4/lib/ldb/configure
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-
-PREVPATH=`dirname $0`
-
-if [ -f $PREVPATH/../../../buildtools/bin/waf ]; then
- WAF=../../../buildtools/bin/waf
-elif [ -f $PREVPATH/buildtools/bin/waf ]; then
- WAF=./buildtools/bin/waf
-else
- echo "ldb: Unable to find waf"
- exit 1
-fi
-
-# using JOBS=1 gives maximum compatibility with
-# systems like AIX which have broken threading in python
-JOBS=1
-export JOBS
-
-cd . || exit 1
-$WAF configure "$@" || exit 1
-cd $PREVPATH
diff --git a/source4/lib/ldb/docs/builddocs.sh b/source4/lib/ldb/docs/builddocs.sh
deleted file mode 100755
index 449dcb2681..0000000000
--- a/source4/lib/ldb/docs/builddocs.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh
-# build ldb docs
-# tridge@samba.org August 2006
-
-XSLTPROC="$1"
-SRCDIR="$2"
-
-if [ -z "$XSLTPROC" ] || [ ! -x "$XSLTPROC" ]; then
- echo "xsltproc not installed"
- exit 0
-fi
-
-MANXSL="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"
-HTMLXSL="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"
-
-mkdir -p man
-
-for f in $SRCDIR/man/*.xml; do
- base=`basename $f .xml`
- out=man/"`basename $base`"
- if [ ! -f "$out" ] || [ "$f" -nt "$out" ]; then
- echo Processing manpage $f
- $XSLTPROC --nonet -o "$out" "$MANXSL" $f
- ret=$?
- if [ "$ret" = "4" ]; then
- echo "ignoring stylesheet error 4 for $MANXSL"
- exit 0
- fi
- if [ "$ret" != "0" ]; then
- echo "xsltproc failed with error $ret"
- exit $ret
- fi
- fi
-done
-
-for f in $SRCDIR/man/*.xml; do
- base=`basename $f .xml`
- out=man/"`basename $base`".html
- if [ ! -f "$out" ] || [ "$f" -nt "$out" ]; then
- echo Processing html $f
- $XSLTPROC --nonet -o "$out" "$HTMLXSL" $f
- ret=$?
- if [ "$ret" = "4" ]; then
- echo "ignoring stylesheet error 4 for $HTMLXSL"
- exit 0
- fi
- if [ "$ret" != "0" ]; then
- echo "xsltproc failed with error $ret"
- exit $ret
- fi
- fi
-done
diff --git a/source4/lib/ldb/docs/design.txt b/source4/lib/ldb/docs/design.txt
deleted file mode 100644
index 0bb278b5b4..0000000000
--- a/source4/lib/ldb/docs/design.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-The list of indexed fields
---------------------------
-
-dn=@INDEXLIST
- list of field names that are indexed
-
- contains fields of type @IDXATTR which contain attriute names
- of indexed fields
-
-
-Data records
-------------
-
-for each user record in the db there is:
- main record
- key: DN=dn
- data: packed attribute/value list
-
- a index record for each indexed field in the record
-
-
-Index Records
--------------
-
-The index records contain the list of dn's that contain records
-matching the index key
-
-All index records are of the form:
- dn=@INDEX:field:value
-
-and contain fields of type @IDX which are the dns of the records
-that have that value for some attribute
-
-
-Search Expressions
-------------------
-
-Very similar to LDAP search expressions, but does not allow ~=, <= or >=
-
- attrib0 := (field=value)
- attrib := attrib0 | (attrib&&attrib) | (attrib||attrib) | !attrib
diff --git a/source4/lib/ldb/docs/installdocs.sh b/source4/lib/ldb/docs/installdocs.sh
deleted file mode 100755
index 6cc7b74ad5..0000000000
--- a/source4/lib/ldb/docs/installdocs.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-# install ldb docs
-# tridge@samba.org August 2006
-
-MANDIR="$1"
-
-MAN1="`/bin/ls man/*.1`"
-MAN3="`/bin/ls man/*.3`"
-
-if [ -z "$MAN1" ] && [ -z "$MAN3" ]; then
- echo "No manpages have been built"
- exit 0
-fi
-
-mkdir -p "$MANDIR/man1" "$MANDIR/man3"
-cp $MAN1 "$MANDIR/man1/" || exit 1
-cp $MAN3 "$MANDIR/man3/" || exit 1
diff --git a/source4/lib/ldb/examples.dox b/source4/lib/ldb/examples.dox
deleted file mode 100644
index ef4b4f0a40..0000000000
--- a/source4/lib/ldb/examples.dox
+++ /dev/null
@@ -1,16 +0,0 @@
-/** \example ldbreader.c
-
-The code below shows a simple LDB application.
-
-It lists / dumps the records in a LDB database to standard output.
-
-*/
-
-
-/** \example ldifreader.c
-
-The code below shows a simple LDB application.
-
-It lists / dumps the entries in an LDIF file to standard output.
-
-*/
diff --git a/source4/lib/ldb/examples/ldbreader.c b/source4/lib/ldb/examples/ldbreader.c
deleted file mode 100644
index 3496baf4ce..0000000000
--- a/source4/lib/ldb/examples/ldbreader.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- example code for the ldb database library
-
- Copyright (C) Brad Hards (bradh@frogmouth.net) 2005-2006
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/** \example ldbreader.c
-
-The code below shows a simple LDB application.
-
-It lists / dumps the records in a LDB database to standard output.
-
-*/
-
-#include "ldb.h"
-
-/*
- ldb_ldif_write takes a function pointer to a custom output
- function. This version is about as simple as the output function can
- be. In a more complex example, you'd likely be doing something with
- the private data function (e.g. holding a file handle).
-*/
-static int vprintf_fn(void *private_data, const char *fmt, ...)
-{
- int retval;
- va_list ap;
-
- va_start(ap, fmt);
- /* We just write to standard output */
- retval = vprintf(fmt, ap);
- va_end(ap);
- /* Note that the function should return the number of
- bytes written, or a negative error code */
- return retval;
-}
-
-int main(int argc, const char **argv)
-{
- struct ldb_context *ldb;
- const char *expression = "(dn=*)";
- struct ldb_result *resultMsg;
- int i;
-
- /*
- This is the always the first thing you want to do in an LDB
- application - initialise up the context structure.
-
- Note that you can use the context structure as a parent
- for talloc allocations as well
- */
- ldb = ldb_init(NULL, NULL);
-
- /*
- We now open the database. In this example we just hard code the connection path.
-
- Also note that the database is being opened read-only. This means that the
- call will fail unless the database already exists.
- */
- if (LDB_SUCCESS != ldb_connect(ldb, "tdb://tdbtest.ldb", LDB_FLG_RDONLY, NULL) ){
- printf("Problem on connection\n");
- exit(-1);
- }
-
- /*
- At this stage we have an open database, and can start using it. It is opened
- read-only, so a query is possible.
-
- We construct a search that just returns all the (sensible) contents. You can do
- quite fine grained results with the LDAP search syntax, however it is a bit
- confusing to start with. See RFC2254.
- */
- if (LDB_SUCCESS != ldb_search(ldb, ldb, &resultMsg,
- NULL, LDB_SCOPE_DEFAULT, NULL,
- "%s", expression)) {
- printf("Problem in search\n");
- exit(-1);
- }
-
- printf("%i records returned\n", resultMsg->count);
-
- /*
- We can now iterate through the results, writing them out
- (to standard output) with our custom output routine as defined
- at the top of this file
- */
- for (i = 0; i < resultMsg->count; ++i) {
- struct ldb_ldif ldifMsg;
-
- printf("Message: %i\n", i+1);
-
- ldifMsg.changetype = LDB_CHANGETYPE_NONE;
- ldifMsg.msg = resultMsg->msgs[i];
- ldb_ldif_write(ldb, vprintf_fn, NULL, &ldifMsg);
- }
-
- /*
- There are two objects to clean up - the result from the
- ldb_search() query, and the original ldb context.
- */
- talloc_free(resultMsg);
-
- talloc_free(ldb);
-
- return 0;
-}
diff --git a/source4/lib/ldb/examples/ldifreader.c b/source4/lib/ldb/examples/ldifreader.c
deleted file mode 100644
index dcd9daf812..0000000000
--- a/source4/lib/ldb/examples/ldifreader.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- example code for the ldb database library
-
- Copyright (C) Brad Hards (bradh@frogmouth.net) 2005-2006
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/** \example ldifreader.c
-
-The code below shows a simple LDB application.
-
-It lists / dumps the entries in an LDIF file to standard output.
-
-*/
-
-#include "ldb.h"
-
-/*
- ldb_ldif_write takes a function pointer to a custom output
- function. This version is about as simple as the output function can
- be. In a more complex example, you'd likely be doing something with
- the private data function (e.g. holding a file handle).
-*/
-static int vprintf_fn(void *private_data, const char *fmt, ...)
-{
- int retval;
- va_list ap;
-
- va_start(ap, fmt);
- /* We just write to standard output */
- retval = vprintf(fmt, ap);
- va_end(ap);
- /* Note that the function should return the number of
- bytes written, or a negative error code */
- return retval;
-}
-
-int main(int argc, const char **argv)
-{
- struct ldb_context *ldb;
- FILE *fileStream;
- struct ldb_ldif *ldifMsg;
-
- if (argc != 2) {
- printf("Usage %s filename.ldif\n", argv[0]);
- exit(1);
- }
-
- /*
- This is the always the first thing you want to do in an LDB
- application - initialise up the context structure.
-
- Note that you can use the context structure as a parent
- for talloc allocations as well
- */
- ldb = ldb_init(NULL, NULL);
-
- fileStream = fopen(argv[1], "r");
- if (0 == fileStream) {
- perror(argv[1]);
- exit(1);
- }
-
- /*
- We now work through the filestream to get each entry.
- */
- while ( (ldifMsg = ldb_ldif_read_file(ldb, fileStream)) ) {
- /*
- Each message has a particular change type. For Add,
- Modify and Delete, this will also appear in the
- output listing (as changetype: add, changetype:
- modify or changetype:delete, respectively).
- */
- switch (ldifMsg->changetype) {
- case LDB_CHANGETYPE_NONE:
- printf("ChangeType: None\n");
- break;
- case LDB_CHANGETYPE_ADD:
- printf("ChangeType: Add\n");
- break;
- case LDB_CHANGETYPE_MODIFY:
- printf("ChangeType: Modify\n");
- break;
- case LDB_CHANGETYPE_DELETE:
- printf("ChangeType: Delete\n");
- break;
- default:
- printf("ChangeType: Unknown\n");
- }
-
- /*
- We can now write out the results, using our custom
- output routine as defined at the top of this file.
- */
- ldb_ldif_write(ldb, vprintf_fn, NULL, ldifMsg);
-
- /*
- Clean up the message
- */
- ldb_ldif_read_free(ldb, ldifMsg);
- }
-
- /*
- Clean up the context
- */
- talloc_free(ldb);
-
- return 0;
-}
diff --git a/source4/lib/ldb/include/dlinklist.h b/source4/lib/ldb/include/dlinklist.h
deleted file mode 100644
index 1c577bb6b9..0000000000
--- a/source4/lib/ldb/include/dlinklist.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
- some simple double linked list macros
-
- Copyright (C) Andrew Tridgell 1998-2010
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/* To use these macros you must have a structure containing a next and
- prev pointer */
-
-#ifndef _DLINKLIST_H
-#define _DLINKLIST_H
-
-/*
- February 2010 - changed list format to have a prev pointer from the
- list head. This makes DLIST_ADD_END() O(1) even though we only have
- one list pointer.
-
- The scheme is as follows:
-
- 1) with no entries in the list:
- list_head == NULL
-
- 2) with 1 entry in the list:
- list_head->next == NULL
- list_head->prev == list_head
-
- 3) with 2 entries in the list:
- list_head->next == element2
- list_head->prev == element2
- element2->prev == list_head
- element2->next == NULL
-
- 4) with N entries in the list:
- list_head->next == element2
- list_head->prev == elementN
- elementN->prev == element{N-1}
- elementN->next == NULL
-
- This allows us to find the tail of the list by using
- list_head->prev, which means we can add to the end of the list in
- O(1) time
-
-
- Note that the 'type' arguments below are no longer needed, but
- are kept for now to prevent an incompatible argument change
- */
-
-
-/*
- add an element at the front of a list
-*/
-#define DLIST_ADD(list, p) \
-do { \
- if (!(list)) { \
- (p)->prev = (list) = (p); \
- (p)->next = NULL; \
- } else { \
- (p)->prev = (list)->prev; \
- (list)->prev = (p); \
- (p)->next = (list); \
- (list) = (p); \
- } \
-} while (0)
-
-/*
- remove an element from a list
- Note that the element doesn't have to be in the list. If it
- isn't then this is a no-op
-*/
-#define DLIST_REMOVE(list, p) \
-do { \
- if ((p) == (list)) { \
- if ((p)->next) (p)->next->prev = (p)->prev; \
- (list) = (p)->next; \
- } else if ((list) && (p) == (list)->prev) { \
- (p)->prev->next = NULL; \
- (list)->prev = (p)->prev; \
- } else { \
- if ((p)->prev) (p)->prev->next = (p)->next; \
- if ((p)->next) (p)->next->prev = (p)->prev; \
- } \
- if ((p) != (list)) (p)->next = (p)->prev = NULL; \
-} while (0)
-
-/*
- find the head of the list given any element in it.
- Note that this costs O(N), so you should avoid this macro
- if at all possible!
-*/
-#define DLIST_HEAD(p, result_head) \
-do { \
- (result_head) = (p); \
- while (DLIST_PREV(result_head)) (result_head) = (result_head)->prev; \
-} while(0)
-
-/* return the last element in the list */
-#define DLIST_TAIL(list) ((list)?(list)->prev:NULL)
-
-/* return the previous element in the list. */
-#define DLIST_PREV(p) (((p)->prev && (p)->prev->next != NULL)?(p)->prev:NULL)
-
-/* insert 'p' after the given element 'el' in a list. If el is NULL then
- this is the same as a DLIST_ADD() */
-#define DLIST_ADD_AFTER(list, p, el) \
-do { \
- if (!(list) || !(el)) { \
- DLIST_ADD(list, p); \
- } else { \
- (p)->prev = (el); \
- (p)->next = (el)->next; \
- (el)->next = (p); \
- if ((p)->next) (p)->next->prev = (p); \
- if ((list)->prev == (el)) (list)->prev = (p); \
- }\
-} while (0)
-
-
-/*
- add to the end of a list.
- Note that 'type' is ignored
-*/
-#define DLIST_ADD_END(list, p, type) \
-do { \
- if (!(list)) { \
- DLIST_ADD(list, p); \
- } else { \
- DLIST_ADD_AFTER(list, p, (list)->prev); \
- } \
-} while (0)
-
-/* promote an element to the from of a list */
-#define DLIST_PROMOTE(list, p) \
-do { \
- DLIST_REMOVE(list, p); \
- DLIST_ADD(list, p); \
-} while (0)
-
-/*
- demote an element to the end of a list.
- Note that 'type' is ignored
-*/
-#define DLIST_DEMOTE(list, p, type) \
-do { \
- DLIST_REMOVE(list, p); \
- DLIST_ADD_END(list, p, NULL); \
-} while (0)
-
-/*
- concatenate two lists - putting all elements of the 2nd list at the
- end of the first list.
- Note that 'type' is ignored
-*/
-#define DLIST_CONCATENATE(list1, list2, type) \
-do { \
- if (!(list1)) { \
- (list1) = (list2); \
- } else { \
- (list1)->prev->next = (list2); \
- if (list2) { \
- void *_tmplist = (void *)(list1)->prev; \
- (list1)->prev = (list2)->prev; \
- (list2)->prev = _tmplist; \
- } \
- } \
-} while (0)
-
-#endif /* _DLINKLIST_H */
diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h
deleted file mode 100644
index d745f377b6..0000000000
--- a/source4/lib/ldb/include/ldb.h
+++ /dev/null
@@ -1,2254 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
- Copyright (C) Stefan Metzmacher 2004
- Copyright (C) Simo Sorce 2005-2006
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb header
- *
- * Description: defines for base ldb API
- *
- * Author: Andrew Tridgell
- * Author: Stefan Metzmacher
- */
-
-/**
- \file ldb.h Samba's ldb database
-
- This header file provides the main API for ldb.
-*/
-
-#ifndef _LDB_H_
-
-/*! \cond DOXYGEN_IGNORE */
-#define _LDB_H_ 1
-/*! \endcond */
-
-#include <stdbool.h>
-#include <talloc.h>
-#include <tevent.h>
-#include <ldb_version.h>
-#include <ldb_errors.h>
-
-/*
- major restrictions as compared to normal LDAP:
-
- - each record must have a unique key field
- - the key must be representable as a NULL terminated C string and may not
- contain a comma or braces
-
- major restrictions as compared to tdb:
-
- - no explicit locking calls, but we have transactions when using ldb_tdb
-
-*/
-
-#ifndef ldb_val
-/**
- Result value
-
- An individual lump of data in a result comes in this format. The
- pointer will usually be to a UTF-8 string if the application is
- sensible, but it can be to anything you like, including binary data
- blobs of arbitrary size.
-
- \note the data is null (0x00) terminated, but the length does not
- include the terminator.
-*/
-struct ldb_val {
- uint8_t *data; /*!< result data */
- size_t length; /*!< length of data */
-};
-#endif
-
-/*! \cond DOXYGEN_IGNORE */
-#ifndef PRINTF_ATTRIBUTE
-#define PRINTF_ATTRIBUTE(a,b)
-#endif
-
-#ifndef _DEPRECATED_
-#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 )
-#define _DEPRECATED_ __attribute__ ((deprecated))
-#else
-#define _DEPRECATED_
-#endif
-#endif
-/*! \endcond */
-
-/* opaque ldb_dn structures, see ldb_dn.c for internals */
-struct ldb_dn_component;
-struct ldb_dn;
-
-/**
- There are a number of flags that are used with ldap_modify() in
- ldb_message_element.flags fields. The LDB_FLAGS_MOD_ADD,
- LDB_FLAGS_MOD_DELETE and LDB_FLAGS_MOD_REPLACE flags are used in
- ldap_modify() calls to specify whether attributes are being added,
- deleted or modified respectively.
-*/
-#define LDB_FLAG_MOD_MASK 0x3
-
-/**
- use this to extract the mod type from the operation
- */
-#define LDB_FLAG_MOD_TYPE(flags) ((flags) & LDB_FLAG_MOD_MASK)
-
-/**
- Flag value used in ldap_modify() to indicate that attributes are
- being added.
-
- \sa LDB_FLAG_MOD_MASK
-*/
-#define LDB_FLAG_MOD_ADD 1
-
-/**
- Flag value used in ldap_modify() to indicate that attributes are
- being replaced.
-
- \sa LDB_FLAG_MOD_MASK
-*/
-#define LDB_FLAG_MOD_REPLACE 2
-
-/**
- Flag value used in ldap_modify() to indicate that attributes are
- being deleted.
-
- \sa LDB_FLAG_MOD_MASK
-*/
-#define LDB_FLAG_MOD_DELETE 3
-
-/**
- flag bits on an element usable only by the internal implementation
-*/
-#define LDB_FLAG_INTERNAL_MASK 0xFFFFFFF0
-
-/**
- OID for logic AND comaprison.
-
- This is the well known object ID for a logical AND comparitor.
-*/
-#define LDB_OID_COMPARATOR_AND "1.2.840.113556.1.4.803"
-
-/**
- OID for logic OR comparison.
-
- This is the well known object ID for a logical OR comparitor.
-*/
-#define LDB_OID_COMPARATOR_OR "1.2.840.113556.1.4.804"
-
-/**
- results are given back as arrays of ldb_message_element
-*/
-struct ldb_message_element {
- unsigned int flags;
- const char *name;
- unsigned int num_values;
- struct ldb_val *values;
-};
-
-
-/**
- a ldb_message represents all or part of a record. It can contain an arbitrary
- number of elements.
-*/
-struct ldb_message {
- struct ldb_dn *dn;
- unsigned int num_elements;
- struct ldb_message_element *elements;
-};
-
-enum ldb_changetype {
- LDB_CHANGETYPE_NONE=0,
- LDB_CHANGETYPE_ADD,
- LDB_CHANGETYPE_DELETE,
- LDB_CHANGETYPE_MODIFY,
- LDB_CHANGETYPE_MODRDN
-};
-
-/**
- LDIF record
-
- This structure contains a LDIF record, as returned from ldif_read()
- and equivalent functions.
-*/
-struct ldb_ldif {
- enum ldb_changetype changetype; /*!< The type of change */
- struct ldb_message *msg; /*!< The changes */
-};
-
-enum ldb_scope {LDB_SCOPE_DEFAULT=-1,
- LDB_SCOPE_BASE=0,
- LDB_SCOPE_ONELEVEL=1,
- LDB_SCOPE_SUBTREE=2};
-
-struct ldb_context;
-struct tevent_context;
-
-/* debugging uses one of the following levels */
-enum ldb_debug_level {LDB_DEBUG_FATAL, LDB_DEBUG_ERROR,
- LDB_DEBUG_WARNING, LDB_DEBUG_TRACE};
-
-/**
- the user can optionally supply a debug function. The function
- is based on the vfprintf() style of interface, but with the addition
- of a severity level
-*/
-struct ldb_debug_ops {
- void (*debug)(void *context, enum ldb_debug_level level,
- const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
- void *context;
-};
-
-/**
- The user can optionally supply a custom utf8 functions,
- to handle comparisons and casefolding.
-*/
-struct ldb_utf8_fns {
- void *context;
- char *(*casefold)(void *context, TALLOC_CTX *mem_ctx, const char *s, size_t n);
-};
-
-/**
- Flag value for database connection mode.
-
- If LDB_FLG_RDONLY is used in ldb_connect, then the database will be
- opened read-only, if possible.
-*/
-#define LDB_FLG_RDONLY 1
-
-/**
- Flag value for database connection mode.
-
- If LDB_FLG_NOSYNC is used in ldb_connect, then the database will be
- opened without synchronous operations, if possible.
-*/
-#define LDB_FLG_NOSYNC 2
-
-/**
- Flag value to specify autoreconnect mode.
-
- If LDB_FLG_RECONNECT is used in ldb_connect, then the backend will
- be opened in a way that makes it try to auto reconnect if the
- connection is dropped (actually make sense only with ldap).
-*/
-#define LDB_FLG_RECONNECT 4
-
-/**
- Flag to tell backends not to use mmap
-*/
-#define LDB_FLG_NOMMAP 8
-
-/**
- Flag to tell ldif handlers not to force encoding of binary
- structures in base64
-*/
-#define LDB_FLG_SHOW_BINARY 16
-
-/**
- Flags to enable ldb tracing
-*/
-#define LDB_FLG_ENABLE_TRACING 32
-
-/*
- structures for ldb_parse_tree handling code
-*/
-enum ldb_parse_op { LDB_OP_AND=1, LDB_OP_OR=2, LDB_OP_NOT=3,
- LDB_OP_EQUALITY=4, LDB_OP_SUBSTRING=5,
- LDB_OP_GREATER=6, LDB_OP_LESS=7, LDB_OP_PRESENT=8,
- LDB_OP_APPROX=9, LDB_OP_EXTENDED=10 };
-
-struct ldb_parse_tree {
- enum ldb_parse_op operation;
- union {
- struct {
- struct ldb_parse_tree *child;
- } isnot;
- struct {
- const char *attr;
- struct ldb_val value;
- } equality;
- struct {
- const char *attr;
- int start_with_wildcard;
- int end_with_wildcard;
- struct ldb_val **chunks;
- } substring;
- struct {
- const char *attr;
- } present;
- struct {
- const char *attr;
- struct ldb_val value;
- } comparison;
- struct {
- const char *attr;
- int dnAttributes;
- char *rule_id;
- struct ldb_val value;
- } extended;
- struct {
- unsigned int num_elements;
- struct ldb_parse_tree **elements;
- } list;
- } u;
-};
-
-struct ldb_parse_tree *ldb_parse_tree(TALLOC_CTX *mem_ctx, const char *s);
-char *ldb_filter_from_tree(TALLOC_CTX *mem_ctx, const struct ldb_parse_tree *tree);
-
-/**
- Encode a binary blob
-
- This function encodes a binary blob using the encoding rules in RFC
- 2254 (Section 4). This function also escapes any non-printable
- characters.
-
- \param mem_ctx the memory context to allocate the return string in.
- \param val the (potentially) binary data to be encoded
-
- \return the encoded data as a null terminated string
-
- \sa <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>.
-*/
-char *ldb_binary_encode(TALLOC_CTX *mem_ctx, struct ldb_val val);
-
-/**
- Encode a string
-
- This function encodes a string using the encoding rules in RFC 2254
- (Section 4). This function also escapes any non-printable
- characters.
-
- \param mem_ctx the memory context to allocate the return string in.
- \param string the string to be encoded
-
- \return the encoded data as a null terminated string
-
- \sa <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>.
-*/
-char *ldb_binary_encode_string(TALLOC_CTX *mem_ctx, const char *string);
-
-/*
- functions for controlling attribute handling
-*/
-typedef int (*ldb_attr_handler_t)(struct ldb_context *, TALLOC_CTX *mem_ctx, const struct ldb_val *, struct ldb_val *);
-typedef int (*ldb_attr_comparison_t)(struct ldb_context *, TALLOC_CTX *mem_ctx, const struct ldb_val *, const struct ldb_val *);
-struct ldb_schema_attribute;
-typedef int (*ldb_attr_operator_t)(struct ldb_context *, enum ldb_parse_op operation,
- const struct ldb_schema_attribute *a,
- const struct ldb_val *, const struct ldb_val *, bool *matched);
-
-/*
- attribute handler structure
-
- attr -> The attribute name
- ldif_read_fn -> convert from ldif to binary format
- ldif_write_fn -> convert from binary to ldif format
- canonicalise_fn -> canonicalise a value, for use by indexing and dn construction
- comparison_fn -> compare two values
-*/
-
-struct ldb_schema_syntax {
- const char *name;
- ldb_attr_handler_t ldif_read_fn;
- ldb_attr_handler_t ldif_write_fn;
- ldb_attr_handler_t canonicalise_fn;
- ldb_attr_comparison_t comparison_fn;
- ldb_attr_operator_t operator_fn;
-};
-
-struct ldb_schema_attribute {
- const char *name;
- unsigned flags;
- const struct ldb_schema_syntax *syntax;
-};
-
-const struct ldb_schema_attribute *ldb_schema_attribute_by_name(struct ldb_context *ldb,
- const char *name);
-
-struct ldb_dn_extended_syntax {
- const char *name;
- ldb_attr_handler_t read_fn;
- ldb_attr_handler_t write_clear_fn;
- ldb_attr_handler_t write_hex_fn;
-};
-
-const struct ldb_dn_extended_syntax *ldb_dn_extended_syntax_by_name(struct ldb_context *ldb,
- const char *name);
-
-/**
- The attribute is not returned by default
-*/
-#define LDB_ATTR_FLAG_HIDDEN (1<<0)
-
-/* the attribute handler name should be freed when released */
-#define LDB_ATTR_FLAG_ALLOCATED (1<<1)
-
-/**
- The attribute is supplied by the application and should not be removed
-*/
-#define LDB_ATTR_FLAG_FIXED (1<<2)
-
-/*
- when this is set, attempts to create two records which have the same
- value for this attribute will return LDB_ERR_ENTRY_ALREADY_EXISTS
- */
-#define LDB_ATTR_FLAG_UNIQUE_INDEX (1<<3)
-
-/*
- when this is set, attempts to create two attribute values for this attribute on a single DN will return LDB_ERR_CONSTRAINT_VIOLATION
- */
-#define LDB_ATTR_FLAG_SINGLE_VALUE (1<<4)
-
-/**
- LDAP attribute syntax for a DN
-
- This is the well-known LDAP attribute syntax for a DN.
-
- See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
-*/
-#define LDB_SYNTAX_DN "1.3.6.1.4.1.1466.115.121.1.12"
-
-/**
- LDAP attribute syntax for a Directory String
-
- This is the well-known LDAP attribute syntax for a Directory String.
-
- \sa <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
-*/
-#define LDB_SYNTAX_DIRECTORY_STRING "1.3.6.1.4.1.1466.115.121.1.15"
-
-/**
- LDAP attribute syntax for an integer
-
- This is the well-known LDAP attribute syntax for an integer.
-
- See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
-*/
-#define LDB_SYNTAX_INTEGER "1.3.6.1.4.1.1466.115.121.1.27"
-
-/**
- LDAP attribute syntax for a boolean
-
- This is the well-known LDAP attribute syntax for a boolean.
-
- See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
-*/
-#define LDB_SYNTAX_BOOLEAN "1.3.6.1.4.1.1466.115.121.1.7"
-
-/**
- LDAP attribute syntax for an octet string
-
- This is the well-known LDAP attribute syntax for an octet string.
-
- See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
-*/
-#define LDB_SYNTAX_OCTET_STRING "1.3.6.1.4.1.1466.115.121.1.40"
-
-/**
- LDAP attribute syntax for UTC time.
-
- This is the well-known LDAP attribute syntax for a UTC time.
-
- See <a href="http://www.ietf.org/rfc/rfc2252.txt">RFC 2252</a>, Section 4.3.2
-*/
-#define LDB_SYNTAX_UTC_TIME "1.3.6.1.4.1.1466.115.121.1.53"
-
-#define LDB_SYNTAX_OBJECTCLASS "LDB_SYNTAX_OBJECTCLASS"
-
-/* sorting helpers */
-typedef int (*ldb_qsort_cmp_fn_t) (void *v1, void *v2, void *opaque);
-
-/* Individual controls */
-
-/**
- OID for getting and manipulating attributes from the ldb
- without interception in the operational module.
- It can be used to access attribute that used to be stored in the sam
- and that are now calculated.
-*/
-#define LDB_CONTROL_BYPASS_OPERATIONAL_OID "1.3.6.1.4.1.7165.4.3.13"
-#define LDB_CONTROL_BYPASS_OPERATIONAL_NAME "bypassoperational"
-
-/**
- OID for recalculate SD control. This control force the
- dsdb code to recalculate the SD of the object as if the
- object was just created.
-
-*/
-#define LDB_CONTROL_RECALCULATE_SD_OID "1.3.6.1.4.1.7165.4.3.5"
-#define LDB_CONTROL_RECALCULATE_SD_NAME "recalculate_sd"
-
-/**
- REVEAL_INTERNALS is used to reveal internal attributes and DN
- components which are not normally shown to the user
-*/
-#define LDB_CONTROL_REVEAL_INTERNALS "1.3.6.1.4.1.7165.4.3.6"
-#define LDB_CONTROL_REVEAL_INTERNALS_NAME "reveal_internals"
-
-/**
- LDB_CONTROL_AS_SYSTEM is used to skip access checks on operations
- that are performed by the system, but with a user's credentials, e.g.
- updating prefix map
-*/
-#define LDB_CONTROL_AS_SYSTEM_OID "1.3.6.1.4.1.7165.4.3.7"
-
-/**
- LDB_CONTROL_PROVISION_OID is used to skip some constraint checks. It's is
- mainly thought to be used for the provisioning.
-*/
-#define LDB_CONTROL_PROVISION_OID "1.3.6.1.4.1.7165.4.3.16"
-#define LDB_CONTROL_PROVISION_NAME "provision"
-
-/* AD controls */
-
-/**
- OID for the paged results control. This control is included in the
- searchRequest and searchResultDone messages as part of the controls
- field of the LDAPMessage, as defined in Section 4.1.12 of
- LDAP v3.
-
- \sa <a href="http://www.ietf.org/rfc/rfc2696.txt">RFC 2696</a>.
-*/
-#define LDB_CONTROL_PAGED_RESULTS_OID "1.2.840.113556.1.4.319"
-#define LDB_CONTROL_PAGED_RESULTS_NAME "paged_results"
-
-/**
- OID for specifying the returned elements of the ntSecurityDescriptor
-
- \sa <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_sd_flags_oid.asp">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_SD_FLAGS_OID "1.2.840.113556.1.4.801"
-#define LDB_CONTROL_SD_FLAGS_NAME "sd_flags"
-
-/**
- OID for specifying an advanced scope for the search (one partition)
-
- \sa <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_domain_scope_oid.asp">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_DOMAIN_SCOPE_OID "1.2.840.113556.1.4.1339"
-#define LDB_CONTROL_DOMAIN_SCOPE_NAME "domain_scope"
-
-/**
- OID for specifying an advanced scope for a search
-
- \sa <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_search_options_oid.asp">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_SEARCH_OPTIONS_OID "1.2.840.113556.1.4.1340"
-#define LDB_CONTROL_SEARCH_OPTIONS_NAME "search_options"
-
-/**
- OID for notification
-
- \sa <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_notification_oid.asp">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_NOTIFICATION_OID "1.2.840.113556.1.4.528"
-#define LDB_CONTROL_NOTIFICATION_NAME "notification"
-
-/**
- OID for performing subtree deletes
-
- \sa <a href="http://msdn.microsoft.com/en-us/library/aa366991(v=VS.85).aspx">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_TREE_DELETE_OID "1.2.840.113556.1.4.805"
-#define LDB_CONTROL_TREE_DELETE_NAME "tree_delete"
-
-/**
- OID for getting deleted objects
-
- \sa <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_show_deleted_oid.asp">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_SHOW_DELETED_OID "1.2.840.113556.1.4.417"
-#define LDB_CONTROL_SHOW_DELETED_NAME "show_deleted"
-
-/**
- OID for getting recycled objects
-
- \sa <a href="http://msdn.microsoft.com/en-us/library/dd304621(PROT.13).aspx">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_SHOW_RECYCLED_OID "1.2.840.113556.1.4.2064"
-#define LDB_CONTROL_SHOW_RECYCLED_NAME "show_recycled"
-
-/**
- OID for getting deactivated linked attributes
-
- \sa <a href="http://msdn.microsoft.com/en-us/library/dd302781(PROT.13).aspx">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_SHOW_DEACTIVATED_LINK_OID "1.2.840.113556.1.4.2065"
-#define LDB_CONTROL_SHOW_DEACTIVATED_LINK_NAME "show_deactivated_link"
-
-/**
- OID for extended DN
-
- \sa <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_extended_dn_oid.asp">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_EXTENDED_DN_OID "1.2.840.113556.1.4.529"
-#define LDB_CONTROL_EXTENDED_DN_NAME "extended_dn"
-
-/**
- OID for LDAP server sort result extension.
-
- This control is included in the searchRequest message as part of
- the controls field of the LDAPMessage, as defined in Section 4.1.12
- of LDAP v3. The controlType is set to
- "1.2.840.113556.1.4.473". The criticality MAY be either TRUE or
- FALSE (where absent is also equivalent to FALSE) at the client's
- option.
-
- \sa <a href="http://www.ietf.org/rfc/rfc2891.txt">RFC 2891</a>.
-*/
-#define LDB_CONTROL_SERVER_SORT_OID "1.2.840.113556.1.4.473"
-#define LDB_CONTROL_SERVER_SORT_NAME "server_sort"
-
-/**
- OID for LDAP server sort result response extension.
-
- This control is included in the searchResultDone message as part of
- the controls field of the LDAPMessage, as defined in Section 4.1.12 of
- LDAP v3.
-
- \sa <a href="http://www.ietf.org/rfc/rfc2891.txt">RFC 2891</a>.
-*/
-#define LDB_CONTROL_SORT_RESP_OID "1.2.840.113556.1.4.474"
-#define LDB_CONTROL_SORT_RESP_NAME "server_sort_resp"
-
-/**
- OID for LDAP Attribute Scoped Query extension.
-
- This control is included in SearchRequest or SearchResponse
- messages as part of the controls field of the LDAPMessage.
-*/
-#define LDB_CONTROL_ASQ_OID "1.2.840.113556.1.4.1504"
-#define LDB_CONTROL_ASQ_NAME "asq"
-
-/**
- OID for LDAP Directory Sync extension.
-
- This control is included in SearchRequest or SearchResponse
- messages as part of the controls field of the LDAPMessage.
-*/
-#define LDB_CONTROL_DIRSYNC_OID "1.2.840.113556.1.4.841"
-#define LDB_CONTROL_DIRSYNC_NAME "dirsync"
-
-
-/**
- OID for LDAP Virtual List View Request extension.
-
- This control is included in SearchRequest messages
- as part of the controls field of the LDAPMessage.
-*/
-#define LDB_CONTROL_VLV_REQ_OID "2.16.840.1.113730.3.4.9"
-#define LDB_CONTROL_VLV_REQ_NAME "vlv"
-
-/**
- OID for LDAP Virtual List View Response extension.
-
- This control is included in SearchResponse messages
- as part of the controls field of the LDAPMessage.
-*/
-#define LDB_CONTROL_VLV_RESP_OID "2.16.840.1.113730.3.4.10"
-#define LDB_CONTROL_VLV_RESP_NAME "vlv_resp"
-
-/**
- OID to let modifies don't give an error when adding an existing
- attribute with the same value or deleting an nonexisting one attribute
-
- \sa <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_permissive_modify_oid.asp">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_PERMISSIVE_MODIFY_OID "1.2.840.113556.1.4.1413"
-#define LDB_CONTROL_PERMISSIVE_MODIFY_NAME "permissive_modify"
-
-/**
- OID to allow the server to be more 'fast and loose' with the data being added.
-
- \sa <a href="http://msdn.microsoft.com/en-us/library/aa366982(v=VS.85).aspx">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_SERVER_LAZY_COMMIT "1.2.840.113556.1.4.619"
-
-/**
- Control for RODC join -see [MS-ADTS] section 3.1.1.3.4.1.23
-
- \sa <a href="">Microsoft documentation of this OID</a>
-*/
-#define LDB_CONTROL_RODC_DCPROMO_OID "1.2.840.113556.1.4.1341"
-#define LDB_CONTROL_RODC_DCPROMO_NAME "rodc_join"
-
-/* Other standardised controls */
-
-/**
- OID for the allowing client to request temporary relaxed
- enforcement of constraints of the x.500 model.
-
- Mainly used for the OpenLDAP backend.
-
- \sa <a href="http://opends.dev.java.net/public/standards/draft-zeilenga-ldap-managedit.txt">draft managedit</a>.
-*/
-#define LDB_CONTROL_RELAX_OID "1.3.6.1.4.1.4203.666.5.12"
-#define LDB_CONTROL_RELAX_NAME "relax"
-
-/* Extended operations */
-
-/**
- OID for LDAP Extended Operation SEQUENCE_NUMBER
-
- This extended operation is used to retrieve the extended sequence number.
-*/
-#define LDB_EXTENDED_SEQUENCE_NUMBER "1.3.6.1.4.1.7165.4.4.3"
-
-/**
- OID for LDAP Extended Operation PASSWORD_CHANGE.
-
- This Extended operation is used to allow user password changes by the user
- itself.
-*/
-#define LDB_EXTENDED_PASSWORD_CHANGE_OID "1.3.6.1.4.1.4203.1.11.1"
-
-
-/**
- OID for LDAP Extended Operation FAST_BIND
-
- This Extended operations is used to perform a fast bind.
-*/
-#define LDB_EXTENDED_FAST_BIND_OID "1.2.840.113556.1.4.1781"
-
-/**
- OID for LDAP Extended Operation START_TLS.
-
- This Extended operation is used to start a new TLS channel on top of a clear
- text channel.
-*/
-#define LDB_EXTENDED_START_TLS_OID "1.3.6.1.4.1.1466.20037"
-
-/**
- OID for LDAP Extended Operation DYNAMIC_REFRESH.
-
- This Extended operation is used to create and maintain objects which exist
- only a specific time, e.g. when a certain client or a certain person is
- logged in. Data refreshes have to be periodically sent in a specific
- interval. Otherwise the entry is going to be removed.
-*/
-#define LDB_EXTENDED_DYNAMIC_OID "1.3.6.1.4.1.1466.101.119.1"
-
-struct ldb_sd_flags_control {
- /*
- * request the owner 0x00000001
- * request the group 0x00000002
- * request the DACL 0x00000004
- * request the SACL 0x00000008
- */
- unsigned secinfo_flags;
-};
-
-/*
- * DOMAIN_SCOPE 0x00000001
- * this limits the search to one partition,
- * and no referrals will be returned.
- * (Note this doesn't limit the entries by there
- * objectSid belonging to a domain! Builtin and Foreign Sids
- * are still returned)
- *
- * PHANTOM_ROOT 0x00000002
- * this search on the whole tree on a domain controller
- * over multiple partitions without referrals.
- * (This is the default behavior on the Global Catalog Port)
- */
-
-#define LDB_SEARCH_OPTION_DOMAIN_SCOPE 0x00000001
-#define LDB_SEARCH_OPTION_PHANTOM_ROOT 0x00000002
-
-struct ldb_search_options_control {
- unsigned search_options;
-};
-
-struct ldb_paged_control {
- int size;
- int cookie_len;
- char *cookie;
-};
-
-struct ldb_extended_dn_control {
- int type;
-};
-
-struct ldb_server_sort_control {
- const char *attributeName;
- const char *orderingRule;
- int reverse;
-};
-
-struct ldb_sort_resp_control {
- int result;
- char *attr_desc;
-};
-
-struct ldb_asq_control {
- int request;
- char *source_attribute;
- int src_attr_len;
- int result;
-};
-
-struct ldb_dirsync_control {
- int flags;
- int max_attributes;
- int cookie_len;
- char *cookie;
-};
-
-struct ldb_vlv_req_control {
- int beforeCount;
- int afterCount;
- int type;
- union {
- struct {
- int offset;
- int contentCount;
- } byOffset;
- struct {
- int value_len;
- char *value;
- } gtOrEq;
- } match;
- int ctxid_len;
- char *contextId;
-};
-
-struct ldb_vlv_resp_control {
- int targetPosition;
- int contentCount;
- int vlv_result;
- int ctxid_len;
- char *contextId;
-};
-
-struct ldb_control {
- const char *oid;
- int critical;
- void *data;
-};
-
-enum ldb_request_type {
- LDB_SEARCH,
- LDB_ADD,
- LDB_MODIFY,
- LDB_DELETE,
- LDB_RENAME,
- LDB_EXTENDED,
- LDB_REQ_REGISTER_CONTROL,
- LDB_REQ_REGISTER_PARTITION
-};
-
-enum ldb_reply_type {
- LDB_REPLY_ENTRY,
- LDB_REPLY_REFERRAL,
- LDB_REPLY_DONE
-};
-
-enum ldb_wait_type {
- LDB_WAIT_ALL,
- LDB_WAIT_NONE
-};
-
-enum ldb_state {
- LDB_ASYNC_INIT,
- LDB_ASYNC_PENDING,
- LDB_ASYNC_DONE
-};
-
-struct ldb_extended {
- const char *oid;
- void *data; /* NULL or a valid talloc pointer! talloc_get_type() will be used on it */
-};
-
-enum ldb_sequence_type {
- LDB_SEQ_HIGHEST_SEQ,
- LDB_SEQ_HIGHEST_TIMESTAMP,
- LDB_SEQ_NEXT
-};
-
-#define LDB_SEQ_GLOBAL_SEQUENCE 0x01
-#define LDB_SEQ_TIMESTAMP_SEQUENCE 0x02
-
-struct ldb_seqnum_request {
- enum ldb_sequence_type type;
-};
-
-struct ldb_seqnum_result {
- uint64_t seq_num;
- uint32_t flags;
-};
-
-struct ldb_result {
- unsigned int count;
- struct ldb_message **msgs;
- struct ldb_extended *extended;
- struct ldb_control **controls;
- char **refs;
-};
-
-struct ldb_reply {
- int error;
- enum ldb_reply_type type;
- struct ldb_message *message;
- struct ldb_extended *response;
- struct ldb_control **controls;
- char *referral;
-};
-
-struct ldb_request;
-struct ldb_handle;
-
-struct ldb_search {
- struct ldb_dn *base;
- enum ldb_scope scope;
- struct ldb_parse_tree *tree;
- const char * const *attrs;
- struct ldb_result *res;
-};
-
-struct ldb_add {
- const struct ldb_message *message;
-};
-
-struct ldb_modify {
- const struct ldb_message *message;
-};
-
-struct ldb_delete {
- struct ldb_dn *dn;
-};
-
-struct ldb_rename {
- struct ldb_dn *olddn;
- struct ldb_dn *newdn;
-};
-
-struct ldb_register_control {
- const char *oid;
-};
-
-struct ldb_register_partition {
- struct ldb_dn *dn;
-};
-
-typedef int (*ldb_request_callback_t)(struct ldb_request *, struct ldb_reply *);
-
-struct ldb_request {
-
- enum ldb_request_type operation;
-
- union {
- struct ldb_search search;
- struct ldb_add add;
- struct ldb_modify mod;
- struct ldb_delete del;
- struct ldb_rename rename;
- struct ldb_extended extended;
- struct ldb_register_control reg_control;
- struct ldb_register_partition reg_partition;
- } op;
-
- struct ldb_control **controls;
-
- void *context;
- ldb_request_callback_t callback;
-
- int timeout;
- time_t starttime;
- struct ldb_handle *handle;
-};
-
-int ldb_request(struct ldb_context *ldb, struct ldb_request *request);
-int ldb_request_done(struct ldb_request *req, int status);
-bool ldb_request_is_done(struct ldb_request *req);
-
-int ldb_modules_wait(struct ldb_handle *handle);
-int ldb_wait(struct ldb_handle *handle, enum ldb_wait_type type);
-
-int ldb_set_timeout(struct ldb_context *ldb, struct ldb_request *req, int timeout);
-int ldb_set_timeout_from_prev_req(struct ldb_context *ldb, struct ldb_request *oldreq, struct ldb_request *newreq);
-void ldb_set_create_perms(struct ldb_context *ldb, unsigned int perms);
-void ldb_set_modules_dir(struct ldb_context *ldb, const char *path);
-struct tevent_context;
-void ldb_set_event_context(struct ldb_context *ldb, struct tevent_context *ev);
-struct tevent_context * ldb_get_event_context(struct ldb_context *ldb);
-
-/**
- Initialise ldbs' global information
-
- This is required before any other LDB call
-
- \return 0 if initialisation succeeded, -1 otherwise
-*/
-int ldb_global_init(void);
-
-/**
- Initialise an ldb context
-
- This is required before any other LDB call.
-
- \param mem_ctx pointer to a talloc memory context. Pass NULL if there is
- no suitable context available.
-
- \return pointer to ldb_context that should be free'd (using talloc_free())
- at the end of the program.
-*/
-struct ldb_context *ldb_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx);
-
-/**
- Connect to a database.
-
- This is typically called soon after ldb_init(), and is required prior to
- any search or database modification operations.
-
- The URL can be one of the following forms:
- - tdb://path
- - ldapi://path
- - ldap://host
- - sqlite://path
-
- \param ldb the context associated with the database (from ldb_init())
- \param url the URL of the database to connect to, as noted above
- \param flags a combination of LDB_FLG_* to modify the connection behaviour
- \param options backend specific options - passed uninterpreted to the backend
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-
- \note It is an error to connect to a database that does not exist in readonly mode
- (that is, with LDB_FLG_RDONLY). However in read-write mode, the database will be
- created if it does not exist.
-*/
-
-typedef void (*ldb_async_timeout_fn) (void *);
-typedef bool (*ldb_async_callback_fn) (void *);
-typedef int (*ldb_async_ctx_add_op_fn)(void *, time_t, void *, ldb_async_timeout_fn, ldb_async_callback_fn);
-typedef int (*ldb_async_ctx_wait_op_fn)(void *);
-
-void ldb_async_ctx_set_private_data(struct ldb_context *ldb,
- void *private_data);
-void ldb_async_ctx_set_add_op(struct ldb_context *ldb,
- ldb_async_ctx_add_op_fn add_op);
-void ldb_async_ctx_set_wait_op(struct ldb_context *ldb,
- ldb_async_ctx_wait_op_fn wait_op);
-
-int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[]);
-
-/*
- return an automatic basedn from the rootDomainNamingContext of the rootDSE
- This value have been set in an opaque pointer at connection time
-*/
-struct ldb_dn *ldb_get_root_basedn(struct ldb_context *ldb);
-
-/*
- return an automatic basedn from the configurationNamingContext of the rootDSE
- This value have been set in an opaque pointer at connection time
-*/
-struct ldb_dn *ldb_get_config_basedn(struct ldb_context *ldb);
-
-/*
- return an automatic basedn from the schemaNamingContext of the rootDSE
- This value have been set in an opaque pointer at connection time
-*/
-struct ldb_dn *ldb_get_schema_basedn(struct ldb_context *ldb);
-
-/*
- return an automatic baseDN from the defaultNamingContext of the rootDSE
- This value have been set in an opaque pointer at connection time
-*/
-struct ldb_dn *ldb_get_default_basedn(struct ldb_context *ldb);
-
-/**
- The default async search callback function
-
- \param req the request we are callback of
- \param ares a single reply from the async core
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-
- \note this function expects req->context to always be an struct ldb_result pointer
- AND a talloc context, this function will steal on the context each message
- from the ares reply passed on by the async core so that in the end all the
- messages will be in the context (ldb_result) memory tree.
- Freeing the passed context (ldb_result tree) will free all the resources
- (the request need to be freed separately and the result doe not depend on the
- request that can be freed as sson as the search request is finished)
-*/
-
-int ldb_search_default_callback(struct ldb_request *req, struct ldb_reply *ares);
-
-/**
- The default async extended operation callback function
-
- \param req the request we are callback of
- \param ares a single reply from the async core
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-int ldb_op_default_callback(struct ldb_request *req, struct ldb_reply *ares);
-
-int ldb_modify_default_callback(struct ldb_request *req, struct ldb_reply *ares);
-
-/**
- Helper function to build a search request
-
- \param ret_req the request structure is returned here (talloced on mem_ctx)
- \param ldb the context associated with the database (from ldb_init())
- \param mem_ctx a talloc memory context (used as parent of ret_req)
- \param base the Base Distinguished Name for the query (use ldb_dn_new() for an empty one)
- \param scope the search scope for the query
- \param expression the search expression to use for this query
- \param attrs the search attributes for the query (pass NULL if none required)
- \param controls an array of controls
- \param context the callback function context
- \param the callback function to handle the async replies
- \param the parent request if any
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-
-int ldb_build_search_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn *base,
- enum ldb_scope scope,
- const char *expression,
- const char * const *attrs,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent);
-
-int ldb_build_search_req_ex(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn *base,
- enum ldb_scope scope,
- struct ldb_parse_tree *tree,
- const char * const *attrs,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent);
-
-/**
- Helper function to build an add request
-
- \param ret_req the request structure is returned here (talloced on mem_ctx)
- \param ldb the context associated with the database (from ldb_init())
- \param mem_ctx a talloc memory context (used as parent of ret_req)
- \param message contains the entry to be added
- \param controls an array of controls
- \param context the callback function context
- \param the callback function to handle the async replies
- \param the parent request if any
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-
-int ldb_build_add_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const struct ldb_message *message,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent);
-
-/**
- Helper function to build a modify request
-
- \param ret_req the request structure is returned here (talloced on mem_ctx)
- \param ldb the context associated with the database (from ldb_init())
- \param mem_ctx a talloc memory context (used as parent of ret_req)
- \param message contains the entry to be modified
- \param controls an array of controls
- \param context the callback function context
- \param the callback function to handle the async replies
- \param the parent request if any
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-
-int ldb_build_mod_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const struct ldb_message *message,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent);
-
-/**
- Helper function to build a delete request
-
- \param ret_req the request structure is returned here (talloced on mem_ctx)
- \param ldb the context associated with the database (from ldb_init())
- \param mem_ctx a talloc memory context (used as parent of ret_req)
- \param dn the DN to be deleted
- \param controls an array of controls
- \param context the callback function context
- \param the callback function to handle the async replies
- \param the parent request if any
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-
-int ldb_build_del_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn *dn,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent);
-
-/**
- Helper function to build a rename request
-
- \param ret_req the request structure is returned here (talloced on mem_ctx)
- \param ldb the context associated with the database (from ldb_init())
- \param mem_ctx a talloc memory context (used as parent of ret_req)
- \param olddn the old DN
- \param newdn the new DN
- \param controls an array of controls
- \param context the callback function context
- \param the callback function to handle the async replies
- \param the parent request if any
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-
-int ldb_build_rename_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn *olddn,
- struct ldb_dn *newdn,
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent);
-
-/**
- Add a ldb_control to a ldb_request
-
- \param req the request struct where to add the control
- \param oid the object identifier of the control as string
- \param critical whether the control should be critical or not
- \param data a talloc pointer to the control specific data
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-int ldb_request_add_control(struct ldb_request *req, const char *oid, bool critical, void *data);
-
-/**
- replace a ldb_control in a ldb_request
-
- \param req the request struct where to add the control
- \param oid the object identifier of the control as string
- \param critical whether the control should be critical or not
- \param data a talloc pointer to the control specific data
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-int ldb_request_replace_control(struct ldb_request *req, const char *oid, bool critical, void *data);
-
-/**
- check if a control with the specified "oid" exist and return it
- \param req the request struct where to add the control
- \param oid the object identifier of the control as string
-
- \return the control, NULL if not found
-*/
-struct ldb_control *ldb_request_get_control(struct ldb_request *req, const char *oid);
-
-/**
- check if a control with the specified "oid" exist and return it
- \param rep the reply struct where to add the control
- \param oid the object identifier of the control as string
-
- \return the control, NULL if not found
-*/
-struct ldb_control *ldb_reply_get_control(struct ldb_reply *rep, const char *oid);
-
-/**
- Search the database
-
- This function searches the database, and returns
- records that match an LDAP-like search expression
-
- \param ldb the context associated with the database (from ldb_init())
- \param mem_ctx the memory context to use for the request and the results
- \param result the return result
- \param base the Base Distinguished Name for the query (use ldb_dn_new() for an empty one)
- \param scope the search scope for the query
- \param attrs the search attributes for the query (pass NULL if none required)
- \param exp_fmt the search expression to use for this query (printf like)
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-
- \note use talloc_free() to free the ldb_result returned
-*/
-int ldb_search(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
- struct ldb_result **result, struct ldb_dn *base,
- enum ldb_scope scope, const char * const *attrs,
- const char *exp_fmt, ...) PRINTF_ATTRIBUTE(7,8);
-
-/**
- Add a record to the database.
-
- This function adds a record to the database. This function will fail
- if a record with the specified class and key already exists in the
- database.
-
- \param ldb the context associated with the database (from
- ldb_init())
- \param message the message containing the record to add.
-
- \return result code (LDB_SUCCESS if the record was added, otherwise
- a failure code)
-*/
-int ldb_add(struct ldb_context *ldb,
- const struct ldb_message *message);
-
-/**
- Modify the specified attributes of a record
-
- This function modifies a record that is in the database.
-
- \param ldb the context associated with the database (from
- ldb_init())
- \param message the message containing the changes required.
-
- \return result code (LDB_SUCCESS if the record was modified as
- requested, otherwise a failure code)
-*/
-int ldb_modify(struct ldb_context *ldb,
- const struct ldb_message *message);
-
-/**
- Rename a record in the database
-
- This function renames a record in the database.
-
- \param ldb the context associated with the database (from
- ldb_init())
- \param olddn the DN for the record to be renamed.
- \param newdn the new DN
-
- \return result code (LDB_SUCCESS if the record was renamed as
- requested, otherwise a failure code)
-*/
-int ldb_rename(struct ldb_context *ldb, struct ldb_dn *olddn, struct ldb_dn *newdn);
-
-/**
- Delete a record from the database
-
- This function deletes a record from the database.
-
- \param ldb the context associated with the database (from
- ldb_init())
- \param dn the DN for the record to be deleted.
-
- \return result code (LDB_SUCCESS if the record was deleted,
- otherwise a failure code)
-*/
-int ldb_delete(struct ldb_context *ldb, struct ldb_dn *dn);
-
-/**
- The default async extended operation callback function
-
- \param req the request we are callback of
- \param ares a single reply from the async core
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-
- \note this function expects req->context to always be an struct ldb_result pointer
- AND a talloc context, this function will steal on the context each message
- from the ares reply passed on by the async core so that in the end all the
- messages will be in the context (ldb_result) memory tree.
- Freeing the passed context (ldb_result tree) will free all the resources
- (the request need to be freed separately and the result doe not depend on the
- request that can be freed as sson as the search request is finished)
-*/
-
-int ldb_extended_default_callback(struct ldb_request *req, struct ldb_reply *ares);
-
-
-/**
- Helper function to build a extended request
-
- \param ret_req the request structure is returned here (talloced on mem_ctx)
- \param ldb the context associated with the database (from ldb_init())
- \param mem_ctx a talloc memory context (used as parent of ret_req)
- \param oid the OID of the extended operation.
- \param data a void pointer a the extended operation specific parameters,
- it needs to be NULL or a valid talloc pointer! talloc_get_type() will be used on it
- \param controls an array of controls
- \param context the callback function context
- \param the callback function to handle the async replies
- \param the parent request if any
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-int ldb_build_extended_req(struct ldb_request **ret_req,
- struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const char *oid,
- void *data,/* NULL or a valid talloc pointer! talloc_get_type() will be used on it */
- struct ldb_control **controls,
- void *context,
- ldb_request_callback_t callback,
- struct ldb_request *parent);
-
-/**
- call an extended operation
-
- This function deletes a record from the database.
-
- \param ldb the context associated with the database (from ldb_init())
- \param oid the OID of the extended operation.
- \param data a void pointer a the extended operation specific parameters,
- it needs to be NULL or a valid talloc pointer! talloc_get_type() will be used on it
- \param res the result of the extended operation
-
- \return result code (LDB_SUCCESS if the extended operation returned fine,
- otherwise a failure code)
-*/
-int ldb_extended(struct ldb_context *ldb,
- const char *oid,
- void *data,/* NULL or a valid talloc pointer! talloc_get_type() will be used on it */
- struct ldb_result **res);
-
-/**
- Obtain current/next database sequence number
-*/
-int ldb_sequence_number(struct ldb_context *ldb, enum ldb_sequence_type type, uint64_t *seq_num);
-
-/**
- start a transaction
-*/
-int ldb_transaction_start(struct ldb_context *ldb);
-
-/**
- first phase of two phase commit
- */
-int ldb_transaction_prepare_commit(struct ldb_context *ldb);
-
-/**
- commit a transaction
-*/
-int ldb_transaction_commit(struct ldb_context *ldb);
-
-/**
- cancel a transaction
-*/
-int ldb_transaction_cancel(struct ldb_context *ldb);
-
-/*
- cancel a transaction with no error if no transaction is pending
- used when we fork() to clear any parent transactions
-*/
-int ldb_transaction_cancel_noerr(struct ldb_context *ldb);
-
-
-/**
- return extended error information from the last call
-*/
-const char *ldb_errstring(struct ldb_context *ldb);
-
-/**
- return a string explaining what a ldb error constant meancs
-*/
-const char *ldb_strerror(int ldb_err);
-
-/**
- setup the default utf8 functions
- FIXME: these functions do not yet handle utf8
-*/
-void ldb_set_utf8_default(struct ldb_context *ldb);
-
-/**
- Casefold a string
-
- \param ldb the ldb context
- \param mem_ctx the memory context to allocate the result string
- memory from.
- \param s the string that is to be folded
- \return a copy of the string, converted to upper case
-
- \note The default function is not yet UTF8 aware. Provide your own
- set of functions through ldb_set_utf8_fns()
-*/
-char *ldb_casefold(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char *s, size_t n);
-
-/**
- Check the attribute name is valid according to rfc2251
- \param s the string to check
-
- \return 1 if the name is ok
-*/
-int ldb_valid_attr_name(const char *s);
-
-/*
- ldif manipulation functions
-*/
-
-/**
- Write an LDIF message
-
- This function writes an LDIF message using a caller supplied write
- function.
-
- \param ldb the ldb context (from ldb_init())
- \param fprintf_fn a function pointer for the write function. This must take
- a private data pointer, followed by a format string, and then a variable argument
- list.
- \param private_data pointer that will be provided back to the write
- function. This is useful for maintaining state or context.
- \param ldif the message to write out
-
- \return the total number of bytes written, or an error code as returned
- from the write function.
-
- \sa ldb_ldif_write_file for a more convenient way to write to a
- file stream.
-
- \sa ldb_ldif_read for the reader equivalent to this function.
-*/
-int ldb_ldif_write(struct ldb_context *ldb,
- int (*fprintf_fn)(void *, const char *, ...) PRINTF_ATTRIBUTE(2,3),
- void *private_data,
- const struct ldb_ldif *ldif);
-
-/**
- Clean up an LDIF message
-
- This function cleans up a LDIF message read using ldb_ldif_read()
- or related functions (such as ldb_ldif_read_string() and
- ldb_ldif_read_file().
-
- \param ldb the ldb context (from ldb_init())
- \param msg the message to clean up and free
-
-*/
-void ldb_ldif_read_free(struct ldb_context *ldb, struct ldb_ldif *msg);
-
-/**
- Read an LDIF message
-
- This function creates an LDIF message using a caller supplied read
- function.
-
- \param ldb the ldb context (from ldb_init())
- \param fgetc_fn a function pointer for the read function. This must
- take a private data pointer, and must return a pointer to an
- integer corresponding to the next byte read (or EOF if there is no
- more data to be read).
- \param private_data pointer that will be provided back to the read
- function. This is udeful for maintaining state or context.
-
- \return the LDIF message that has been read in
-
- \note You must free the LDIF message when no longer required, using
- ldb_ldif_read_free().
-
- \sa ldb_ldif_read_file for a more convenient way to read from a
- file stream.
-
- \sa ldb_ldif_read_string for a more convenient way to read from a
- string (char array).
-
- \sa ldb_ldif_write for the writer equivalent to this function.
-*/
-struct ldb_ldif *ldb_ldif_read(struct ldb_context *ldb,
- int (*fgetc_fn)(void *), void *private_data);
-
-/**
- Read an LDIF message from a file
-
- This function reads the next LDIF message from the contents of a
- file stream. If you want to get all of the LDIF messages, you will
- need to repeatedly call this function, until it returns NULL.
-
- \param ldb the ldb context (from ldb_init())
- \param f the file stream to read from (typically from fdopen())
-
- \sa ldb_ldif_read_string for an equivalent function that will read
- from a string (char array).
-
- \sa ldb_ldif_write_file for the writer equivalent to this function.
-
-*/
-struct ldb_ldif *ldb_ldif_read_file(struct ldb_context *ldb, FILE *f);
-
-/**
- Read an LDIF message from a string
-
- This function reads the next LDIF message from the contents of a char
- array. If you want to get all of the LDIF messages, you will need
- to repeatedly call this function, until it returns NULL.
-
- \param ldb the ldb context (from ldb_init())
- \param s pointer to the char array to read from
-
- \sa ldb_ldif_read_file for an equivalent function that will read
- from a file stream.
-
- \sa ldb_ldif_write for a more general (arbitrary read function)
- version of this function.
-*/
-struct ldb_ldif *ldb_ldif_read_string(struct ldb_context *ldb, const char **s);
-
-/**
- Parse a modrdn LDIF message from a struct ldb_message
-
- \param ldb the ldb context (from ldb_init())
- \param ldif the preparsed LDIF chunk (from ldb_ldif_read())
-
- \param mem_ctx the memory context that's used for return values
-
- \param olddn the old dn as struct ldb_dn, if not needed pass NULL
- \param newrdn the new rdn as struct ldb_dn, if not needed pass NULL
- \param deleteoldrdn the deleteoldrdn value as bool, if not needed pass NULL
- \param newsuperior the newsuperior dn as struct ldb_dn, if not needed pass NULL
- *newsuperior can be NULL as it is optional in the LDIF
- \param newdn the full constructed new dn as struct ldb_dn, if not needed pass NULL
-
-*/
-int ldb_ldif_parse_modrdn(struct ldb_context *ldb,
- const struct ldb_ldif *ldif,
- TALLOC_CTX *mem_ctx,
- struct ldb_dn **olddn,
- struct ldb_dn **newrdn,
- bool *deleteoldrdn,
- struct ldb_dn **newsuperior,
- struct ldb_dn **newdn);
-
-/**
- Write an LDIF message to a file
-
- \param ldb the ldb context (from ldb_init())
- \param f the file stream to write to (typically from fdopen())
- \param msg the message to write out
-
- \return the total number of bytes written, or a negative error code
-
- \sa ldb_ldif_read_file for the reader equivalent to this function.
-*/
-int ldb_ldif_write_file(struct ldb_context *ldb, FILE *f, const struct ldb_ldif *msg);
-
-/**
- Write an LDIF message to a string
-
- \param ldb the ldb context (from ldb_init())
- \param mem_ctx the talloc context on which to attach the string)
- \param msg the message to write out
-
- \return the string containing the LDIF, or NULL on error
-
- \sa ldb_ldif_read_string for the reader equivalent to this function.
-*/
-char * ldb_ldif_write_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
- const struct ldb_ldif *msg);
-
-
-/*
- Produce a string form of an ldb message
-
- convenient function to turn a ldb_message into a string. Useful for
- debugging
- */
-char *ldb_ldif_message_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
- enum ldb_changetype changetype,
- const struct ldb_message *msg);
-
-
-/**
- Base64 encode a buffer
-
- \param mem_ctx the memory context that the result is allocated
- from.
- \param buf pointer to the array that is to be encoded
- \param len the number of elements in the array to be encoded
-
- \return pointer to an array containing the encoded data
-
- \note The caller is responsible for freeing the result
-*/
-char *ldb_base64_encode(TALLOC_CTX *mem_ctx, const char *buf, int len);
-
-/**
- Base64 decode a buffer
-
- This function decodes a base64 encoded string in place.
-
- \param s the string to decode.
-
- \return the length of the returned (decoded) string.
-
- \note the string is null terminated, but the null terminator is not
- included in the length.
-*/
-int ldb_base64_decode(char *s);
-
-/* The following definitions come from lib/ldb/common/ldb_dn.c */
-
-/**
- Get the linear form of a DN (without any extended components)
-
- \param dn The DN to linearize
-*/
-
-const char *ldb_dn_get_linearized(struct ldb_dn *dn);
-
-/**
- Allocate a copy of the linear form of a DN (without any extended components) onto the supplied memory context
-
- \param dn The DN to linearize
- \param mem_ctx TALLOC context to return result on
-*/
-
-char *ldb_dn_alloc_linearized(TALLOC_CTX *mem_ctx, struct ldb_dn *dn);
-
-/**
- Get the linear form of a DN (with any extended components)
-
- \param mem_ctx TALLOC context to return result on
- \param dn The DN to linearize
- \param mode Style of extended DN to return (0 is HEX representation of binary form, 1 is a string form)
-*/
-char *ldb_dn_get_extended_linearized(TALLOC_CTX *mem_ctx, struct ldb_dn *dn, int mode);
-const struct ldb_val *ldb_dn_get_extended_component(struct ldb_dn *dn, const char *name);
-int ldb_dn_set_extended_component(struct ldb_dn *dn, const char *name, const struct ldb_val *val);
-void ldb_dn_extended_filter(struct ldb_dn *dn, const char * const *accept_list);
-void ldb_dn_remove_extended_components(struct ldb_dn *dn);
-bool ldb_dn_has_extended(struct ldb_dn *dn);
-
-int ldb_dn_extended_add_syntax(struct ldb_context *ldb,
- unsigned flags,
- const struct ldb_dn_extended_syntax *syntax);
-
-/**
- Allocate a new DN from a string
-
- \param mem_ctx TALLOC context to return resulting ldb_dn structure on
- \param dn The new DN
-
- \note The DN will not be parsed at this time. Use ldb_dn_validate to tell if the DN is syntacticly correct
-*/
-
-struct ldb_dn *ldb_dn_new(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, const char *dn);
-/**
- Allocate a new DN from a printf style format string and arguments
-
- \param mem_ctx TALLOC context to return resulting ldb_dn structure on
- \param new_fms The new DN as a format string (plus arguments)
-
- \note The DN will not be parsed at this time. Use ldb_dn_validate to tell if the DN is syntacticly correct
-*/
-
-struct ldb_dn *ldb_dn_new_fmt(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, const char *new_fmt, ...) PRINTF_ATTRIBUTE(3,4);
-/**
- Allocate a new DN from a struct ldb_val (useful to avoid buffer overrun)
-
- \param mem_ctx TALLOC context to return resulting ldb_dn structure on
- \param dn The new DN
-
- \note The DN will not be parsed at this time. Use ldb_dn_validate to tell if the DN is syntacticly correct
-*/
-
-struct ldb_dn *ldb_dn_from_ldb_val(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, const struct ldb_val *strdn);
-
-/**
- Determine if this DN is syntactically valid
-
- \param dn The DN to validate
-*/
-
-bool ldb_dn_validate(struct ldb_dn *dn);
-
-char *ldb_dn_escape_value(TALLOC_CTX *mem_ctx, struct ldb_val value);
-const char *ldb_dn_get_casefold(struct ldb_dn *dn);
-char *ldb_dn_alloc_casefold(TALLOC_CTX *mem_ctx, struct ldb_dn *dn);
-
-int ldb_dn_compare_base(struct ldb_dn *base, struct ldb_dn *dn);
-int ldb_dn_compare(struct ldb_dn *edn0, struct ldb_dn *edn1);
-
-bool ldb_dn_add_base(struct ldb_dn *dn, struct ldb_dn *base);
-bool ldb_dn_add_base_fmt(struct ldb_dn *dn, const char *base_fmt, ...) PRINTF_ATTRIBUTE(2,3);
-bool ldb_dn_add_child(struct ldb_dn *dn, struct ldb_dn *child);
-bool ldb_dn_add_child_fmt(struct ldb_dn *dn, const char *child_fmt, ...) PRINTF_ATTRIBUTE(2,3);
-bool ldb_dn_remove_base_components(struct ldb_dn *dn, unsigned int num);
-bool ldb_dn_remove_child_components(struct ldb_dn *dn, unsigned int num);
-
-struct ldb_dn *ldb_dn_copy(TALLOC_CTX *mem_ctx, struct ldb_dn *dn);
-struct ldb_dn *ldb_dn_get_parent(TALLOC_CTX *mem_ctx, struct ldb_dn *dn);
-char *ldb_dn_canonical_string(TALLOC_CTX *mem_ctx, struct ldb_dn *dn);
-char *ldb_dn_canonical_ex_string(TALLOC_CTX *mem_ctx, struct ldb_dn *dn);
-int ldb_dn_get_comp_num(struct ldb_dn *dn);
-int ldb_dn_get_extended_comp_num(struct ldb_dn *dn);
-const char *ldb_dn_get_component_name(struct ldb_dn *dn, unsigned int num);
-const struct ldb_val *ldb_dn_get_component_val(struct ldb_dn *dn, unsigned int num);
-const char *ldb_dn_get_rdn_name(struct ldb_dn *dn);
-const struct ldb_val *ldb_dn_get_rdn_val(struct ldb_dn *dn);
-int ldb_dn_set_component(struct ldb_dn *dn, int num, const char *name, const struct ldb_val val);
-
-bool ldb_dn_is_valid(struct ldb_dn *dn);
-bool ldb_dn_is_special(struct ldb_dn *dn);
-bool ldb_dn_check_special(struct ldb_dn *dn, const char *check);
-bool ldb_dn_is_null(struct ldb_dn *dn);
-int ldb_dn_update_components(struct ldb_dn *dn, const struct ldb_dn *ref_dn);
-
-
-/**
- Compare two attributes
-
- This function compares to attribute names. Note that this is a
- case-insensitive comparison.
-
- \param a the first attribute name to compare
- \param b the second attribute name to compare
-
- \return 0 if the attribute names are the same, or only differ in
- case; non-zero if there are any differences
-
- attribute names are restricted by rfc2251 so using
- strcasecmp and toupper here is ok.
- return 0 for match
-*/
-#define ldb_attr_cmp(a, b) strcasecmp(a, b)
-char *ldb_attr_casefold(TALLOC_CTX *mem_ctx, const char *s);
-int ldb_attr_dn(const char *attr);
-
-/**
- Create an empty message
-
- \param mem_ctx the memory context to create in. You can pass NULL
- to get the top level context, however the ldb context (from
- ldb_init()) may be a better choice
-*/
-struct ldb_message *ldb_msg_new(TALLOC_CTX *mem_ctx);
-
-/**
- Find an element within an message
-*/
-struct ldb_message_element *ldb_msg_find_element(const struct ldb_message *msg,
- const char *attr_name);
-
-/**
- Compare two ldb_val values
-
- \param v1 first ldb_val structure to be tested
- \param v2 second ldb_val structure to be tested
-
- \return 1 for a match, 0 if there is any difference
-*/
-int ldb_val_equal_exact(const struct ldb_val *v1, const struct ldb_val *v2);
-
-/**
- find a value within an ldb_message_element
-
- \param el the element to search
- \param val the value to search for
-
- \note This search is case sensitive
-*/
-struct ldb_val *ldb_msg_find_val(const struct ldb_message_element *el,
- struct ldb_val *val);
-
-/**
- add a new empty element to a ldb_message
-*/
-int ldb_msg_add_empty(struct ldb_message *msg,
- const char *attr_name,
- int flags,
- struct ldb_message_element **return_el);
-
-/**
- add a element to a ldb_message
-*/
-int ldb_msg_add(struct ldb_message *msg,
- const struct ldb_message_element *el,
- int flags);
-int ldb_msg_add_value(struct ldb_message *msg,
- const char *attr_name,
- const struct ldb_val *val,
- struct ldb_message_element **return_el);
-int ldb_msg_add_steal_value(struct ldb_message *msg,
- const char *attr_name,
- struct ldb_val *val);
-int ldb_msg_add_steal_string(struct ldb_message *msg,
- const char *attr_name, char *str);
-int ldb_msg_add_string(struct ldb_message *msg,
- const char *attr_name, const char *str);
-int ldb_msg_add_linearized_dn(struct ldb_message *msg, const char *attr_name,
- struct ldb_dn *dn);
-int ldb_msg_add_fmt(struct ldb_message *msg,
- const char *attr_name, const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
-
-/**
- compare two message elements - return 0 on match
-*/
-int ldb_msg_element_compare(struct ldb_message_element *el1,
- struct ldb_message_element *el2);
-int ldb_msg_element_compare_name(struct ldb_message_element *el1,
- struct ldb_message_element *el2);
-
-/**
- Find elements in a message.
-
- This function finds elements and converts to a specific type, with
- a give default value if not found. Assumes that elements are
- single valued.
-*/
-const struct ldb_val *ldb_msg_find_ldb_val(const struct ldb_message *msg, const char *attr_name);
-int ldb_msg_find_attr_as_int(const struct ldb_message *msg,
- const char *attr_name,
- int default_value);
-unsigned int ldb_msg_find_attr_as_uint(const struct ldb_message *msg,
- const char *attr_name,
- unsigned int default_value);
-int64_t ldb_msg_find_attr_as_int64(const struct ldb_message *msg,
- const char *attr_name,
- int64_t default_value);
-uint64_t ldb_msg_find_attr_as_uint64(const struct ldb_message *msg,
- const char *attr_name,
- uint64_t default_value);
-double ldb_msg_find_attr_as_double(const struct ldb_message *msg,
- const char *attr_name,
- double default_value);
-int ldb_msg_find_attr_as_bool(const struct ldb_message *msg,
- const char *attr_name,
- int default_value);
-const char *ldb_msg_find_attr_as_string(const struct ldb_message *msg,
- const char *attr_name,
- const char *default_value);
-
-struct ldb_dn *ldb_msg_find_attr_as_dn(struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const struct ldb_message *msg,
- const char *attr_name);
-
-void ldb_msg_sort_elements(struct ldb_message *msg);
-
-struct ldb_message *ldb_msg_copy_shallow(TALLOC_CTX *mem_ctx,
- const struct ldb_message *msg);
-struct ldb_message *ldb_msg_copy(TALLOC_CTX *mem_ctx,
- const struct ldb_message *msg);
-
-/*
- * ldb_msg_canonicalize() is now depreciated
- * Please use ldb_msg_normalize() instead
- *
- * NOTE: Returned ldb_message object is allocated
- * into *ldb's context. Callers are recommended
- * to steal the returned object into a TALLOC_CTX
- * with short lifetime.
- */
-struct ldb_message *ldb_msg_canonicalize(struct ldb_context *ldb,
- const struct ldb_message *msg) _DEPRECATED_;
-
-int ldb_msg_normalize(struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- const struct ldb_message *msg,
- struct ldb_message **_msg_out);
-
-
-/*
- * ldb_msg_diff() is now depreciated
- * Please use ldb_msg_difference() instead
- *
- * NOTE: Returned ldb_message object is allocated
- * into *ldb's context. Callers are recommended
- * to steal the returned object into a TALLOC_CTX
- * with short lifetime.
- */
-struct ldb_message *ldb_msg_diff(struct ldb_context *ldb,
- struct ldb_message *msg1,
- struct ldb_message *msg2) _DEPRECATED_;
-
-/**
- * return a ldb_message representing the differences between msg1 and msg2.
- * If you then use this in a ldb_modify() call,
- * it can be used to save edits to a message
- *
- * Result message is constructed as follows:
- * - LDB_FLAG_MOD_ADD - elements found only in msg2
- * - LDB_FLAG_MOD_REPLACE - elements in msg2 that have
- * different value in msg1
- * Value for msg2 element is used
- * - LDB_FLAG_MOD_DELETE - elements found only in msg2
- *
- * @return LDB_SUCCESS or LDB_ERR_OPERATIONS_ERROR
- */
-int ldb_msg_difference(struct ldb_context *ldb,
- TALLOC_CTX *mem_ctx,
- struct ldb_message *msg1,
- struct ldb_message *msg2,
- struct ldb_message **_msg_out);
-
-/**
- Tries to find a certain string attribute in a message
-
- \param msg the message to check
- \param name attribute name
- \param value attribute value
-
- \return 1 on match and 0 otherwise.
-*/
-int ldb_msg_check_string_attribute(const struct ldb_message *msg,
- const char *name,
- const char *value);
-
-/**
- Integrity check an ldb_message
-
- This function performs basic sanity / integrity checks on an
- ldb_message.
-
- \param ldb context in which to perform the checks
- \param msg the message to check
-
- \return LDB_SUCCESS if the message is OK, or a non-zero error code
- (one of LDB_ERR_INVALID_DN_SYNTAX, LDB_ERR_ENTRY_ALREADY_EXISTS or
- LDB_ERR_INVALID_ATTRIBUTE_SYNTAX) if there is a problem with a
- message.
-*/
-int ldb_msg_sanity_check(struct ldb_context *ldb,
- const struct ldb_message *msg);
-
-/**
- Duplicate an ldb_val structure
-
- This function copies an ldb value structure.
-
- \param mem_ctx the memory context that the duplicated value will be
- allocated from
- \param v the ldb_val to be duplicated.
-
- \return the duplicated ldb_val structure.
-*/
-struct ldb_val ldb_val_dup(TALLOC_CTX *mem_ctx, const struct ldb_val *v);
-
-/**
- this allows the user to set a debug function for error reporting
-*/
-int ldb_set_debug(struct ldb_context *ldb,
- void (*debug)(void *context, enum ldb_debug_level level,
- const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0),
- void *context);
-
-/**
- this allows the user to set custom utf8 function for error reporting
-*/
-void ldb_set_utf8_fns(struct ldb_context *ldb,
- void *context,
- char *(*casefold)(void *, void *, const char *, size_t n));
-
-/**
- this sets up debug to print messages on stderr
-*/
-int ldb_set_debug_stderr(struct ldb_context *ldb);
-
-/* control backend specific opaque values */
-int ldb_set_opaque(struct ldb_context *ldb, const char *name, void *value);
-void *ldb_get_opaque(struct ldb_context *ldb, const char *name);
-
-const char **ldb_attr_list_copy(TALLOC_CTX *mem_ctx, const char * const *attrs);
-const char **ldb_attr_list_copy_add(TALLOC_CTX *mem_ctx, const char * const *attrs, const char *new_attr);
-int ldb_attr_in_list(const char * const *attrs, const char *attr);
-
-int ldb_msg_rename_attr(struct ldb_message *msg, const char *attr, const char *replace);
-int ldb_msg_copy_attr(struct ldb_message *msg, const char *attr, const char *replace);
-void ldb_msg_remove_attr(struct ldb_message *msg, const char *attr);
-void ldb_msg_remove_element(struct ldb_message *msg, struct ldb_message_element *el);
-
-
-void ldb_parse_tree_attr_replace(struct ldb_parse_tree *tree,
- const char *attr,
- const char *replace);
-
-/*
- shallow copy a tree - copying only the elements array so that the caller
- can safely add new elements without changing the message
-*/
-struct ldb_parse_tree *ldb_parse_tree_copy_shallow(TALLOC_CTX *mem_ctx,
- const struct ldb_parse_tree *ot);
-
-/**
- Convert a time structure to a string
-
- This function converts a time_t structure to an LDAP formatted
- GeneralizedTime string.
-
- \param mem_ctx the memory context to allocate the return string in
- \param t the time structure to convert
-
- \return the formatted string, or NULL if the time structure could
- not be converted
-*/
-char *ldb_timestring(TALLOC_CTX *mem_ctx, time_t t);
-
-/**
- Convert a string to a time structure
-
- This function converts an LDAP formatted GeneralizedTime string
- to a time_t structure.
-
- \param s the string to convert
-
- \return the time structure, or 0 if the string cannot be converted
-*/
-time_t ldb_string_to_time(const char *s);
-
-/**
- convert a LDAP GeneralizedTime string in ldb_val format to a
- time_t.
-*/
-int ldb_val_to_time(const struct ldb_val *v, time_t *t);
-
-/**
- Convert a time structure to a string
-
- This function converts a time_t structure to an LDAP formatted
- UTCTime string.
-
- \param mem_ctx the memory context to allocate the return string in
- \param t the time structure to convert
-
- \return the formatted string, or NULL if the time structure could
- not be converted
-*/
-char *ldb_timestring_utc(TALLOC_CTX *mem_ctx, time_t t);
-
-/**
- Convert a string to a time structure
-
- This function converts an LDAP formatted UTCTime string
- to a time_t structure.
-
- \param s the string to convert
-
- \return the time structure, or 0 if the string cannot be converted
-*/
-time_t ldb_string_utc_to_time(const char *s);
-
-
-void ldb_qsort (void *const pbase, size_t total_elems, size_t size, void *opaque, ldb_qsort_cmp_fn_t cmp);
-
-#ifndef discard_const
-#define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
-#endif
-
-/*
- a wrapper around ldb_qsort() that ensures the comparison function is
- type safe. This will produce a compilation warning if the types
- don't match
- */
-#define LDB_TYPESAFE_QSORT(base, numel, opaque, comparison) \
-do { \
- if (numel > 1) { \
- ldb_qsort(base, numel, sizeof((base)[0]), discard_const(opaque), (ldb_qsort_cmp_fn_t)comparison); \
- comparison(&((base)[0]), &((base)[1]), opaque); \
- } \
-} while (0)
-
-/* allow ldb to also call TYPESAFE_QSORT() */
-#ifndef TYPESAFE_QSORT
-#define TYPESAFE_QSORT(base, numel, comparison) \
-do { \
- if (numel > 1) { \
- qsort(base, numel, sizeof((base)[0]), (int (*)(const void *, const void *))comparison); \
- comparison(&((base)[0]), &((base)[1])); \
- } \
-} while (0)
-#endif
-
-
-
-/**
- Convert a control into its string representation.
-
- \param mem_ctx TALLOC context to return result on, and to allocate error_string on
- \param control A struct ldb_control to convert
-
- \return string representation of the control
-*/
-char* ldb_control_to_string(TALLOC_CTX *mem_ctx, const struct ldb_control *control);
-/**
- Convert a string representing a control into a ldb_control structure
-
- \param ldb LDB context
- \param mem_ctx TALLOC context to return result on, and to allocate error_string on
- \param control_strings A string-formatted control
-
- \return a ldb_control element
-*/
-struct ldb_control *ldb_parse_control_from_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char *control_strings);
-/**
- Convert an array of string represention of a control into an array of ldb_control structures
-
- \param ldb LDB context
- \param mem_ctx TALLOC context to return result on, and to allocate error_string on
- \param control_strings Array of string-formatted controls
-
- \return array of ldb_control elements
-*/
-struct ldb_control **ldb_parse_control_strings(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char **control_strings);
-
-/**
- return the ldb flags
-*/
-unsigned int ldb_get_flags(struct ldb_context *ldb);
-
-/* set the ldb flags */
-void ldb_set_flags(struct ldb_context *ldb, unsigned flags);
-
-
-struct ldb_dn *ldb_dn_binary_from_ldb_val(TALLOC_CTX *mem_ctx,
- struct ldb_context *ldb,
- const struct ldb_val *strdn);
-
-int ldb_dn_get_binary(struct ldb_dn *dn, struct ldb_val *val);
-int ldb_dn_set_binary(struct ldb_dn *dn, struct ldb_val *val);
-
-/* debugging functions for ldb requests */
-void ldb_req_set_location(struct ldb_request *req, const char *location);
-const char *ldb_req_location(struct ldb_request *req);
-
-/* set the location marker on a request handle - used for debugging */
-#define LDB_REQ_SET_LOCATION(req) ldb_req_set_location(req, __location__)
-
-/*
- minimise a DN. The caller must pass in a validated DN.
-
- If the DN has an extended component then only the first extended
- component is kept, the DN string is stripped.
-
- The existing dn is modified
- */
-bool ldb_dn_minimise(struct ldb_dn *dn);
-
-#endif
diff --git a/source4/lib/ldb/include/ldb_errors.h b/source4/lib/ldb/include/ldb_errors.h
deleted file mode 100644
index b247fbe09c..0000000000
--- a/source4/lib/ldb/include/ldb_errors.h
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb header
- *
- * Description: defines error codes following RFC 2251 ldap error codes
- *
- * Author: Simo Sorce
- */
-
-#ifndef _LDB_ERRORS_H_
-
-/*! \cond DOXYGEN_IGNORE */
-#define _LDB_ERRORS_H_ 1
-/*! \endcond */
-
-/**
- \file ldb_errors.h
-
- This header provides a set of result codes for LDB function calls.
-
- Many LDB function calls return an integer value (int). As shown in
- the function documentation, those return values may indicate
- whether the function call worked correctly (in which case it
- returns LDB_SUCCESS) or some problem occurred (in which case some
- other value will be returned). As a special case,
- LDB_ERR_COMPARE_FALSE or LDB_ERR_COMPARE_TRUE may be returned,
- which does not indicate an error.
-
- \note Not all error codes make sense for LDB, however they are
- based on the LDAP error codes, and are kept for reference and to
- avoid overlap.
-
- \note Some of this documentation is based on information in
- the OpenLDAP documentation, as developed and maintained by the
- <a href="http://www.openldap.org/">The OpenLDAP Project</a>.
- */
-
-/**
- The function call succeeded.
-
- If a function returns LDB_SUCCESS, then that function, and the
- underlying transactions that may have been required, completed
- successfully.
-*/
-#define LDB_SUCCESS 0
-
-/**
- The function call failed for some non-specific reason.
-*/
-#define LDB_ERR_OPERATIONS_ERROR 1
-
-/**
- The function call failed because of a protocol violation.
-*/
-#define LDB_ERR_PROTOCOL_ERROR 2
-
-/**
- The function call failed because a time limit was exceeded.
-*/
-#define LDB_ERR_TIME_LIMIT_EXCEEDED 3
-
-/**
- The function call failed because a size limit was exceeded.
-*/
-#define LDB_ERR_SIZE_LIMIT_EXCEEDED 4
-
-/**
- The function was for value comparison, and the comparison operation
- returned false.
-
- \note This is a status value, and doesn't normally indicate an
- error.
-*/
-#define LDB_ERR_COMPARE_FALSE 5
-
-/**
- The function was for value comparison, and the comparison operation
- returned true.
-
- \note This is a status value, and doesn't normally indicate an
- error.
-*/
-#define LDB_ERR_COMPARE_TRUE 6
-
-/**
- The function used an authentication method that is not supported by
- the database.
-*/
-#define LDB_ERR_AUTH_METHOD_NOT_SUPPORTED 7
-
-/**
- The function call required a underlying operation that required
- strong authentication.
-
- This will normally only occur if you are using LDB with a LDAP
- backend.
-*/
-#define LDB_ERR_STRONG_AUTH_REQUIRED 8
-
-/* 9 RESERVED */
-
-/**
- The function resulted in a referral to another server.
-*/
-#define LDB_ERR_REFERRAL 10
-
-/**
- The function failed because an administrative / policy limit was
- exceeded.
-*/
-#define LDB_ERR_ADMIN_LIMIT_EXCEEDED 11
-
-/**
- The function required an extension or capability that the
- database cannot provide.
-*/
-#define LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION 12
-
-/**
- The function involved a transaction or database operation that
- could not be performed without a secure link.
-*/
-#define LDB_ERR_CONFIDENTIALITY_REQUIRED 13
-
-/**
- This is an intermediate result code for SASL bind operations that
- have more than one step.
-
- \note This is a result code that does not normally indicate an
- error has occurred.
-*/
-#define LDB_ERR_SASL_BIND_IN_PROGRESS 14
-
-/**
- The function referred to an attribute type that is not present in
- the entry.
-*/
-#define LDB_ERR_NO_SUCH_ATTRIBUTE 16
-
-/**
- The function referred to an attribute type that is invalid
-*/
-#define LDB_ERR_UNDEFINED_ATTRIBUTE_TYPE 17
-
-/**
- The function required a filter type that is not available for the
- specified attribute.
-*/
-#define LDB_ERR_INAPPROPRIATE_MATCHING 18
-
-/**
- The function would have violated an attribute constraint.
-*/
-#define LDB_ERR_CONSTRAINT_VIOLATION 19
-
-/**
- The function involved an attribute type or attribute value that
- already exists in the entry.
-*/
-#define LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS 20
-
-/**
- The function used an invalid (incorrect syntax) attribute value.
-*/
-#define LDB_ERR_INVALID_ATTRIBUTE_SYNTAX 21
-
-/* 22-31 unused */
-
-/**
- The function referred to an object that does not exist in the
- database.
-*/
-#define LDB_ERR_NO_SUCH_OBJECT 32
-
-/**
- The function referred to an alias which points to a non-existent
- object in the database.
-*/
-#define LDB_ERR_ALIAS_PROBLEM 33
-
-/**
- The function used a DN which was invalid (incorrect syntax).
-*/
-#define LDB_ERR_INVALID_DN_SYNTAX 34
-
-/* 35 RESERVED */
-
-/**
- The function required dereferencing of an alias, and something went
- wrong during the dereferencing process.
-*/
-#define LDB_ERR_ALIAS_DEREFERENCING_PROBLEM 36
-
-/* 37-47 unused */
-
-/**
- The function passed in the wrong authentication method.
-*/
-#define LDB_ERR_INAPPROPRIATE_AUTHENTICATION 48
-
-/**
- The function passed in or referenced incorrect credentials during
- authentication.
-*/
-#define LDB_ERR_INVALID_CREDENTIALS 49
-
-/**
- The function required access permissions that the user does not
- possess.
-*/
-#define LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS 50
-
-/**
- The function required a transaction or call that the database could
- not perform because it is busy.
-*/
-#define LDB_ERR_BUSY 51
-
-/**
- The function required a transaction or call to a database that is
- not available.
-*/
-#define LDB_ERR_UNAVAILABLE 52
-
-/**
- The function required a transaction or call to a database that the
- database declined to perform.
-*/
-#define LDB_ERR_UNWILLING_TO_PERFORM 53
-
-/**
- The function failed because it resulted in a loop being detected.
-*/
-#define LDB_ERR_LOOP_DETECT 54
-
-/* 55-63 unused */
-
-/**
- The function failed because it would have violated a naming rule.
-*/
-#define LDB_ERR_NAMING_VIOLATION 64
-
-/**
- The function failed because it would have violated the schema.
-*/
-#define LDB_ERR_OBJECT_CLASS_VIOLATION 65
-
-/**
- The function required an operation that is only allowed on leaf
- objects, but the object is not a leaf.
-*/
-#define LDB_ERR_NOT_ALLOWED_ON_NON_LEAF 66
-
-/**
- The function required an operation that cannot be performed on a
- Relative DN, but the object is a Relative DN.
-*/
-#define LDB_ERR_NOT_ALLOWED_ON_RDN 67
-
-/**
- The function failed because the entry already exists.
-*/
-#define LDB_ERR_ENTRY_ALREADY_EXISTS 68
-
-/**
- The function failed because modifications to an object class are
- not allowable.
-*/
-#define LDB_ERR_OBJECT_CLASS_MODS_PROHIBITED 69
-
-/* 70 RESERVED FOR CLDAP */
-
-/**
- The function failed because it needed to be applied to multiple
- databases.
-*/
-#define LDB_ERR_AFFECTS_MULTIPLE_DSAS 71
-
-/* 72-79 unused */
-
-/**
- The function failed for unknown reasons.
-*/
-#define LDB_ERR_OTHER 80
-
-/* 81-90 RESERVED for APIs */
-
-#endif /* _LDB_ERRORS_H_ */
diff --git a/source4/lib/ldb/include/ldb_handlers.h b/source4/lib/ldb/include/ldb_handlers.h
deleted file mode 100644
index 6e71f1fa01..0000000000
--- a/source4/lib/ldb/include/ldb_handlers.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb header
- *
- * Description: defines attribute handlers
- *
- * Author: Simo Sorce
- */
-
-int ldb_handler_copy( struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *in, struct ldb_val *out);
-int ldb_comparison_binary( struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2);
-int ldb_comparison_fold( struct ldb_context *ldb, void *mem_ctx,
- const struct ldb_val *v1, const struct ldb_val *v2);
-
diff --git a/source4/lib/ldb/include/ldb_module.h b/source4/lib/ldb/include/ldb_module.h
deleted file mode 100644
index 6d6fff251c..0000000000
--- a/source4/lib/ldb/include/ldb_module.h
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb module header
- *
- * Description: defines ldb modules structures and helpers
- *
- */
-
-#ifndef _LDB_MODULE_H_
-#define _LDB_MODULE_H_
-
-#include <ldb.h>
-
-struct ldb_context;
-struct ldb_module;
-
-/**
- internal flag bits on message elements. Must be within LDB_FLAG_INTERNAL_MASK
- */
-#define LDB_FLAG_INTERNAL_DISABLE_VALIDATION 0x10
-
-/* disable any single value checking on this attribute */
-#define LDB_FLAG_INTERNAL_DISABLE_SINGLE_VALUE_CHECK 0x20
-
-/* attribute has failed access check and must not be exposed */
-#define LDB_FLAG_INTERNAL_INACCESSIBLE_ATTRIBUTE 0x40
-
-/* force single value checking on this attribute */
-#define LDB_FLAG_INTERNAL_FORCE_SINGLE_VALUE_CHECK 0x80
-
-
-/*
- these function pointers define the operations that a ldb module can intercept
-*/
-struct ldb_module_ops {
- const char *name;
- int (*init_context) (struct ldb_module *);
- int (*search)(struct ldb_module *, struct ldb_request *); /* search */
- int (*add)(struct ldb_module *, struct ldb_request *); /* add */
- int (*modify)(struct ldb_module *, struct ldb_request *); /* modify */
- int (*del)(struct ldb_module *, struct ldb_request *); /* delete */
- int (*rename)(struct ldb_module *, struct ldb_request *); /* rename */
- int (*request)(struct ldb_module *, struct ldb_request *); /* match any other operation */
- int (*extended)(struct ldb_module *, struct ldb_request *); /* extended operations */
- int (*start_transaction)(struct ldb_module *);
- int (*prepare_commit)(struct ldb_module *);
- int (*end_transaction)(struct ldb_module *);
- int (*del_transaction)(struct ldb_module *);
- int (*sequence_number)(struct ldb_module *, struct ldb_request *);
- void *private_data;
-};
-
-
-/* The following definitions come from lib/ldb/common/ldb_debug.c */
-void ldb_debug(struct ldb_context *ldb, enum ldb_debug_level level, const char *fmt, ...) PRINTF_ATTRIBUTE(3, 4);
-void ldb_debug_set(struct ldb_context *ldb, enum ldb_debug_level level,
- const char *fmt, ...) PRINTF_ATTRIBUTE(3, 4);
-void ldb_debug_add(struct ldb_context *ldb, const char *fmt, ...) PRINTF_ATTRIBUTE(2, 3);
-void ldb_debug_end(struct ldb_context *ldb, enum ldb_debug_level level);
-
-#define ldb_error(ldb, ecode, reason) ldb_error_at(ldb, ecode, reason, __FILE__, __LINE__)
-
-#define ldb_oom(ldb) ldb_error(ldb, LDB_ERR_OPERATIONS_ERROR, "ldb out of memory")
-#define ldb_module_oom(module) ldb_oom(ldb_module_get_ctx(module))
-#define ldb_operr(ldb) ldb_error(ldb, LDB_ERR_OPERATIONS_ERROR, "operations error")
-
-/* The following definitions come from lib/ldb/common/ldb.c */
-
-void ldb_request_set_state(struct ldb_request *req, int state);
-int ldb_request_get_status(struct ldb_request *req);
-
-unsigned int ldb_get_create_perms(struct ldb_context *ldb);
-
-const struct ldb_schema_syntax *ldb_standard_syntax_by_name(struct ldb_context *ldb,
- const char *syntax);
-
-/* The following definitions come from lib/ldb/common/ldb_attributes.c */
-
-int ldb_schema_attribute_add_with_syntax(struct ldb_context *ldb,
- const char *name,
- unsigned flags,
- const struct ldb_schema_syntax *syntax);
-int ldb_schema_attribute_add(struct ldb_context *ldb,
- const char *name,
- unsigned flags,
- const char *syntax);
-void ldb_schema_attribute_remove(struct ldb_context *ldb, const char *name);
-
-/* we allow external code to override the name -> schema_attribute function */
-typedef const struct ldb_schema_attribute *(*ldb_attribute_handler_override_fn_t)(struct ldb_context *, void *, const char *);
-
-void ldb_schema_attribute_set_override_handler(struct ldb_context *ldb,
- ldb_attribute_handler_override_fn_t override,
- void *private_data);
-
-/* A useful function to build comparison functions with */
-int ldb_any_comparison(struct ldb_context *ldb, void *mem_ctx,
- ldb_attr_handler_t canonicalise_fn,
- const struct ldb_val *v1,
- const struct ldb_val *v2);
-
-/* The following definitions come from lib/ldb/common/ldb_controls.c */
-int ldb_save_controls(struct ldb_control *exclude, struct ldb_request *req, struct ldb_control ***saver);
-/* Returns a list of controls, except the one specified. Included
- * controls become a child of returned list if they were children of
- * controls_in */
-struct ldb_control **ldb_controls_except_specified(struct ldb_control **controls_in,
- TALLOC_CTX *mem_ctx,
- struct ldb_control *exclude);
-int ldb_check_critical_controls(struct ldb_control **controls);
-
-/* The following definitions come from lib/ldb/common/ldb_ldif.c */
-int ldb_should_b64_encode(struct ldb_context *ldb, const struct ldb_val *val);
-
-/* The following definitions come from lib/ldb/common/ldb_match.c */
-int ldb_match_msg(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- struct ldb_dn *base,
- enum ldb_scope scope);
-
-int ldb_match_msg_error(struct ldb_context *ldb,
- const struct ldb_message *msg,
- const struct ldb_parse_tree *tree,
- struct ldb_dn *base,
- enum ldb_scope scope,
- bool *matched);
-
-int ldb_match_msg_objectclass(const struct ldb_message *msg,
- const char *objectclass);
-
-/* The following definitions come from lib/ldb/common/ldb_modules.c */
-
-struct ldb_module *ldb_module_new(TALLOC_CTX *memctx,
- struct ldb_context *ldb,
- const char *module_name,
- const struct ldb_module_ops *ops);
-
-const char * ldb_module_get_name(struct ldb_module *module);
-struct ldb_context *ldb_module_get_ctx(struct ldb_module *module);
-void *ldb_module_get_private(struct ldb_module *module);
-void ldb_module_set_private(struct ldb_module *module, void *private_data);
-const struct ldb_module_ops *ldb_module_get_ops(struct ldb_module *module);
-
-int ldb_next_request(struct ldb_module *module, struct ldb_request *request);
-int ldb_next_start_trans(struct ldb_module *module);
-int ldb_next_end_trans(struct ldb_module *module);
-int ldb_next_del_trans(struct ldb_module *module);
-int ldb_next_prepare_commit(struct ldb_module *module);
-int ldb_next_init(struct ldb_module *module);
-
-void ldb_set_errstring(struct ldb_context *ldb, const char *err_string);
-void ldb_asprintf_errstring(struct ldb_context *ldb, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
-void ldb_reset_err_string(struct ldb_context *ldb);
-int ldb_error_at(struct ldb_context *ldb, int ecode, const char *reason, const char *file, int line);
-
-const char *ldb_default_modules_dir(void);
-
-int ldb_register_module(const struct ldb_module_ops *);
-
-typedef int (*ldb_connect_fn)(struct ldb_context *ldb, const char *url,
- unsigned int flags, const char *options[],
- struct ldb_module **module);
-
-struct ldb_backend_ops {
- const char *name;
- ldb_connect_fn connect_fn;
-};
-
-const char *ldb_default_modules_dir(void);
-
-int ldb_register_backend(const char *url_prefix, ldb_connect_fn, bool);
-
-struct ldb_handle *ldb_handle_new(TALLOC_CTX *mem_ctx, struct ldb_context *ldb);
-
-int ldb_module_send_entry(struct ldb_request *req,
- struct ldb_message *msg,
- struct ldb_control **ctrls);
-
-int ldb_module_send_referral(struct ldb_request *req,
- char *ref);
-
-int ldb_module_done(struct ldb_request *req,
- struct ldb_control **ctrls,
- struct ldb_extended *response,
- int error);
-
-int ldb_mod_register_control(struct ldb_module *module, const char *oid);
-
-void ldb_set_default_dns(struct ldb_context *ldb);
-/**
- Add a ldb_control to a ldb_reply
-
- \param ares the reply struct where to add the control
- \param oid the object identifier of the control as string
- \param critical whether the control should be critical or not
- \param data a talloc pointer to the control specific data
-
- \return result code (LDB_SUCCESS on success, or a failure code)
-*/
-int ldb_reply_add_control(struct ldb_reply *ares, const char *oid, bool critical, void *data);
-
-/**
- mark a request as untrusted. This tells the rootdse module to remove
- unregistered controls
- */
-void ldb_req_mark_untrusted(struct ldb_request *req);
-
-/**
- mark a request as trusted.
- */
-void ldb_req_mark_trusted(struct ldb_request *req);
-
-/**
- return true is a request is untrusted
- */
-bool ldb_req_is_untrusted(struct ldb_request *req);
-
-/**
- set custom flags. Those flags are set by applications using ldb,
- they are application dependent and the same bit can have different
- meaning in different application.
- */
-void ldb_req_set_custom_flags(struct ldb_request *req, uint32_t flags);
-
-/**
- get custom flags. Those flags are set by applications using ldb,
- they are application dependent and the same bit can have different
- meaning in different application.
- */
-uint32_t ldb_req_get_custom_flags(struct ldb_request *req);
-
-/* load all modules from the given directory */
-int ldb_modules_load(const char *modules_path, const char *version);
-
-/* init functions prototype */
-typedef int (*ldb_module_init_fn)(const char *);
-
-/*
- general ldb hook function
- */
-enum ldb_module_hook_type { LDB_MODULE_HOOK_CMDLINE_OPTIONS = 1,
- LDB_MODULE_HOOK_CMDLINE_PRECONNECT = 2,
- LDB_MODULE_HOOK_CMDLINE_POSTCONNECT = 3 };
-
-typedef int (*ldb_hook_fn)(struct ldb_context *, enum ldb_module_hook_type );
-
-/*
- register a ldb hook function
- */
-int ldb_register_hook(ldb_hook_fn hook_fn);
-
-/*
- call ldb hooks of a given type
- */
-int ldb_modules_hook(struct ldb_context *ldb, enum ldb_module_hook_type t);
-
-#define LDB_MODULE_CHECK_VERSION(version) do { \
- if (strcmp(version, LDB_VERSION) != 0) { \
- fprintf(stderr, "ldb: module version mismatch in %s : ldb_version=%s module_version=%s\n", \
- __FILE__, version, LDB_VERSION); \
- return LDB_ERR_UNAVAILABLE; \
- }} while (0)
-
-
-/*
- return a string representation of the calling chain for the given
- ldb request
- */
-char *ldb_module_call_chain(struct ldb_request *req, TALLOC_CTX *mem_ctx);
-
-/*
- return the next module in the chain
- */
-struct ldb_module *ldb_module_next(struct ldb_module *module);
-
-/*
- set the next module in the module chain
- */
-void ldb_module_set_next(struct ldb_module *module, struct ldb_module *next);
-
-/*
- load a list of modules
- */
-int ldb_module_load_list(struct ldb_context *ldb, const char **module_list,
- struct ldb_module *backend, struct ldb_module **out);
-
-/*
- get the popt_options pointer in the ldb structure. This allows a ldb
- module to change the command line parsing
- */
-struct poptOption **ldb_module_popt_options(struct ldb_context *ldb);
-
-/* modules are called in inverse order on the stack.
- Lets place them as an admin would think the right order is.
- Modules order is important */
-const char **ldb_modules_list_from_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char *string);
-
-/*
- return the current ldb flags LDB_FLG_*
- */
-uint32_t ldb_module_flags(struct ldb_context *ldb);
-
-int ldb_module_connect_backend(struct ldb_context *ldb,
- const char *url,
- const char *options[],
- struct ldb_module **backend_module);
-
-/*
- initialise a chain of modules
- */
-int ldb_module_init_chain(struct ldb_context *ldb, struct ldb_module *module);
-
-/*
- * prototype for the init function defined by dynamically loaded modules
- */
-int ldb_init_module(const char *version);
-
-
-#endif
diff --git a/source4/lib/ldb/include/ldb_private.h b/source4/lib/ldb/include/ldb_private.h
deleted file mode 100644
index cafc020e29..0000000000
--- a/source4/lib/ldb/include/ldb_private.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
- Copyright (C) Stefan Metzmacher 2004
- Copyright (C) Simo Sorce 2004-2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb private header
- *
- * Description: defines internal ldb structures used by the subsystem and modules
- *
- * Author: Andrew Tridgell
- * Author: Stefan Metzmacher
- */
-
-#ifndef _LDB_PRIVATE_H_
-#define _LDB_PRIVATE_H_ 1
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb.h"
-#include "ldb_module.h"
-
-struct ldb_context;
-
-struct ldb_module_ops;
-
-struct ldb_backend_ops;
-
-#define LDB_HANDLE_FLAG_DONE_CALLED 1
-/* call is from an untrusted source - eg. over ldap:// */
-#define LDB_HANDLE_FLAG_UNTRUSTED 2
-
-struct ldb_handle {
- int status;
- enum ldb_state state;
- struct ldb_context *ldb;
- unsigned flags;
- /* flags dedicated to be set by application using ldb */
- uint32_t custom_flags;
- unsigned nesting;
-
- /* used for debugging */
- struct ldb_request *parent;
- const char *location;
-};
-
-/* basic module structure */
-struct ldb_module {
- struct ldb_module *prev, *next;
- struct ldb_context *ldb;
- void *private_data;
- const struct ldb_module_ops *ops;
-};
-
-/*
- schema related information needed for matching rules
-*/
-struct ldb_schema {
- void *attribute_handler_override_private;
- ldb_attribute_handler_override_fn_t attribute_handler_override;
-
- /* attribute handling table */
- unsigned num_attributes;
- struct ldb_schema_attribute *attributes;
-
- unsigned num_dn_extended_syntax;
- struct ldb_dn_extended_syntax *dn_extended_syntax;
-};
-
-/*
- every ldb connection is started by establishing a ldb_context
-*/
-struct ldb_context {
- /* the operations provided by the backend */
- struct ldb_module *modules;
-
- /* debugging operations */
- struct ldb_debug_ops debug_ops;
-
- /* custom utf8 functions */
- struct ldb_utf8_fns utf8_fns;
-
- /* backend specific opaque parameters */
- struct ldb_opaque {
- struct ldb_opaque *next;
- const char *name;
- void *value;
- } *opaque;
-
- struct ldb_schema schema;
-
- char *err_string;
-
- int transaction_active;
-
- int default_timeout;
-
- unsigned int flags;
-
- unsigned int create_perms;
-
- struct tevent_context *ev_ctx;
-
- bool prepare_commit_done;
-
- char *partial_debug;
-
- struct poptOption *popt_options;
-};
-
-/* The following definitions come from lib/ldb/common/ldb.c */
-
-extern const struct ldb_module_ops ldb_objectclass_module_ops;
-extern const struct ldb_module_ops ldb_paged_results_module_ops;
-extern const struct ldb_module_ops ldb_rdn_name_module_ops;
-extern const struct ldb_module_ops ldb_schema_module_ops;
-extern const struct ldb_module_ops ldb_asq_module_ops;
-extern const struct ldb_module_ops ldb_server_sort_module_ops;
-extern const struct ldb_module_ops ldb_ldap_module_ops;
-extern const struct ldb_module_ops ldb_ildap_module_ops;
-extern const struct ldb_module_ops ldb_paged_searches_module_ops;
-extern const struct ldb_module_ops ldb_tdb_module_ops;
-extern const struct ldb_module_ops ldb_skel_module_ops;
-extern const struct ldb_module_ops ldb_subtree_rename_module_ops;
-extern const struct ldb_module_ops ldb_subtree_delete_module_ops;
-extern const struct ldb_module_ops ldb_sqlite3_module_ops;
-extern const struct ldb_module_ops ldb_wins_ldb_module_ops;
-extern const struct ldb_module_ops ldb_ranged_results_module_ops;
-
-extern const struct ldb_backend_ops ldb_tdb_backend_ops;
-extern const struct ldb_backend_ops ldb_sqlite3_backend_ops;
-extern const struct ldb_backend_ops ldb_ldap_backend_ops;
-extern const struct ldb_backend_ops ldb_ldapi_backend_ops;
-extern const struct ldb_backend_ops ldb_ldaps_backend_ops;
-
-int ldb_setup_wellknown_attributes(struct ldb_context *ldb);
-
-const char **ldb_subclass_list(struct ldb_context *ldb, const char *classname);
-void ldb_subclass_remove(struct ldb_context *ldb, const char *classname);
-int ldb_subclass_add(struct ldb_context *ldb, const char *classname, const char *subclass);
-
-/* The following definitions come from lib/ldb/common/ldb_utf8.c */
-char *ldb_casefold_default(void *context, TALLOC_CTX *mem_ctx, const char *s, size_t n);
-
-void ldb_dump_results(struct ldb_context *ldb, struct ldb_result *result, FILE *f);
-
-
-/* The following definitions come from lib/ldb/common/ldb_modules.c */
-
-const char **ldb_modules_list_from_string(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const char *string);
-int ldb_load_modules(struct ldb_context *ldb, const char *options[]);
-
-struct ldb_val ldb_binary_decode(TALLOC_CTX *mem_ctx, const char *str);
-
-
-/* The following definitions come from lib/ldb/common/ldb_options.c */
-
-const char *ldb_options_find(struct ldb_context *ldb, const char *options[],
- const char *option_name);
-
-#endif
diff --git a/source4/lib/ldb/ldb.pc.in b/source4/lib/ldb/ldb.pc.in
deleted file mode 100644
index aeba17a677..0000000000
--- a/source4/lib/ldb/ldb.pc.in
+++ /dev/null
@@ -1,16 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-modulesdir=@LDB_MODULESDIR@
-
-Name: ldb
-Description: An LDAP-like embedded database
-Version: @PACKAGE_VERSION@
-Requires.private: tdb
-Requires: talloc
-Libs: @LIB_RPATH@ -L${libdir} -lldb
-Libs.private: @LDAP_LIBS@
-Cflags: -I${includedir}
-Modulesdir: ${modulesdir}
-URL: http://ldb.samba.org/
diff --git a/source4/lib/ldb/ldb_ldap/ldb_ldap.c b/source4/lib/ldb/ldb_ldap/ldb_ldap.c
deleted file mode 100644
index 7e6ac903c8..0000000000
--- a/source4/lib/ldb/ldb_ldap/ldb_ldap.c
+++ /dev/null
@@ -1,982 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
- Copyright (C) Simo Sorce 2006
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb_ldap
- *
- * Component: ldb ldap backend
- *
- * Description: core files for LDAP backend
- *
- * Author: Andrew Tridgell
- *
- * Modifications:
- *
- * - description: make the module use asynchronous calls
- * date: Feb 2006
- * author: Simo Sorce
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_module.h"
-#include "ldb_private.h"
-
-#define LDAP_DEPRECATED 1
-#include <ldap.h>
-
-struct lldb_private {
- LDAP *ldap;
-};
-
-struct lldb_context {
- struct ldb_module *module;
- struct ldb_request *req;
-
- struct lldb_private *lldb;
-
- struct ldb_control **controls;
- int msgid;
-};
-
-static int lldb_ldap_to_ldb(int err) {
- /* Ldap errors and ldb errors are defined to the same values */
- return err;
-}
-
-/*
- convert a ldb_message structure to a list of LDAPMod structures
- ready for ldap_add() or ldap_modify()
-*/
-static LDAPMod **lldb_msg_to_mods(void *mem_ctx, const struct ldb_message *msg, int use_flags)
-{
- LDAPMod **mods;
- unsigned int i, j;
- int num_mods = 0;
-
- /* allocate maximum number of elements needed */
- mods = talloc_array(mem_ctx, LDAPMod *, msg->num_elements+1);
- if (!mods) {
- errno = ENOMEM;
- return NULL;
- }
- mods[0] = NULL;
-
- for (i=0;i<msg->num_elements;i++) {
- const struct ldb_message_element *el = &msg->elements[i];
-
- mods[num_mods] = talloc(mods, LDAPMod);
- if (!mods[num_mods]) {
- goto failed;
- }
- mods[num_mods+1] = NULL;
- mods[num_mods]->mod_op = LDAP_MOD_BVALUES;
- if (use_flags) {
- switch (el->flags & LDB_FLAG_MOD_MASK) {
- case LDB_FLAG_MOD_ADD:
- mods[num_mods]->mod_op |= LDAP_MOD_ADD;
- break;
- case LDB_FLAG_MOD_DELETE:
- mods[num_mods]->mod_op |= LDAP_MOD_DELETE;
- break;
- case LDB_FLAG_MOD_REPLACE:
- mods[num_mods]->mod_op |= LDAP_MOD_REPLACE;
- break;
- }
- }
- mods[num_mods]->mod_type = discard_const_p(char, el->name);
- mods[num_mods]->mod_vals.modv_bvals = talloc_array(mods[num_mods],
- struct berval *,
- 1+el->num_values);
- if (!mods[num_mods]->mod_vals.modv_bvals) {
- goto failed;
- }
-
- for (j=0;j<el->num_values;j++) {
- mods[num_mods]->mod_vals.modv_bvals[j] = talloc(mods[num_mods]->mod_vals.modv_bvals,
- struct berval);
- if (!mods[num_mods]->mod_vals.modv_bvals[j]) {
- goto failed;
- }
- mods[num_mods]->mod_vals.modv_bvals[j]->bv_val = (char *)el->values[j].data;
- mods[num_mods]->mod_vals.modv_bvals[j]->bv_len = el->values[j].length;
- }
- mods[num_mods]->mod_vals.modv_bvals[j] = NULL;
- num_mods++;
- }
-
- return mods;
-
-failed:
- talloc_free(mods);
- return NULL;
-}
-
-/*
- add a single set of ldap message values to a ldb_message
-*/
-static int lldb_add_msg_attr(struct ldb_context *ldb,
- struct ldb_message *msg,
- const char *attr, struct berval **bval)
-{
- int count, i;
- struct ldb_message_element *el;
-
- count = ldap_count_values_len(bval);
-
- if (count <= 0) {
- return -1;
- }
-
- el = talloc_realloc(msg, msg->elements, struct ldb_message_element,
- msg->num_elements + 1);
- if (!el) {
- errno = ENOMEM;
- return -1;
- }
-
- msg->elements = el;
-
- el = &msg->elements[msg->num_elements];
-
- el->name = talloc_strdup(msg->elements, attr);
- if (!el->name) {
- errno = ENOMEM;
- return -1;
- }
- el->flags = 0;
-
- el->num_values = 0;
- el->values = talloc_array(msg->elements, struct ldb_val, count);
- if (!el->values) {
- errno = ENOMEM;
- return -1;
- }
-
- for (i=0;i<count;i++) {
- /* we have to ensure this is null terminated so that
- ldb_msg_find_attr_as_string() can work */
- el->values[i].data = talloc_size(el->values, bval[i]->bv_len+1);
- if (!el->values[i].data) {
- errno = ENOMEM;
- return -1;
- }
- memcpy(el->values[i].data, bval[i]->bv_val, bval[i]->bv_len);
- el->values[i].data[bval[i]->bv_len] = 0;
- el->values[i].length = bval[i]->bv_len;
- el->num_values++;
- }
-
- msg->num_elements++;
-
- return 0;
-}
-
-/*
- search for matching records
-*/
-static int lldb_search(struct lldb_context *lldb_ac)
-{
- struct ldb_context *ldb;
- struct lldb_private *lldb = lldb_ac->lldb;
- struct ldb_module *module = lldb_ac->module;
- struct ldb_request *req = lldb_ac->req;
- struct timeval tv;
- int ldap_scope;
- char *search_base;
- char *expression;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- if (!req->callback || !req->context) {
- ldb_set_errstring(ldb, "Async interface called with NULL callback function or NULL context");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (req->op.search.tree == NULL) {
- ldb_set_errstring(ldb, "Invalid expression parse tree");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (req->controls != NULL) {
- ldb_debug(ldb, LDB_DEBUG_WARNING, "Controls are not yet supported by ldb_ldap backend!");
- }
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- search_base = ldb_dn_alloc_linearized(lldb_ac, req->op.search.base);
- if (req->op.search.base == NULL) {
- search_base = talloc_strdup(lldb_ac, "");
- }
- if (search_base == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- expression = ldb_filter_from_tree(lldb_ac, req->op.search.tree);
- if (expression == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- switch (req->op.search.scope) {
- case LDB_SCOPE_BASE:
- ldap_scope = LDAP_SCOPE_BASE;
- break;
- case LDB_SCOPE_ONELEVEL:
- ldap_scope = LDAP_SCOPE_ONELEVEL;
- break;
- default:
- ldap_scope = LDAP_SCOPE_SUBTREE;
- break;
- }
-
- tv.tv_sec = req->timeout;
- tv.tv_usec = 0;
-
- ret = ldap_search_ext(lldb->ldap, search_base, ldap_scope,
- expression,
- discard_const_p(char *, req->op.search.attrs),
- 0,
- NULL,
- NULL,
- &tv,
- LDAP_NO_LIMIT,
- &lldb_ac->msgid);
-
- if (ret != LDAP_SUCCESS) {
- ldb_set_errstring(ldb, ldap_err2string(ret));
- }
-
- return lldb_ldap_to_ldb(ret);
-}
-
-/*
- add a record
-*/
-static int lldb_add(struct lldb_context *lldb_ac)
-{
- struct ldb_context *ldb;
- struct lldb_private *lldb = lldb_ac->lldb;
- struct ldb_module *module = lldb_ac->module;
- struct ldb_request *req = lldb_ac->req;
- LDAPMod **mods;
- char *dn;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- mods = lldb_msg_to_mods(lldb_ac, req->op.add.message, 0);
- if (mods == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- dn = ldb_dn_alloc_linearized(lldb_ac, req->op.add.message->dn);
- if (dn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldap_add_ext(lldb->ldap, dn, mods,
- NULL,
- NULL,
- &lldb_ac->msgid);
-
- if (ret != LDAP_SUCCESS) {
- ldb_set_errstring(ldb, ldap_err2string(ret));
- }
-
- return lldb_ldap_to_ldb(ret);
-}
-
-/*
- modify a record
-*/
-static int lldb_modify(struct lldb_context *lldb_ac)
-{
- struct ldb_context *ldb;
- struct lldb_private *lldb = lldb_ac->lldb;
- struct ldb_module *module = lldb_ac->module;
- struct ldb_request *req = lldb_ac->req;
- LDAPMod **mods;
- char *dn;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- mods = lldb_msg_to_mods(lldb_ac, req->op.mod.message, 1);
- if (mods == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- dn = ldb_dn_alloc_linearized(lldb_ac, req->op.mod.message->dn);
- if (dn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldap_modify_ext(lldb->ldap, dn, mods,
- NULL,
- NULL,
- &lldb_ac->msgid);
-
- if (ret != LDAP_SUCCESS) {
- ldb_set_errstring(ldb, ldap_err2string(ret));
- }
-
- return lldb_ldap_to_ldb(ret);
-}
-
-/*
- delete a record
-*/
-static int lldb_delete(struct lldb_context *lldb_ac)
-{
- struct ldb_context *ldb;
- struct lldb_private *lldb = lldb_ac->lldb;
- struct ldb_module *module = lldb_ac->module;
- struct ldb_request *req = lldb_ac->req;
- char *dnstr;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- dnstr = ldb_dn_alloc_linearized(lldb_ac, req->op.del.dn);
-
- ret = ldap_delete_ext(lldb->ldap, dnstr,
- NULL,
- NULL,
- &lldb_ac->msgid);
-
- if (ret != LDAP_SUCCESS) {
- ldb_set_errstring(ldb, ldap_err2string(ret));
- }
-
- return lldb_ldap_to_ldb(ret);
-}
-
-/*
- rename a record
-*/
-static int lldb_rename(struct lldb_context *lldb_ac)
-{
- struct ldb_context *ldb;
- struct lldb_private *lldb = lldb_ac->lldb;
- struct ldb_module *module = lldb_ac->module;
- struct ldb_request *req = lldb_ac->req;
- const char *rdn_name;
- const struct ldb_val *rdn_val;
- char *old_dn;
- char *newrdn;
- char *parentdn;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- old_dn = ldb_dn_alloc_linearized(lldb_ac, req->op.rename.olddn);
- if (old_dn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- rdn_name = ldb_dn_get_rdn_name(req->op.rename.newdn);
- rdn_val = ldb_dn_get_rdn_val(req->op.rename.newdn);
-
- if ((rdn_name != NULL) && (rdn_val != NULL)) {
- newrdn = talloc_asprintf(lldb_ac, "%s=%s", rdn_name,
- rdn_val->length > 0 ? ldb_dn_escape_value(lldb, *rdn_val) : "");
- } else {
- newrdn = talloc_strdup(lldb_ac, "");
- }
- if (!newrdn) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- parentdn = ldb_dn_alloc_linearized(lldb_ac, ldb_dn_get_parent(lldb_ac, req->op.rename.newdn));
- if (!parentdn) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldap_rename(lldb->ldap, old_dn, newrdn, parentdn,
- 1, NULL, NULL,
- &lldb_ac->msgid);
-
- if (ret != LDAP_SUCCESS) {
- ldb_set_errstring(ldb, ldap_err2string(ret));
- }
-
- return lldb_ldap_to_ldb(ret);
-}
-
-static int lldb_start_trans(struct ldb_module *module)
-{
- /* TODO implement a local transaction mechanism here */
-
- return LDB_SUCCESS;
-}
-
-static int lldb_end_trans(struct ldb_module *module)
-{
- /* TODO implement a local transaction mechanism here */
-
- return LDB_SUCCESS;
-}
-
-static int lldb_del_trans(struct ldb_module *module)
-{
- /* TODO implement a local transaction mechanism here */
-
- return LDB_SUCCESS;
-}
-
-static void lldb_request_done(struct lldb_context *ac,
- struct ldb_control **ctrls, int error)
-{
- struct ldb_request *req;
- struct ldb_reply *ares;
-
- req = ac->req;
-
- ares = talloc_zero(req, struct ldb_reply);
- if (!ares) {
- ldb_oom(ldb_module_get_ctx(ac->module));
- req->callback(req, NULL);
- return;
- }
- ares->type = LDB_REPLY_DONE;
- ares->controls = talloc_steal(ares, ctrls);
- ares->error = error;
-
- req->callback(req, ares);
-}
-
-/* return false if the request is still in progress
- * return true if the request is completed
- */
-static bool lldb_parse_result(struct lldb_context *ac, LDAPMessage *result)
-{
- struct ldb_context *ldb;
- struct lldb_private *lldb = ac->lldb;
- LDAPControl **serverctrlsp = NULL;
- char **referralsp = NULL;
- char *matcheddnp = NULL;
- char *errmsgp = NULL;
- LDAPMessage *msg;
- int type;
- struct ldb_message *ldbmsg;
- char *referral;
- bool callback_failed;
- bool request_done;
- bool lret;
- unsigned int i;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- type = ldap_msgtype(result);
- callback_failed = false;
- request_done = false;
-
- switch (type) {
- case LDAP_RES_SEARCH_ENTRY:
-
- msg = ldap_first_entry(lldb->ldap, result);
- if (msg != NULL) {
- BerElement *berptr = NULL;
- char *attr, *dn;
-
- ldbmsg = ldb_msg_new(ac);
- if (!ldbmsg) {
- ldb_oom(ldb);
- ret = LDB_ERR_OPERATIONS_ERROR;
- break;
- }
-
- dn = ldap_get_dn(lldb->ldap, msg);
- if (!dn) {
- ldb_oom(ldb);
- talloc_free(ldbmsg);
- ret = LDB_ERR_OPERATIONS_ERROR;
- break;
- }
- ldbmsg->dn = ldb_dn_new(ldbmsg, ldb, dn);
- if ( ! ldb_dn_validate(ldbmsg->dn)) {
- ldb_asprintf_errstring(ldb, "Invalid DN '%s' in reply", dn);
- talloc_free(ldbmsg);
- ret = LDB_ERR_OPERATIONS_ERROR;
- ldap_memfree(dn);
- break;
- }
- ldap_memfree(dn);
-
- ldbmsg->num_elements = 0;
- ldbmsg->elements = NULL;
-
- /* loop over all attributes */
- for (attr=ldap_first_attribute(lldb->ldap, msg, &berptr);
- attr;
- attr=ldap_next_attribute(lldb->ldap, msg, berptr)) {
- struct berval **bval;
- bval = ldap_get_values_len(lldb->ldap, msg, attr);
-
- if (bval) {
- lldb_add_msg_attr(ldb, ldbmsg, attr, bval);
- ldap_value_free_len(bval);
- }
- }
- if (berptr) ber_free(berptr, 0);
-
- ret = ldb_module_send_entry(ac->req, ldbmsg, NULL /* controls not yet supported */);
- if (ret != LDB_SUCCESS) {
- ldb_asprintf_errstring(ldb, "entry send failed: %s",
- ldb_errstring(ldb));
- callback_failed = true;
- }
- } else {
- ret = LDB_ERR_OPERATIONS_ERROR;
- }
- break;
-
- case LDAP_RES_SEARCH_REFERENCE:
-
- ret = ldap_parse_reference(lldb->ldap, result,
- &referralsp, &serverctrlsp, 0);
- if (ret != LDAP_SUCCESS) {
- ldb_asprintf_errstring(ldb, "ldap reference parse error: %s : %s",
- ldap_err2string(ret), errmsgp);
- ret = LDB_ERR_OPERATIONS_ERROR;
- break;
- }
- if (referralsp == NULL) {
- ldb_asprintf_errstring(ldb, "empty ldap referrals list");
- ret = LDB_ERR_PROTOCOL_ERROR;
- break;
- }
-
- for (i = 0; referralsp[i]; i++) {
- referral = talloc_strdup(ac, referralsp[i]);
-
- ret = ldb_module_send_referral(ac->req, referral);
- if (ret != LDB_SUCCESS) {
- ldb_asprintf_errstring(ldb, "referral send failed: %s",
- ldb_errstring(ldb));
- callback_failed = true;
- break;
- }
- }
- break;
-
- case LDAP_RES_SEARCH_RESULT:
- case LDAP_RES_MODIFY:
- case LDAP_RES_ADD:
- case LDAP_RES_DELETE:
- case LDAP_RES_MODDN:
-
- if (ldap_parse_result(lldb->ldap, result, &ret,
- &matcheddnp, &errmsgp,
- &referralsp, &serverctrlsp, 0) != LDAP_SUCCESS) {
- ret = LDB_ERR_OPERATIONS_ERROR;
- }
- if (ret != LDB_SUCCESS) {
- ldb_asprintf_errstring(ldb, "ldap parse error for type %d: %s : %s",
- type, ldap_err2string(ret), errmsgp);
- break;
- }
-
- if (serverctrlsp != NULL) {
- /* FIXME: transform the LDAPControl list into an ldb_control one */
- ac->controls = NULL;
- }
-
- request_done = true;
- break;
-
- default:
- ldb_asprintf_errstring(ldb, "unknown ldap return type: %d", type);
- ret = LDB_ERR_PROTOCOL_ERROR;
- break;
- }
-
- if (ret != LDB_SUCCESS) {
-
- /* if the callback failed the caller will have freed the
- * request. Just return and don't try to use it */
- if (callback_failed) {
-
- /* tell lldb_wait to remove the request from the
- * queue */
- lret = true;
- goto free_and_return;
- }
-
- request_done = true;
- }
-
- if (request_done) {
- lldb_request_done(ac, ac->controls, ret);
- lret = true;
- goto free_and_return;
- }
-
- lret = false;
-
-free_and_return:
-
- if (matcheddnp) ldap_memfree(matcheddnp);
- if (errmsgp && *errmsgp) {
- ldb_set_errstring(ldb, errmsgp);
- }
- if (errmsgp) {
- ldap_memfree(errmsgp);
- }
- if (referralsp) ldap_value_free(referralsp);
- if (serverctrlsp) ldap_controls_free(serverctrlsp);
-
- ldap_msgfree(result);
-
- return lret;
-}
-
-static void lldb_timeout(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval t,
- void *private_data)
-{
- struct lldb_context *ac;
- ac = talloc_get_type(private_data, struct lldb_context);
-
- lldb_request_done(ac, NULL, LDB_ERR_TIME_LIMIT_EXCEEDED);
-}
-
-static void lldb_callback(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval t,
- void *private_data)
-{
- struct lldb_context *ac;
- struct tevent_timer *lte;
- struct timeval tv;
- LDAPMessage *result;
- int lret;
-
- ac = talloc_get_type(private_data, struct lldb_context);
-
- if (!ac->msgid) {
- lldb_request_done(ac, NULL, LDB_ERR_OPERATIONS_ERROR);
- return;
- }
-
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- lret = ldap_result(ac->lldb->ldap, ac->msgid, 0, &tv, &result);
- if (lret == 0) {
- goto respin;
- }
- if (lret == -1) {
- lldb_request_done(ac, NULL, LDB_ERR_OPERATIONS_ERROR);
- return;
- }
-
- if ( ! lldb_parse_result(ac, result)) {
- goto respin;
- }
-
- return;
-
-respin:
- tv.tv_sec = 0;
- tv.tv_usec = 100;
- lte = tevent_add_timer(ev, ac, tv, lldb_callback, ac);
- if (NULL == lte) {
- lldb_request_done(ac, NULL, LDB_ERR_OPERATIONS_ERROR);
- }
-}
-
-static bool lldb_dn_is_special(struct ldb_request *req)
-{
- struct ldb_dn *dn = NULL;
-
- switch (req->operation) {
- case LDB_ADD:
- dn = req->op.add.message->dn;
- break;
- case LDB_MODIFY:
- dn = req->op.mod.message->dn;
- break;
- case LDB_DELETE:
- dn = req->op.del.dn;
- break;
- case LDB_RENAME:
- dn = req->op.rename.olddn;
- break;
- default:
- break;
- }
-
- if (dn && ldb_dn_is_special(dn)) {
- return true;
- }
- return false;
-}
-
-static void lldb_auto_done_callback(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval t,
- void *private_data)
-{
- struct lldb_context *ac;
-
- ac = talloc_get_type(private_data, struct lldb_context);
- lldb_request_done(ac, NULL, LDB_SUCCESS);
-}
-
-static int lldb_handle_request(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct lldb_private *lldb;
- struct lldb_context *ac;
- struct tevent_context *ev;
- struct tevent_timer *te;
- struct timeval tv;
- int ret;
-
- lldb = talloc_get_type(ldb_module_get_private(module), struct lldb_private);
- ldb = ldb_module_get_ctx(module);
-
- if (req->starttime == 0 || req->timeout == 0) {
- ldb_set_errstring(ldb, "Invalid timeout settings");
- return LDB_ERR_TIME_LIMIT_EXCEEDED;
- }
-
- ev = ldb_get_event_context(ldb);
- if (NULL == ev) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac = talloc_zero(ldb, struct lldb_context);
- if (ac == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->module = module;
- ac->req = req;
- ac->lldb = lldb;
- ac->msgid = 0;
-
- if (lldb_dn_is_special(req)) {
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- te = tevent_add_timer(ev, ac, tv,
- lldb_auto_done_callback, ac);
- if (NULL == te) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
- }
-
- switch (ac->req->operation) {
- case LDB_SEARCH:
- ret = lldb_search(ac);
- break;
- case LDB_ADD:
- ret = lldb_add(ac);
- break;
- case LDB_MODIFY:
- ret = lldb_modify(ac);
- break;
- case LDB_DELETE:
- ret = lldb_delete(ac);
- break;
- case LDB_RENAME:
- ret = lldb_rename(ac);
- break;
- default:
- /* no other op supported */
- ret = LDB_ERR_PROTOCOL_ERROR;
- break;
- }
-
- if (ret != LDB_SUCCESS) {
- lldb_request_done(ac, NULL, ret);
- return ret;
- }
-
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- te = tevent_add_timer(ev, ac, tv, lldb_callback, ac);
- if (NULL == te) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
-
- tv.tv_sec = req->starttime + req->timeout;
- tv.tv_usec = 0;
- te = tevent_add_timer(ev, ac, tv, lldb_timeout, ac);
- if (NULL == te) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
-}
-
-static const struct ldb_module_ops lldb_ops = {
- .name = "ldap",
- .search = lldb_handle_request,
- .add = lldb_handle_request,
- .modify = lldb_handle_request,
- .del = lldb_handle_request,
- .rename = lldb_handle_request,
- .request = lldb_handle_request,
- .start_transaction = lldb_start_trans,
- .end_transaction = lldb_end_trans,
- .del_transaction = lldb_del_trans,
-};
-
-
-static int lldb_destructor(struct lldb_private *lldb)
-{
- ldap_unbind(lldb->ldap);
- return 0;
-}
-
-
-/*
- optionally perform a bind
- */
-static int lldb_bind(struct ldb_module *module,
- const char *options[])
-{
- const char *bind_mechanism;
- struct lldb_private *lldb;
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- int ret;
-
- bind_mechanism = ldb_options_find(ldb, options, "bindMech");
- if (bind_mechanism == NULL) {
- /* no bind wanted */
- return LDB_SUCCESS;
- }
-
- lldb = talloc_get_type(ldb_module_get_private(module), struct lldb_private);
-
- if (strcmp(bind_mechanism, "simple") == 0) {
- const char *bind_id, *bind_secret;
-
- bind_id = ldb_options_find(ldb, options, "bindID");
- bind_secret = ldb_options_find(ldb, options, "bindSecret");
- if (bind_id == NULL || bind_secret == NULL) {
- ldb_asprintf_errstring(ldb, "simple bind requires bindID and bindSecret");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldap_simple_bind_s(lldb->ldap, bind_id, bind_secret);
- if (ret != LDAP_SUCCESS) {
- ldb_asprintf_errstring(ldb, "bind failed: %s", ldap_err2string(ret));
- return ret;
- }
- return LDB_SUCCESS;
- }
-
- ldb_asprintf_errstring(ldb, "bind failed: unknown mechanism %s", bind_mechanism);
- return LDB_ERR_INAPPROPRIATE_AUTHENTICATION;
-}
-
-/*
- connect to the database
-*/
-static int lldb_connect(struct ldb_context *ldb,
- const char *url,
- unsigned int flags,
- const char *options[],
- struct ldb_module **_module)
-{
- struct ldb_module *module;
- struct lldb_private *lldb;
- int version = 3;
- int ret;
-
- module = ldb_module_new(ldb, ldb, "ldb_ldap backend", &lldb_ops);
- if (!module) return LDB_ERR_OPERATIONS_ERROR;
-
- lldb = talloc_zero(module, struct lldb_private);
- if (!lldb) {
- ldb_oom(ldb);
- goto failed;
- }
- ldb_module_set_private(module, lldb);
-
- ret = ldap_initialize(&lldb->ldap, url);
- if (ret != LDAP_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "ldap_initialize failed for URL '%s' - %s",
- url, ldap_err2string(ret));
- goto failed;
- }
-
- talloc_set_destructor(lldb, lldb_destructor);
-
- ret = ldap_set_option(lldb->ldap, LDAP_OPT_PROTOCOL_VERSION, &version);
- if (ret != LDAP_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_FATAL, "ldap_set_option failed - %s",
- ldap_err2string(ret));
- goto failed;
- }
-
- *_module = module;
-
- ret = lldb_bind(module, options);
- if (ret != LDB_SUCCESS) {
- goto failed;
- }
-
-
- return LDB_SUCCESS;
-
-failed:
- talloc_free(module);
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-/*
- initialise the module
- */
-int ldb_ldap_init(const char *version)
-{
- int ret, i;
- const char *names[] = { "ldap", "ldaps", "ldapi", NULL };
- LDB_MODULE_CHECK_VERSION(version);
- for (i=0; names[i]; i++) {
- ret = ldb_register_backend(names[i], lldb_connect, false);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
- return LDB_SUCCESS;
-}
diff --git a/source4/lib/ldb/ldb_map/ldb_map.c b/source4/lib/ldb/ldb_map/ldb_map.c
deleted file mode 100644
index d35e5c604f..0000000000
--- a/source4/lib/ldb/ldb_map/ldb_map.c
+++ /dev/null
@@ -1,1139 +0,0 @@
-/*
- ldb database mapping module
-
- Copyright (C) Jelmer Vernooij 2005
- Copyright (C) Martin Kuehl <mkhl@samba.org> 2006
- Copyright (C) Simo Sorce 2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb ldb_map module
- *
- * Description: Map portions of data into a different format on a
- * remote partition.
- *
- * Author: Jelmer Vernooij, Martin Kuehl
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_map.h"
-#include "ldb_map_private.h"
-
-#ifndef _PUBLIC_
-#define _PUBLIC_
-#endif
-
-/* Description of the provided ldb requests:
- - special attribute 'isMapped'
-
- - search:
- - if parse tree can be split
- - search remote records w/ remote attrs and parse tree
- - otherwise
- - enumerate all remote records
- - for each remote result
- - map remote result to local message
- - search local result
- - is present
- - merge local into remote result
- - run callback on merged result
- - otherwise
- - run callback on remote result
-
- - add:
- - split message into local and remote part
- - if local message is not empty
- - add isMapped to local message
- - add local message
- - add remote message
-
- - modify:
- - split message into local and remote part
- - if local message is not empty
- - add isMapped to local message
- - search for local record
- - if present
- - modify local record
- - otherwise
- - add local message
- - modify remote record
-
- - delete:
- - search for local record
- - if present
- - delete local record
- - delete remote record
-
- - rename:
- - search for local record
- - if present
- - rename local record
- - modify local isMapped
- - rename remote record
-*/
-
-
-
-/* Private data structures
- * ======================= */
-
-/* Global private data */
-/* Extract mappings from private data. */
-const struct ldb_map_context *map_get_context(struct ldb_module *module)
-{
- const struct map_private *data = talloc_get_type(ldb_module_get_private(module), struct map_private);
- return data->context;
-}
-
-/* Create a generic request context. */
-struct map_context *map_init_context(struct ldb_module *module,
- struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct map_context *ac;
-
- ldb = ldb_module_get_ctx(module);
-
- ac = talloc_zero(req, struct map_context);
- if (ac == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return NULL;
- }
-
- ac->module = module;
- ac->req = req;
-
- return ac;
-}
-
-/* Dealing with DNs for different partitions
- * ========================================= */
-
-/* Check whether any data should be stored in the local partition. */
-bool map_check_local_db(struct ldb_module *module)
-{
- const struct ldb_map_context *data = map_get_context(module);
-
- if (!data->remote_base_dn || !data->local_base_dn) {
- return false;
- }
-
- return true;
-}
-
-/* Copy a DN with the base DN of the local partition. */
-static struct ldb_dn *ldb_dn_rebase_local(void *mem_ctx, const struct ldb_map_context *data, struct ldb_dn *dn)
-{
- struct ldb_dn *new_dn;
-
- new_dn = ldb_dn_copy(mem_ctx, dn);
- if ( ! ldb_dn_validate(new_dn)) {
- talloc_free(new_dn);
- return NULL;
- }
-
- /* may be we don't need to rebase at all */
- if ( ! data->remote_base_dn || ! data->local_base_dn) {
- return new_dn;
- }
-
- if ( ! ldb_dn_remove_base_components(new_dn, ldb_dn_get_comp_num(data->remote_base_dn))) {
- talloc_free(new_dn);
- return NULL;
- }
-
- if ( ! ldb_dn_add_base(new_dn, data->local_base_dn)) {
- talloc_free(new_dn);
- return NULL;
- }
-
- return new_dn;
-}
-
-/* Copy a DN with the base DN of the remote partition. */
-static struct ldb_dn *ldb_dn_rebase_remote(void *mem_ctx, const struct ldb_map_context *data, struct ldb_dn *dn)
-{
- struct ldb_dn *new_dn;
-
- new_dn = ldb_dn_copy(mem_ctx, dn);
- if ( ! ldb_dn_validate(new_dn)) {
- talloc_free(new_dn);
- return NULL;
- }
-
- /* may be we don't need to rebase at all */
- if ( ! data->remote_base_dn || ! data->local_base_dn) {
- return new_dn;
- }
-
- if ( ! ldb_dn_remove_base_components(new_dn, ldb_dn_get_comp_num(data->local_base_dn))) {
- talloc_free(new_dn);
- return NULL;
- }
-
- if ( ! ldb_dn_add_base(new_dn, data->remote_base_dn)) {
- talloc_free(new_dn);
- return NULL;
- }
-
- return new_dn;
-}
-
-/* Run a request and make sure it targets the remote partition. */
-/* TODO: free old DNs and messages? */
-int ldb_next_remote_request(struct ldb_module *module, struct ldb_request *request)
-{
- const struct ldb_map_context *data = map_get_context(module);
- struct ldb_context *ldb;
- struct ldb_message *msg;
-
- ldb = ldb_module_get_ctx(module);
-
- switch (request->operation) {
- case LDB_SEARCH:
- if (request->op.search.base) {
- request->op.search.base = ldb_dn_rebase_remote(request, data, request->op.search.base);
- } else {
- request->op.search.base = data->remote_base_dn;
- /* TODO: adjust scope? */
- }
- break;
-
- case LDB_ADD:
- msg = ldb_msg_copy_shallow(request, request->op.add.message);
- msg->dn = ldb_dn_rebase_remote(msg, data, msg->dn);
- request->op.add.message = msg;
- break;
-
- case LDB_MODIFY:
- msg = ldb_msg_copy_shallow(request, request->op.mod.message);
- msg->dn = ldb_dn_rebase_remote(msg, data, msg->dn);
- request->op.mod.message = msg;
- break;
-
- case LDB_DELETE:
- request->op.del.dn = ldb_dn_rebase_remote(request, data, request->op.del.dn);
- break;
-
- case LDB_RENAME:
- request->op.rename.olddn = ldb_dn_rebase_remote(request, data, request->op.rename.olddn);
- request->op.rename.newdn = ldb_dn_rebase_remote(request, data, request->op.rename.newdn);
- break;
-
- default:
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "Invalid remote request!");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_request(module, request);
-}
-
-
-/* Finding mappings for attributes and objectClasses
- * ================================================= */
-
-/* Find an objectClass mapping by the local name. */
-static const struct ldb_map_objectclass *map_objectclass_find_local(const struct ldb_map_context *data, const char *name)
-{
- unsigned int i;
-
- for (i = 0; data->objectclass_maps && data->objectclass_maps[i].local_name; i++) {
- if (ldb_attr_cmp(data->objectclass_maps[i].local_name, name) == 0) {
- return &data->objectclass_maps[i];
- }
- }
-
- return NULL;
-}
-
-/* Find an objectClass mapping by the remote name. */
-static const struct ldb_map_objectclass *map_objectclass_find_remote(const struct ldb_map_context *data, const char *name)
-{
- unsigned int i;
-
- for (i = 0; data->objectclass_maps && data->objectclass_maps[i].remote_name; i++) {
- if (ldb_attr_cmp(data->objectclass_maps[i].remote_name, name) == 0) {
- return &data->objectclass_maps[i];
- }
- }
-
- return NULL;
-}
-
-/* Find an attribute mapping by the local name. */
-const struct ldb_map_attribute *map_attr_find_local(const struct ldb_map_context *data, const char *name)
-{
- unsigned int i;
-
- for (i = 0; data->attribute_maps[i].local_name; i++) {
- if (ldb_attr_cmp(data->attribute_maps[i].local_name, name) == 0) {
- return &data->attribute_maps[i];
- }
- }
- for (i = 0; data->attribute_maps[i].local_name; i++) {
- if (ldb_attr_cmp(data->attribute_maps[i].local_name, "*") == 0) {
- return &data->attribute_maps[i];
- }
- }
-
- return NULL;
-}
-
-/* Find an attribute mapping by the remote name. */
-const struct ldb_map_attribute *map_attr_find_remote(const struct ldb_map_context *data, const char *name)
-{
- const struct ldb_map_attribute *map;
- const struct ldb_map_attribute *wildcard = NULL;
- unsigned int i, j;
-
- for (i = 0; data->attribute_maps[i].local_name; i++) {
- map = &data->attribute_maps[i];
- if (ldb_attr_cmp(map->local_name, "*") == 0) {
- wildcard = &data->attribute_maps[i];
- }
-
- switch (map->type) {
- case LDB_MAP_IGNORE:
- break;
-
- case LDB_MAP_KEEP:
- if (ldb_attr_cmp(map->local_name, name) == 0) {
- return map;
- }
- break;
-
- case LDB_MAP_RENAME:
- case LDB_MAP_CONVERT:
- if (ldb_attr_cmp(map->u.rename.remote_name, name) == 0) {
- return map;
- }
- break;
-
- case LDB_MAP_GENERATE:
- for (j = 0; map->u.generate.remote_names && map->u.generate.remote_names[j]; j++) {
- if (ldb_attr_cmp(map->u.generate.remote_names[j], name) == 0) {
- return map;
- }
- }
- break;
- }
- }
-
- /* We didn't find it, so return the wildcard record if one was configured */
- return wildcard;
-}
-
-
-/* Mapping attributes
- * ================== */
-
-/* Check whether an attribute will be mapped into the remote partition. */
-bool map_attr_check_remote(const struct ldb_map_context *data, const char *attr)
-{
- const struct ldb_map_attribute *map = map_attr_find_local(data, attr);
-
- if (map == NULL) {
- return false;
- }
- if (map->type == LDB_MAP_IGNORE) {
- return false;
- }
-
- return true;
-}
-
-/* Map an attribute name into the remote partition. */
-const char *map_attr_map_local(void *mem_ctx, const struct ldb_map_attribute *map, const char *attr)
-{
- if (map == NULL) {
- return talloc_strdup(mem_ctx, attr);
- }
-
- switch (map->type) {
- case LDB_MAP_KEEP:
- return talloc_strdup(mem_ctx, attr);
-
- case LDB_MAP_RENAME:
- case LDB_MAP_CONVERT:
- return talloc_strdup(mem_ctx, map->u.rename.remote_name);
-
- default:
- return NULL;
- }
-}
-
-/* Map an attribute name back into the local partition. */
-const char *map_attr_map_remote(void *mem_ctx, const struct ldb_map_attribute *map, const char *attr)
-{
- if (map == NULL) {
- return talloc_strdup(mem_ctx, attr);
- }
-
- if (map->type == LDB_MAP_KEEP) {
- return talloc_strdup(mem_ctx, attr);
- }
-
- return talloc_strdup(mem_ctx, map->local_name);
-}
-
-
-/* Merge two lists of attributes into a single one. */
-int map_attrs_merge(struct ldb_module *module, void *mem_ctx,
- const char ***attrs, const char * const *more_attrs)
-{
- unsigned int i, j, k;
-
- for (i = 0; *attrs && (*attrs)[i]; i++) /* noop */ ;
- for (j = 0; more_attrs && more_attrs[j]; j++) /* noop */ ;
-
- *attrs = talloc_realloc(mem_ctx, *attrs, const char *, i+j+1);
- if (*attrs == NULL) {
- map_oom(module);
- return -1;
- }
-
- for (k = 0; k < j; k++) {
- (*attrs)[i + k] = more_attrs[k];
- }
-
- (*attrs)[i+k] = NULL;
-
- return 0;
-}
-
-/* Mapping ldb values
- * ================== */
-
-/* Map an ldb value into the remote partition. */
-struct ldb_val ldb_val_map_local(struct ldb_module *module, void *mem_ctx,
- const struct ldb_map_attribute *map, const struct ldb_val *val)
-{
- if (map && (map->type == LDB_MAP_CONVERT) && (map->u.convert.convert_local)) {
- return map->u.convert.convert_local(module, mem_ctx, val);
- }
-
- return ldb_val_dup(mem_ctx, val);
-}
-
-/* Map an ldb value back into the local partition. */
-struct ldb_val ldb_val_map_remote(struct ldb_module *module, void *mem_ctx,
- const struct ldb_map_attribute *map, const struct ldb_val *val)
-{
- if (map && (map->type == LDB_MAP_CONVERT) && (map->u.convert.convert_remote)) {
- return map->u.convert.convert_remote(module, mem_ctx, val);
- }
-
- return ldb_val_dup(mem_ctx, val);
-}
-
-
-/* Mapping DNs
- * =========== */
-
-/* Check whether a DN is below the local baseDN. */
-bool ldb_dn_check_local(struct ldb_module *module, struct ldb_dn *dn)
-{
- const struct ldb_map_context *data = map_get_context(module);
-
- if (!data->local_base_dn) {
- return true;
- }
-
- return ldb_dn_compare_base(data->local_base_dn, dn) == 0;
-}
-
-/* Map a DN into the remote partition. */
-struct ldb_dn *ldb_dn_map_local(struct ldb_module *module, void *mem_ctx, struct ldb_dn *dn)
-{
- const struct ldb_map_context *data = map_get_context(module);
- struct ldb_context *ldb;
- struct ldb_dn *newdn;
- const struct ldb_map_attribute *map;
- enum ldb_map_attr_type map_type;
- const char *name;
- struct ldb_val value;
- int i, ret;
-
- if (dn == NULL) {
- return NULL;
- }
-
- ldb = ldb_module_get_ctx(module);
-
- newdn = ldb_dn_copy(mem_ctx, dn);
- if (newdn == NULL) {
- map_oom(module);
- return NULL;
- }
-
- /* For each RDN, map the component name and possibly the value */
- for (i = 0; i < ldb_dn_get_comp_num(newdn); i++) {
- map = map_attr_find_local(data, ldb_dn_get_component_name(dn, i));
-
- /* Unknown attribute - leave this RDN as is and hope the best... */
- if (map == NULL) {
- map_type = LDB_MAP_KEEP;
- } else {
- map_type = map->type;
- }
-
- switch (map_type) {
- case LDB_MAP_IGNORE:
- case LDB_MAP_GENERATE:
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "LDB_MAP_IGNORE/LDB_MAP_GENERATE attribute '%s' "
- "used in DN!", ldb_dn_get_component_name(dn, i));
- goto failed;
-
- case LDB_MAP_CONVERT:
- if (map->u.convert.convert_local == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "'convert_local' not set for attribute '%s' "
- "used in DN!", ldb_dn_get_component_name(dn, i));
- goto failed;
- }
- /* fall through */
- case LDB_MAP_KEEP:
- case LDB_MAP_RENAME:
- name = map_attr_map_local(newdn, map, ldb_dn_get_component_name(dn, i));
- if (name == NULL) goto failed;
-
- value = ldb_val_map_local(module, newdn, map, ldb_dn_get_component_val(dn, i));
- if (value.data == NULL) goto failed;
-
- ret = ldb_dn_set_component(newdn, i, name, value);
- if (ret != LDB_SUCCESS) {
- goto failed;
- }
-
- break;
- }
- }
-
- return newdn;
-
-failed:
- talloc_free(newdn);
- return NULL;
-}
-
-/* Map a DN into the local partition. */
-struct ldb_dn *ldb_dn_map_remote(struct ldb_module *module, void *mem_ctx, struct ldb_dn *dn)
-{
- const struct ldb_map_context *data = map_get_context(module);
- struct ldb_context *ldb;
- struct ldb_dn *newdn;
- const struct ldb_map_attribute *map;
- enum ldb_map_attr_type map_type;
- const char *name;
- struct ldb_val value;
- int i, ret;
-
- if (dn == NULL) {
- return NULL;
- }
-
- ldb = ldb_module_get_ctx(module);
-
- newdn = ldb_dn_copy(mem_ctx, dn);
- if (newdn == NULL) {
- map_oom(module);
- return NULL;
- }
-
- /* For each RDN, map the component name and possibly the value */
- for (i = 0; i < ldb_dn_get_comp_num(newdn); i++) {
- map = map_attr_find_remote(data, ldb_dn_get_component_name(dn, i));
-
- /* Unknown attribute - leave this RDN as is and hope the best... */
- if (map == NULL) {
- map_type = LDB_MAP_KEEP;
- } else {
- map_type = map->type;
- }
-
- switch (map_type) {
- case LDB_MAP_IGNORE:
- case LDB_MAP_GENERATE:
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "LDB_MAP_IGNORE/LDB_MAP_GENERATE attribute '%s' "
- "used in DN!", ldb_dn_get_component_name(dn, i));
- goto failed;
-
- case LDB_MAP_CONVERT:
- if (map->u.convert.convert_remote == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "'convert_remote' not set for attribute '%s' "
- "used in DN!", ldb_dn_get_component_name(dn, i));
- goto failed;
- }
- /* fall through */
- case LDB_MAP_KEEP:
- case LDB_MAP_RENAME:
- name = map_attr_map_remote(newdn, map, ldb_dn_get_component_name(dn, i));
- if (name == NULL) goto failed;
-
- value = ldb_val_map_remote(module, newdn, map, ldb_dn_get_component_val(dn, i));
- if (value.data == NULL) goto failed;
-
- ret = ldb_dn_set_component(newdn, i, name, value);
- if (ret != LDB_SUCCESS) {
- goto failed;
- }
-
- break;
- }
- }
-
- return newdn;
-
-failed:
- talloc_free(newdn);
- return NULL;
-}
-
-/* Map a DN and its base into the local partition. */
-/* TODO: This should not be required with GUIDs. */
-struct ldb_dn *ldb_dn_map_rebase_remote(struct ldb_module *module, void *mem_ctx, struct ldb_dn *dn)
-{
- const struct ldb_map_context *data = map_get_context(module);
- struct ldb_dn *dn1, *dn2;
-
- dn1 = ldb_dn_rebase_local(mem_ctx, data, dn);
- dn2 = ldb_dn_map_remote(module, mem_ctx, dn1);
-
- talloc_free(dn1);
- return dn2;
-}
-
-
-/* Converting DNs and objectClasses (as ldb values)
- * ================================================ */
-
-/* Map a DN contained in an ldb value into the remote partition. */
-static struct ldb_val ldb_dn_convert_local(struct ldb_module *module, void *mem_ctx, const struct ldb_val *val)
-{
- struct ldb_context *ldb;
- struct ldb_dn *dn, *newdn;
- struct ldb_val newval;
-
- ldb = ldb_module_get_ctx(module);
-
- dn = ldb_dn_from_ldb_val(mem_ctx, ldb, val);
- if (! ldb_dn_validate(dn)) {
- newval.length = 0;
- newval.data = NULL;
- talloc_free(dn);
- return newval;
- }
- newdn = ldb_dn_map_local(module, mem_ctx, dn);
- talloc_free(dn);
-
- newval.length = 0;
- newval.data = (uint8_t *)ldb_dn_alloc_linearized(mem_ctx, newdn);
- if (newval.data) {
- newval.length = strlen((char *)newval.data);
- }
- talloc_free(newdn);
-
- return newval;
-}
-
-/* Map a DN contained in an ldb value into the local partition. */
-static struct ldb_val ldb_dn_convert_remote(struct ldb_module *module, void *mem_ctx, const struct ldb_val *val)
-{
- struct ldb_context *ldb;
- struct ldb_dn *dn, *newdn;
- struct ldb_val newval;
-
- ldb = ldb_module_get_ctx(module);
-
- dn = ldb_dn_from_ldb_val(mem_ctx, ldb, val);
- if (! ldb_dn_validate(dn)) {
- newval.length = 0;
- newval.data = NULL;
- talloc_free(dn);
- return newval;
- }
- newdn = ldb_dn_map_remote(module, mem_ctx, dn);
- talloc_free(dn);
-
- newval.length = 0;
- newval.data = (uint8_t *)ldb_dn_alloc_linearized(mem_ctx, newdn);
- if (newval.data) {
- newval.length = strlen((char *)newval.data);
- }
- talloc_free(newdn);
-
- return newval;
-}
-
-/* Map an objectClass into the remote partition. */
-static struct ldb_val map_objectclass_convert_local(struct ldb_module *module, void *mem_ctx, const struct ldb_val *val)
-{
- const struct ldb_map_context *data = map_get_context(module);
- const char *name = (char *)val->data;
- const struct ldb_map_objectclass *map = map_objectclass_find_local(data, name);
- struct ldb_val newval;
-
- if (map) {
- newval.data = (uint8_t*)talloc_strdup(mem_ctx, map->remote_name);
- newval.length = strlen((char *)newval.data);
- return newval;
- }
-
- return ldb_val_dup(mem_ctx, val);
-}
-
-/* Generate a remote message with a mapped objectClass. */
-static void map_objectclass_generate_remote(struct ldb_module *module, const char *local_attr, const struct ldb_message *old, struct ldb_message *remote, struct ldb_message *local)
-{
- const struct ldb_map_context *data = map_get_context(module);
- struct ldb_context *ldb;
- struct ldb_message_element *el, *oc;
- struct ldb_val val;
- bool found_extensibleObject = false;
- unsigned int i;
-
- ldb = ldb_module_get_ctx(module);
-
- /* Find old local objectClass */
- oc = ldb_msg_find_element(old, "objectClass");
- if (oc == NULL) {
- return;
- }
-
- /* Prepare new element */
- el = talloc_zero(remote, struct ldb_message_element);
- if (el == NULL) {
- ldb_oom(ldb);
- return; /* TODO: fail? */
- }
-
- /* Copy local objectClass element, reverse space for an extra value */
- el->num_values = oc->num_values + 1;
- el->values = talloc_array(el, struct ldb_val, el->num_values);
- if (el->values == NULL) {
- talloc_free(el);
- ldb_oom(ldb);
- return; /* TODO: fail? */
- }
-
- /* Copy local element name "objectClass" */
- el->name = talloc_strdup(el, local_attr);
-
- /* Convert all local objectClasses */
- for (i = 0; i < el->num_values - 1; i++) {
- el->values[i] = map_objectclass_convert_local(module, el->values, &oc->values[i]);
- if (ldb_attr_cmp((char *)el->values[i].data, data->add_objectclass) == 0) {
- found_extensibleObject = true;
- }
- }
-
- if (!found_extensibleObject) {
- val.data = (uint8_t *)talloc_strdup(el->values, data->add_objectclass);
- val.length = strlen((char *)val.data);
-
- /* Append additional objectClass data->add_objectclass */
- el->values[i] = val;
- } else {
- el->num_values--;
- }
-
- /* Add new objectClass to remote message */
- ldb_msg_add(remote, el, 0);
-}
-
-/* Map an objectClass into the local partition. */
-static struct ldb_val map_objectclass_convert_remote(struct ldb_module *module, void *mem_ctx, const struct ldb_val *val)
-{
- const struct ldb_map_context *data = map_get_context(module);
- const char *name = (char *)val->data;
- const struct ldb_map_objectclass *map = map_objectclass_find_remote(data, name);
- struct ldb_val newval;
-
- if (map) {
- newval.data = (uint8_t*)talloc_strdup(mem_ctx, map->local_name);
- newval.length = strlen((char *)newval.data);
- return newval;
- }
-
- return ldb_val_dup(mem_ctx, val);
-}
-
-/* Generate a local message with a mapped objectClass. */
-static struct ldb_message_element *map_objectclass_generate_local(struct ldb_module *module, void *mem_ctx, const char *local_attr, const struct ldb_message *remote)
-{
- const struct ldb_map_context *data = map_get_context(module);
- struct ldb_context *ldb;
- struct ldb_message_element *el, *oc;
- struct ldb_val val;
- unsigned int i;
-
- ldb = ldb_module_get_ctx(module);
-
- /* Find old remote objectClass */
- oc = ldb_msg_find_element(remote, "objectClass");
- if (oc == NULL) {
- return NULL;
- }
-
- /* Prepare new element */
- el = talloc_zero(mem_ctx, struct ldb_message_element);
- if (el == NULL) {
- ldb_oom(ldb);
- return NULL;
- }
-
- /* Copy remote objectClass element */
- el->num_values = oc->num_values;
- el->values = talloc_array(el, struct ldb_val, el->num_values);
- if (el->values == NULL) {
- talloc_free(el);
- ldb_oom(ldb);
- return NULL;
- }
-
- /* Copy remote element name "objectClass" */
- el->name = talloc_strdup(el, local_attr);
-
- /* Convert all remote objectClasses */
- for (i = 0; i < el->num_values; i++) {
- el->values[i] = map_objectclass_convert_remote(module, el->values, &oc->values[i]);
- }
-
- val.data = (uint8_t *)talloc_strdup(el->values, data->add_objectclass);
- val.length = strlen((char *)val.data);
-
- /* Remove last value if it was the string in data->add_objectclass (eg samba4top, extensibleObject) */
- if (ldb_val_equal_exact(&val, &el->values[i-1])) {
- el->num_values--;
- el->values = talloc_realloc(el, el->values, struct ldb_val, el->num_values);
- if (el->values == NULL) {
- talloc_free(el);
- ldb_oom(ldb);
- return NULL;
- }
- }
-
- return el;
-}
-
-static const struct ldb_map_attribute objectclass_convert_map = {
- .local_name = "objectClass",
- .type = LDB_MAP_CONVERT,
- .u = {
- .convert = {
- .remote_name = "objectClass",
- .convert_local = map_objectclass_convert_local,
- .convert_remote = map_objectclass_convert_remote,
- },
- },
-};
-
-
-/* Mappings for searches on objectClass= assuming a one-to-one
- * mapping. Needed because this is a generate operator for the
- * add/modify code */
-static int map_objectclass_convert_operator(struct ldb_module *module, void *mem_ctx,
- struct ldb_parse_tree **new, const struct ldb_parse_tree *tree)
-{
-
- return map_subtree_collect_remote_simple(module, mem_ctx, new, tree, &objectclass_convert_map);
-}
-
-/* Auxiliary request construction
- * ============================== */
-
-/* Build a request to search a record by its DN. */
-struct ldb_request *map_search_base_req(struct map_context *ac, struct ldb_dn *dn, const char * const *attrs, const struct ldb_parse_tree *tree, void *context, ldb_map_callback_t callback)
-{
- const struct ldb_parse_tree *search_tree;
- struct ldb_context *ldb;
- struct ldb_request *req;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- if (tree) {
- search_tree = tree;
- } else {
- search_tree = ldb_parse_tree(ac, NULL);
- if (search_tree == NULL) {
- return NULL;
- }
- }
-
- ret = ldb_build_search_req_ex(&req, ldb, ac,
- dn, LDB_SCOPE_BASE,
- search_tree, attrs,
- NULL,
- context, callback,
- ac->req);
- LDB_REQ_SET_LOCATION(req);
- if (ret != LDB_SUCCESS) {
- return NULL;
- }
-
- return req;
-}
-
-/* Build a request to update the 'IS_MAPPED' attribute */
-struct ldb_request *map_build_fixup_req(struct map_context *ac,
- struct ldb_dn *olddn,
- struct ldb_dn *newdn,
- void *context,
- ldb_map_callback_t callback)
-{
- struct ldb_context *ldb;
- struct ldb_request *req;
- struct ldb_message *msg;
- const char *dn;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- /* Prepare message */
- msg = ldb_msg_new(ac);
- if (msg == NULL) {
- map_oom(ac->module);
- return NULL;
- }
-
- /* Update local 'IS_MAPPED' to the new remote DN */
- msg->dn = ldb_dn_copy(msg, olddn);
- dn = ldb_dn_alloc_linearized(msg, newdn);
- if ( ! dn || ! ldb_dn_validate(msg->dn)) {
- goto failed;
- }
- if (ldb_msg_add_empty(msg, IS_MAPPED, LDB_FLAG_MOD_REPLACE, NULL) != 0) {
- goto failed;
- }
- if (ldb_msg_add_string(msg, IS_MAPPED, dn) != 0) {
- goto failed;
- }
-
- /* Prepare request */
- ret = ldb_build_mod_req(&req, ldb,
- ac, msg, NULL,
- context, callback,
- ac->req);
- LDB_REQ_SET_LOCATION(req);
- if (ret != LDB_SUCCESS) {
- goto failed;
- }
- talloc_steal(req, msg);
-
- return req;
-failed:
- talloc_free(msg);
- return NULL;
-}
-
-/* Module initialization
- * ===================== */
-
-
-/* Builtin mappings for DNs and objectClasses */
-static const struct ldb_map_attribute builtin_attribute_maps[] = {
- {
- .local_name = "dn",
- .type = LDB_MAP_CONVERT,
- .u = {
- .convert = {
- .remote_name = "dn",
- .convert_local = ldb_dn_convert_local,
- .convert_remote = ldb_dn_convert_remote,
- },
- },
- },
- {
- .local_name = NULL,
- }
-};
-
-static const struct ldb_map_attribute objectclass_attribute_map = {
- .local_name = "objectClass",
- .type = LDB_MAP_GENERATE,
- .convert_operator = map_objectclass_convert_operator,
- .u = {
- .generate = {
- .remote_names = { "objectClass", NULL },
- .generate_local = map_objectclass_generate_local,
- .generate_remote = map_objectclass_generate_remote,
- },
- },
-};
-
-
-/* Find the special 'MAP_DN_NAME' record and store local and remote
- * base DNs in private data. */
-static int map_init_dns(struct ldb_module *module, struct ldb_map_context *data, const char *name)
-{
- static const char * const attrs[] = { MAP_DN_FROM, MAP_DN_TO, NULL };
- struct ldb_context *ldb;
- struct ldb_dn *dn;
- struct ldb_message *msg;
- struct ldb_result *res;
- int ret;
-
- if (!name) {
- data->local_base_dn = NULL;
- data->remote_base_dn = NULL;
- return LDB_SUCCESS;
- }
-
- ldb = ldb_module_get_ctx(module);
-
- dn = ldb_dn_new_fmt(data, ldb, "%s=%s", MAP_DN_NAME, name);
- if ( ! ldb_dn_validate(dn)) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "Failed to construct '%s' DN!", MAP_DN_NAME);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_search(ldb, data, &res, dn, LDB_SCOPE_BASE, attrs, NULL);
- talloc_free(dn);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- if (res->count == 0) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "No results for '%s=%s'!", MAP_DN_NAME, name);
- talloc_free(res);
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
- if (res->count > 1) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "Too many results for '%s=%s'!", MAP_DN_NAME, name);
- talloc_free(res);
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- msg = res->msgs[0];
- data->local_base_dn = ldb_msg_find_attr_as_dn(ldb, data, msg, MAP_DN_FROM);
- data->remote_base_dn = ldb_msg_find_attr_as_dn(ldb, data, msg, MAP_DN_TO);
- talloc_free(res);
-
- return LDB_SUCCESS;
-}
-
-/* Store attribute maps and objectClass maps in private data. */
-static int map_init_maps(struct ldb_module *module, struct ldb_map_context *data,
- const struct ldb_map_attribute *attrs,
- const struct ldb_map_objectclass *ocls,
- const char * const *wildcard_attributes)
-{
- unsigned int i, j, last;
- last = 0;
-
- /* Count specified attribute maps */
- for (i = 0; attrs[i].local_name; i++) /* noop */ ;
- /* Count built-in attribute maps */
- for (j = 0; builtin_attribute_maps[j].local_name; j++) /* noop */ ;
-
- /* Store list of attribute maps */
- data->attribute_maps = talloc_array(data, struct ldb_map_attribute, i+j+2);
- if (data->attribute_maps == NULL) {
- map_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Specified ones go first */
- for (i = 0; attrs[i].local_name; i++) {
- data->attribute_maps[last] = attrs[i];
- last++;
- }
-
- /* Built-in ones go last */
- for (i = 0; builtin_attribute_maps[i].local_name; i++) {
- data->attribute_maps[last] = builtin_attribute_maps[i];
- last++;
- }
-
- if (data->add_objectclass) {
- /* ObjectClass one is very last, if required */
- data->attribute_maps[last] = objectclass_attribute_map;
- last++;
- } else if (ocls) {
- data->attribute_maps[last] = objectclass_convert_map;
- last++;
- }
-
- /* Ensure 'local_name == NULL' for the last entry */
- memset(&data->attribute_maps[last], 0, sizeof(struct ldb_map_attribute));
-
- /* Store list of objectClass maps */
- data->objectclass_maps = ocls;
-
- data->wildcard_attributes = wildcard_attributes;
-
- return LDB_SUCCESS;
-}
-
-/* Initialize global private data. */
-_PUBLIC_ int ldb_map_init(struct ldb_module *module, const struct ldb_map_attribute *attrs,
- const struct ldb_map_objectclass *ocls,
- const char * const *wildcard_attributes,
- const char *add_objectclass,
- const char *name)
-{
- struct map_private *data;
- int ret;
-
- /* Prepare private data */
- data = talloc_zero(module, struct map_private);
- if (data == NULL) {
- map_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ldb_module_set_private(module, data);
-
- data->context = talloc_zero(data, struct ldb_map_context);
- if (!data->context) {
- map_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Store local and remote baseDNs */
- ret = map_init_dns(module, data->context, name);
- if (ret != LDB_SUCCESS) {
- talloc_free(data);
- return ret;
- }
-
- data->context->add_objectclass = add_objectclass;
-
- /* Store list of attribute and objectClass maps */
- ret = map_init_maps(module, data->context, attrs, ocls, wildcard_attributes);
- if (ret != LDB_SUCCESS) {
- talloc_free(data);
- return ret;
- }
-
- return LDB_SUCCESS;
-}
diff --git a/source4/lib/ldb/ldb_map/ldb_map.h b/source4/lib/ldb/ldb_map/ldb_map.h
deleted file mode 100644
index 5db3e02a08..0000000000
--- a/source4/lib/ldb/ldb_map/ldb_map.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- ldb database mapping module
-
- Copyright (C) Jelmer Vernooij 2005
- Copyright (C) Martin Kuehl <mkhl@samba.org> 2006
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#ifndef __LDB_MAP_H__
-#define __LDB_MAP_H__
-
-#include "ldb_module.h"
-
-/* ldb_map is a skeleton LDB module that can be used for any other modules
- * that need to map attributes.
- *
- * The term 'remote' in this header refers to the connection where the
- * original schema is used on while 'local' means the local connection
- * that any upper layers will use.
- *
- * All local attributes will have to have a definition. Not all remote
- * attributes need a definition as LDB is a lot less strict than LDAP
- * (in other words, sending unknown attributes to an LDAP server hurts us,
- * while returning too many attributes in ldb_search() doesn't)
- */
-
-
-/* Name of the internal attribute pointing from the local to the
- * remote part of a record */
-#define IS_MAPPED "isMapped"
-
-
-struct ldb_map_context;
-
-/* convert a local ldb_val to a remote ldb_val */
-typedef struct ldb_val (*ldb_map_convert_func) (struct ldb_module *module, void *mem_ctx, const struct ldb_val *val);
-
-#define LDB_MAP_MAX_REMOTE_NAMES 10
-
-/* map from local to remote attribute */
-struct ldb_map_attribute {
- const char *local_name; /* local name */
-
- enum ldb_map_attr_type {
- LDB_MAP_IGNORE, /* Ignore this local attribute. Doesn't exist remotely. */
- LDB_MAP_KEEP, /* Keep as is. Same name locally and remotely. */
- LDB_MAP_RENAME, /* Simply rename the attribute. Name changes, data is the same */
- LDB_MAP_CONVERT, /* Rename + convert data */
- LDB_MAP_GENERATE /* Use generate function for generating new name/data.
- Used for generating attributes based on
- multiple remote attributes. */
- } type;
-
- /* if set, will be called for search expressions that contain this attribute */
- int (*convert_operator)(struct ldb_module *, TALLOC_CTX *ctx, struct ldb_parse_tree **ntree, const struct ldb_parse_tree *otree);
-
- union {
- struct {
- const char *remote_name;
- } rename;
-
- struct {
- const char *remote_name;
-
- /* Convert local to remote data */
- ldb_map_convert_func convert_local;
-
- /* Convert remote to local data */
- /* an entry can have convert_remote set to NULL, as long as there as an entry with the same local_name
- * that is non-NULL before it. */
- ldb_map_convert_func convert_remote;
- } convert;
-
- struct {
- /* Generate the local attribute from remote message */
- struct ldb_message_element *(*generate_local)(struct ldb_module *, TALLOC_CTX *mem_ctx, const char *remote_attr, const struct ldb_message *remote);
-
- /* Update remote message with information from local message */
- void (*generate_remote)(struct ldb_module *, const char *local_attr, const struct ldb_message *old, struct ldb_message *remote, struct ldb_message *local);
-
- /* Name(s) for this attribute on the remote server. This is an array since
- * one local attribute's data can be split up into several attributes
- * remotely */
- const char *remote_names[LDB_MAP_MAX_REMOTE_NAMES];
-
- /* Names of additional remote attributes
- * required for the generation. NULL
- * indicates that `local_attr' suffices. */
- /*
-#define LDB_MAP_MAX_SELF_ATTRIBUTES 10
- const char *self_attrs[LDB_MAP_MAX_SELF_ATTRIBUTES];
- */
- } generate;
- } u;
-};
-
-
-#define LDB_MAP_MAX_SUBCLASSES 10
-#define LDB_MAP_MAX_MUSTS 10
-#define LDB_MAP_MAX_MAYS 50
-
-/* map from local to remote objectClass */
-struct ldb_map_objectclass {
- const char *local_name;
- const char *remote_name;
- const char *base_classes[LDB_MAP_MAX_SUBCLASSES];
- const char *musts[LDB_MAP_MAX_MUSTS];
- const char *mays[LDB_MAP_MAX_MAYS];
-};
-
-
-/* private context data */
-struct ldb_map_context {
- struct ldb_map_attribute *attribute_maps;
- /* NOTE: Always declare base classes first here */
- const struct ldb_map_objectclass *objectclass_maps;
-
- /* Remote (often operational) attributes that should be added
- * to any wildcard search */
- const char * const *wildcard_attributes;
-
- /* ObjectClass (if any) to be added to remote attributes on add */
- const char *add_objectclass;
-
- /* struct ldb_context *mapped_ldb; */
- struct ldb_dn *local_base_dn;
- struct ldb_dn *remote_base_dn;
-};
-
-/* Global private data */
-struct map_private {
- void *caller_private;
- struct ldb_map_context *context;
-};
-
-/* Initialize global private data. */
-int ldb_map_init(struct ldb_module *module, const struct ldb_map_attribute *attrs,
- const struct ldb_map_objectclass *ocls,
- const char * const *wildcard_attributes,
- const char *add_objectclass,
- const char *name);
-
-int ldb_map_add(struct ldb_module *module, struct ldb_request *req);
-int ldb_map_search(struct ldb_module *module, struct ldb_request *req);
-int ldb_map_rename(struct ldb_module *module, struct ldb_request *req);
-int ldb_map_delete(struct ldb_module *module, struct ldb_request *req);
-int ldb_map_modify(struct ldb_module *module, struct ldb_request *req);
-
-#define LDB_MAP_OPS \
- .add = ldb_map_add, \
- .modify = ldb_map_modify, \
- .del = ldb_map_delete, \
- .rename = ldb_map_rename, \
- .search = ldb_map_search,
-
-#endif /* __LDB_MAP_H__ */
diff --git a/source4/lib/ldb/ldb_map/ldb_map_inbound.c b/source4/lib/ldb/ldb_map/ldb_map_inbound.c
deleted file mode 100644
index b61037222a..0000000000
--- a/source4/lib/ldb/ldb_map/ldb_map_inbound.c
+++ /dev/null
@@ -1,837 +0,0 @@
-/*
- ldb database mapping module
-
- Copyright (C) Jelmer Vernooij 2005
- Copyright (C) Martin Kuehl <mkhl@samba.org> 2006
- Copyright (C) Simo Sorce <idra@samba.org> 2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_map.h"
-#include "ldb_map_private.h"
-
-
-/* Mapping message elements
- * ======================== */
-
-/* Map a message element into the remote partition. */
-static struct ldb_message_element *ldb_msg_el_map_local(struct ldb_module *module, void *mem_ctx, const struct ldb_map_attribute *map, const struct ldb_message_element *old)
-{
- struct ldb_message_element *el;
- unsigned int i;
-
- el = talloc_zero(mem_ctx, struct ldb_message_element);
- if (el == NULL) {
- map_oom(module);
- return NULL;
- }
-
- el->num_values = old->num_values;
- el->values = talloc_array(el, struct ldb_val, el->num_values);
- if (el->values == NULL) {
- talloc_free(el);
- map_oom(module);
- return NULL;
- }
-
- el->name = map_attr_map_local(el, map, old->name);
-
- for (i = 0; i < el->num_values; i++) {
- el->values[i] = ldb_val_map_local(module, el->values, map, &old->values[i]);
- }
-
- return el;
-}
-
-/* Add a message element either to a local or to a remote message,
- * depending on whether it goes into the local or remote partition. */
-static int ldb_msg_el_partition(struct ldb_module *module, struct ldb_message *local, struct ldb_message *remote, const struct ldb_message *msg, const char *attr_name, /* const char * const names[], */ const struct ldb_message_element *old)
-{
- const struct ldb_map_context *data = map_get_context(module);
- const struct ldb_map_attribute *map = map_attr_find_local(data, attr_name);
- struct ldb_message_element *el=NULL;
- struct ldb_context *ldb = ldb_module_get_ctx(module);
-
- /* Unknown attribute: ignore */
- if (map == NULL) {
- ldb_debug(ldb, LDB_DEBUG_WARNING, "ldb_map: "
- "Not mapping attribute '%s': no mapping found",
- old->name);
- goto local;
- }
-
- switch (map->type) {
- case LDB_MAP_IGNORE:
- goto local;
-
- case LDB_MAP_CONVERT:
- if (map->u.convert.convert_local == NULL) {
- ldb_debug(ldb, LDB_DEBUG_WARNING, "ldb_map: "
- "Not mapping attribute '%s': "
- "'convert_local' not set",
- map->local_name);
- goto local;
- }
- /* fall through */
- case LDB_MAP_KEEP:
- case LDB_MAP_RENAME:
- el = ldb_msg_el_map_local(module, remote, map, old);
- break;
-
- case LDB_MAP_GENERATE:
- if (map->u.generate.generate_remote == NULL) {
- ldb_debug(ldb, LDB_DEBUG_WARNING, "ldb_map: "
- "Not mapping attribute '%s': "
- "'generate_remote' not set",
- map->local_name);
- goto local;
- }
-
- /* TODO: if this attr requires context:
- * make sure all context attrs are mappable (in 'names')
- * make sure all context attrs have already been mapped?
- * maybe postpone generation until they have been mapped?
- */
-
- map->u.generate.generate_remote(module, map->local_name, msg, remote, local);
- return 0;
- }
-
- if (el == NULL) {
- return -1;
- }
-
- return ldb_msg_add(remote, el, old->flags);
-
-local:
- el = talloc(local, struct ldb_message_element);
- if (el == NULL) {
- map_oom(module);
- return -1;
- }
-
- *el = *old; /* copy the old element */
-
- return ldb_msg_add(local, el, old->flags);
-}
-
-/* Mapping messages
- * ================ */
-
-/* Check whether a message will be (partially) mapped into the remote partition. */
-static bool ldb_msg_check_remote(struct ldb_module *module, const struct ldb_message *msg)
-{
- const struct ldb_map_context *data = map_get_context(module);
- bool ret;
- unsigned int i;
-
- for (i = 0; i < msg->num_elements; i++) {
- ret = map_attr_check_remote(data, msg->elements[i].name);
- if (ret) {
- return ret;
- }
- }
-
- return false;
-}
-
-/* Split message elements that stay in the local partition from those
- * that are mapped into the remote partition. */
-static int ldb_msg_partition(struct ldb_module *module, struct ldb_message *local, struct ldb_message *remote, const struct ldb_message *msg)
-{
- /* const char * const names[]; */
- struct ldb_context *ldb;
- unsigned int i;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- for (i = 0; i < msg->num_elements; i++) {
- /* Skip 'IS_MAPPED' */
- if (ldb_attr_cmp(msg->elements[i].name, IS_MAPPED) == 0) {
- ldb_debug(ldb, LDB_DEBUG_WARNING, "ldb_map: "
- "Skipping attribute '%s'",
- msg->elements[i].name);
- continue;
- }
-
- ret = ldb_msg_el_partition(module, local, remote, msg, msg->elements[i].name, &msg->elements[i]);
- if (ret) {
- return ret;
- }
- }
-
- return 0;
-}
-
-
-static int map_add_do_local(struct map_context *ac);
-static int map_modify_do_local(struct map_context *ac);
-static int map_delete_do_local(struct map_context *ac);
-static int map_rename_do_local(struct map_context *ac);
-static int map_rename_do_fixup(struct map_context *ac);
-static int map_rename_local_callback(struct ldb_request *req,
- struct ldb_reply *ares);
-
-
-/*****************************************************************************
- * COMMON INBOUND functions
-*****************************************************************************/
-
-/* Store the DN of a single search result in context. */
-static int map_search_self_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct ldb_context *ldb;
- struct map_context *ac;
- int ret;
-
- ac = talloc_get_type(req->context, struct map_context);
- ldb = ldb_module_get_ctx(ac->module);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- /* We are interested only in the single reply */
- switch(ares->type) {
- case LDB_REPLY_ENTRY:
- /* We have already found a remote DN */
- if (ac->local_dn) {
- ldb_set_errstring(ldb,
- "Too many results!");
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- /* Store local DN */
- ac->local_dn = talloc_steal(ac, ares->message->dn);
- break;
-
- case LDB_REPLY_DONE:
-
- switch (ac->req->operation) {
- case LDB_MODIFY:
- ret = map_modify_do_local(ac);
- break;
- case LDB_DELETE:
- ret = map_delete_do_local(ac);
- break;
- case LDB_RENAME:
- ret = map_rename_do_local(ac);
- break;
- default:
- /* if we get here we have definitely a problem */
- ret = LDB_ERR_OPERATIONS_ERROR;
- }
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- default:
- /* ignore referrals */
- break;
- }
-
- talloc_free(ares);
- return LDB_SUCCESS;
-}
-
-/* Build a request to search the local record by its DN. */
-static int map_search_self_req(struct ldb_request **req,
- struct map_context *ac,
- struct ldb_dn *dn)
-{
- /* attrs[] is returned from this function in
- * ac->search_req->op.search.attrs, so it must be static, as
- * otherwise the compiler can put it on the stack */
- static const char * const attrs[] = { IS_MAPPED, NULL };
- struct ldb_parse_tree *tree;
-
- /* Limit search to records with 'IS_MAPPED' present */
- tree = ldb_parse_tree(ac, "(" IS_MAPPED "=*)");
- if (tree == NULL) {
- map_oom(ac->module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- *req = map_search_base_req(ac, dn, attrs, tree,
- ac, map_search_self_callback);
- if (*req == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
-}
-
-static int map_op_local_callback(struct ldb_request *req,
- struct ldb_reply *ares)
-{
- struct ldb_context *ldb;
- struct map_context *ac;
- int ret;
-
- ac = talloc_get_type(req->context, struct map_context);
- ldb = ldb_module_get_ctx(ac->module);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- if (ares->type != LDB_REPLY_DONE) {
- ldb_set_errstring(ldb, "Invalid reply type!");
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- /* Do the remote request. */
- ret = ldb_next_remote_request(ac->module, ac->remote_req);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- return LDB_SUCCESS;
-}
-
-static int map_op_remote_callback(struct ldb_request *req,
- struct ldb_reply *ares)
-{
- struct ldb_context *ldb;
- struct map_context *ac;
-
- ac = talloc_get_type(req->context, struct map_context);
- ldb = ldb_module_get_ctx(ac->module);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- if (ares->type != LDB_REPLY_DONE) {
- ldb_set_errstring(ldb, "Invalid reply type!");
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
-}
-
-
-/*****************************************************************************
- * ADD operations
-*****************************************************************************/
-
-
-/* Add a record. */
-int ldb_map_add(struct ldb_module *module, struct ldb_request *req)
-{
- const struct ldb_message *msg = req->op.add.message;
- struct ldb_context *ldb;
- struct map_context *ac;
- struct ldb_message *remote_msg;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* Do not manipulate our control entries */
- if (ldb_dn_is_special(msg->dn)) {
- return ldb_next_request(module, req);
- }
-
- /* No mapping requested (perhaps no DN mapping specified), skip to next module */
- if (!ldb_dn_check_local(module, msg->dn)) {
- return ldb_next_request(module, req);
- }
-
- /* No mapping needed, fail */
- if (!ldb_msg_check_remote(module, msg)) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Prepare context and handle */
- ac = map_init_context(module, req);
- if (ac == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
-
- /* Prepare the local message */
- ac->local_msg = ldb_msg_new(ac);
- if (ac->local_msg == NULL) {
- map_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ac->local_msg->dn = msg->dn;
-
- /* Prepare the remote message */
- remote_msg = ldb_msg_new(ac);
- if (remote_msg == NULL) {
- map_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- remote_msg->dn = ldb_dn_map_local(ac->module, remote_msg, msg->dn);
-
- /* Split local from remote message */
- ldb_msg_partition(module, ac->local_msg, remote_msg, msg);
-
- /* Prepare the remote operation */
- ret = ldb_build_add_req(&ac->remote_req, ldb,
- ac, remote_msg,
- req->controls,
- ac, map_op_remote_callback,
- req);
- LDB_REQ_SET_LOCATION(ac->remote_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if ((ac->local_msg->num_elements == 0) ||
- ( ! map_check_local_db(ac->module))) {
- /* No local data or db, just run the remote request */
- return ldb_next_remote_request(ac->module, ac->remote_req);
- }
-
- /* Store remote DN in 'IS_MAPPED' */
- /* TODO: use GUIDs here instead */
- ret = ldb_msg_add_linearized_dn(ac->local_msg, IS_MAPPED,
- remote_msg->dn);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return map_add_do_local(ac);
-}
-
-/* Add the local record. */
-static int map_add_do_local(struct map_context *ac)
-{
- struct ldb_request *local_req;
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- /* Prepare the local operation */
- ret = ldb_build_add_req(&local_req, ldb, ac,
- ac->local_msg,
- ac->req->controls,
- ac,
- map_op_local_callback,
- ac->req);
- LDB_REQ_SET_LOCATION(local_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- return ldb_next_request(ac->module, local_req);
-}
-
-/*****************************************************************************
- * MODIFY operations
-*****************************************************************************/
-
-/* Modify a record. */
-int ldb_map_modify(struct ldb_module *module, struct ldb_request *req)
-{
- const struct ldb_message *msg = req->op.mod.message;
- struct ldb_request *search_req;
- struct ldb_message *remote_msg;
- struct ldb_context *ldb;
- struct map_context *ac;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* Do not manipulate our control entries */
- if (ldb_dn_is_special(msg->dn)) {
- return ldb_next_request(module, req);
- }
-
- /* No mapping requested (perhaps no DN mapping specified), skip to next module */
- if (!ldb_dn_check_local(module, msg->dn)) {
- return ldb_next_request(module, req);
- }
-
- /* No mapping needed, skip to next module */
- /* TODO: What if the remote part exists, the local doesn't,
- * and this request wants to modify local data and thus
- * add the local record? */
- if (!ldb_msg_check_remote(module, msg)) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Prepare context and handle */
- ac = map_init_context(module, req);
- if (ac == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Prepare the local message */
- ac->local_msg = ldb_msg_new(ac);
- if (ac->local_msg == NULL) {
- map_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ac->local_msg->dn = msg->dn;
-
- /* Prepare the remote message */
- remote_msg = ldb_msg_new(ac->remote_req);
- if (remote_msg == NULL) {
- map_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- remote_msg->dn = ldb_dn_map_local(ac->module, remote_msg, msg->dn);
-
- /* Split local from remote message */
- ldb_msg_partition(module, ac->local_msg, remote_msg, msg);
-
- /* Prepare the remote operation */
- ret = ldb_build_mod_req(&ac->remote_req, ldb,
- ac, remote_msg,
- req->controls,
- ac, map_op_remote_callback,
- req);
- LDB_REQ_SET_LOCATION(ac->remote_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if ((ac->local_msg->num_elements == 0) ||
- ( ! map_check_local_db(ac->module))) {
- /* No local data or db, just run the remote request */
- return ldb_next_remote_request(ac->module, ac->remote_req);
- }
-
- /* prepare the search operation */
- ret = map_search_self_req(&search_req, ac, msg->dn);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_request(module, search_req);
-}
-
-/* Modify the local record. */
-static int map_modify_do_local(struct map_context *ac)
-{
- struct ldb_request *local_req;
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- if (ac->local_dn == NULL) {
- /* No local record present, add it instead */
- /* Add local 'IS_MAPPED' */
- /* TODO: use GUIDs here instead */
- if (ldb_msg_add_empty(ac->local_msg, IS_MAPPED,
- LDB_FLAG_MOD_ADD, NULL) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ret = ldb_msg_add_linearized_dn(ac->local_msg, IS_MAPPED,
- ac->remote_req->op.mod.message->dn);
- if (ret != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Prepare the local operation */
- ret = ldb_build_add_req(&local_req, ldb, ac,
- ac->local_msg,
- ac->req->controls,
- ac,
- map_op_local_callback,
- ac->req);
- LDB_REQ_SET_LOCATION(local_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- } else {
- /* Prepare the local operation */
- ret = ldb_build_mod_req(&local_req, ldb, ac,
- ac->local_msg,
- ac->req->controls,
- ac,
- map_op_local_callback,
- ac->req);
- LDB_REQ_SET_LOCATION(local_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- return ldb_next_request(ac->module, local_req);
-}
-
-/*****************************************************************************
- * DELETE operations
-*****************************************************************************/
-
-/* Delete a record. */
-int ldb_map_delete(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_request *search_req;
- struct ldb_context *ldb;
- struct map_context *ac;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* Do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.del.dn)) {
- return ldb_next_request(module, req);
- }
-
- /* No mapping requested (perhaps no DN mapping specified).
- * Skip to next module */
- if (!ldb_dn_check_local(module, req->op.del.dn)) {
- return ldb_next_request(module, req);
- }
-
- /* Prepare context and handle */
- ac = map_init_context(module, req);
- if (ac == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Prepare the remote operation */
- ret = ldb_build_del_req(&ac->remote_req, ldb, ac,
- ldb_dn_map_local(module, ac, req->op.del.dn),
- req->controls,
- ac,
- map_op_remote_callback,
- req);
- LDB_REQ_SET_LOCATION(ac->remote_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* No local db, just run the remote request */
- if (!map_check_local_db(ac->module)) {
- /* Do the remote request. */
- return ldb_next_remote_request(ac->module, ac->remote_req);
- }
-
- /* Prepare the search operation */
- ret = map_search_self_req(&search_req, ac, req->op.del.dn);
- if (ret != LDB_SUCCESS) {
- map_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_request(module, search_req);
-}
-
-/* Delete the local record. */
-static int map_delete_do_local(struct map_context *ac)
-{
- struct ldb_request *local_req;
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- /* No local record, continue remotely */
- if (ac->local_dn == NULL) {
- /* Do the remote request. */
- return ldb_next_remote_request(ac->module, ac->remote_req);
- }
-
- /* Prepare the local operation */
- ret = ldb_build_del_req(&local_req, ldb, ac,
- ac->req->op.del.dn,
- ac->req->controls,
- ac,
- map_op_local_callback,
- ac->req);
- LDB_REQ_SET_LOCATION(local_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- return ldb_next_request(ac->module, local_req);
-}
-
-/*****************************************************************************
- * RENAME operations
-*****************************************************************************/
-
-/* Rename a record. */
-int ldb_map_rename(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_request *search_req;
- struct ldb_context *ldb;
- struct map_context *ac;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* Do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.rename.olddn)) {
- return ldb_next_request(module, req);
- }
-
- /* No mapping requested (perhaps no DN mapping specified).
- * Skip to next module */
- if ((!ldb_dn_check_local(module, req->op.rename.olddn)) &&
- (!ldb_dn_check_local(module, req->op.rename.newdn))) {
- return ldb_next_request(module, req);
- }
-
- /* Rename into/out of the mapped partition requested, bail out */
- if (!ldb_dn_check_local(module, req->op.rename.olddn) ||
- !ldb_dn_check_local(module, req->op.rename.newdn)) {
- return LDB_ERR_AFFECTS_MULTIPLE_DSAS;
- }
-
- /* Prepare context and handle */
- ac = map_init_context(module, req);
- if (ac == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Prepare the remote operation */
- ret = ldb_build_rename_req(&ac->remote_req, ldb, ac,
- ldb_dn_map_local(module, ac, req->op.rename.olddn),
- ldb_dn_map_local(module, ac, req->op.rename.newdn),
- req->controls,
- ac, map_op_remote_callback,
- req);
- LDB_REQ_SET_LOCATION(ac->remote_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* No local db, just run the remote request */
- if (!map_check_local_db(ac->module)) {
- /* Do the remote request. */
- return ldb_next_remote_request(ac->module, ac->remote_req);
- }
-
- /* Prepare the search operation */
- ret = map_search_self_req(&search_req, ac, req->op.rename.olddn);
- if (ret != LDB_SUCCESS) {
- map_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_request(module, search_req);
-}
-
-/* Rename the local record. */
-static int map_rename_do_local(struct map_context *ac)
-{
- struct ldb_request *local_req;
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- /* No local record, continue remotely */
- if (ac->local_dn == NULL) {
- /* Do the remote request. */
- return ldb_next_remote_request(ac->module, ac->remote_req);
- }
-
- /* Prepare the local operation */
- ret = ldb_build_rename_req(&local_req, ldb, ac,
- ac->req->op.rename.olddn,
- ac->req->op.rename.newdn,
- ac->req->controls,
- ac,
- map_rename_local_callback,
- ac->req);
- LDB_REQ_SET_LOCATION(local_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_request(ac->module, local_req);
-}
-
-static int map_rename_local_callback(struct ldb_request *req,
- struct ldb_reply *ares)
-{
- struct ldb_context *ldb;
- struct map_context *ac;
- int ret;
-
- ac = talloc_get_type(req->context, struct map_context);
- ldb = ldb_module_get_ctx(ac->module);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- if (ares->type != LDB_REPLY_DONE) {
- ldb_set_errstring(ldb, "Invalid reply type!");
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- /* proceed with next step */
- ret = map_rename_do_fixup(ac);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- return LDB_SUCCESS;
-}
-
-/* Update the local 'IS_MAPPED' attribute. */
-static int map_rename_do_fixup(struct map_context *ac)
-{
- struct ldb_request *local_req;
-
- /* Prepare the fixup operation */
- /* TODO: use GUIDs here instead -- or skip it when GUIDs are used. */
- local_req = map_build_fixup_req(ac,
- ac->req->op.rename.newdn,
- ac->remote_req->op.rename.newdn,
- ac,
- map_op_local_callback);
- if (local_req == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_request(ac->module, local_req);
-}
diff --git a/source4/lib/ldb/ldb_map/ldb_map_outbound.c b/source4/lib/ldb/ldb_map/ldb_map_outbound.c
deleted file mode 100644
index 2c517a625d..0000000000
--- a/source4/lib/ldb/ldb_map/ldb_map_outbound.c
+++ /dev/null
@@ -1,1407 +0,0 @@
-/*
- ldb database mapping module
-
- Copyright (C) Jelmer Vernooij 2005
- Copyright (C) Martin Kuehl <mkhl@samba.org> 2006
- Copyright (C) Andrew Bartlett <abartlet@samba.org> 2006
- Copyright (C) Simo Sorce <idra@samba.org> 2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_map.h"
-#include "ldb_map_private.h"
-
-
-/* Mapping attributes
- * ================== */
-
-/* Select attributes that stay in the local partition. */
-static const char **map_attrs_select_local(struct ldb_module *module, void *mem_ctx, const char * const *attrs)
-{
- const struct ldb_map_context *data = map_get_context(module);
- const char **result;
- unsigned int i, last;
-
- if (attrs == NULL)
- return NULL;
-
- last = 0;
- result = talloc_array(mem_ctx, const char *, 1);
- if (result == NULL) {
- goto failed;
- }
- result[0] = NULL;
-
- for (i = 0; attrs[i]; i++) {
- /* Wildcards and ignored attributes are kept locally */
- if ((ldb_attr_cmp(attrs[i], "*") == 0) ||
- (!map_attr_check_remote(data, attrs[i]))) {
- result = talloc_realloc(mem_ctx, result, const char *, last+2);
- if (result == NULL) {
- goto failed;
- }
-
- result[last] = talloc_strdup(result, attrs[i]);
- result[last+1] = NULL;
- last++;
- }
- }
-
- return result;
-
-failed:
- talloc_free(result);
- map_oom(module);
- return NULL;
-}
-
-/* Collect attributes that are mapped into the remote partition. */
-static const char **map_attrs_collect_remote(struct ldb_module *module, void *mem_ctx,
- const char * const *attrs)
-{
- const struct ldb_map_context *data = map_get_context(module);
- const char **result;
- const struct ldb_map_attribute *map;
- const char *name=NULL;
- unsigned int i, j, last;
- int ret;
-
- last = 0;
- result = talloc_array(mem_ctx, const char *, 1);
- if (result == NULL) {
- goto failed;
- }
- result[0] = NULL;
-
- for (i = 0; attrs[i]; i++) {
- /* Wildcards are kept remotely, too */
- if (ldb_attr_cmp(attrs[i], "*") == 0) {
- const char **new_attrs = NULL;
- ret = map_attrs_merge(module, mem_ctx, &new_attrs, attrs);
- if (ret != LDB_SUCCESS) {
- goto failed;
- }
- ret = map_attrs_merge(module, mem_ctx, &new_attrs, data->wildcard_attributes);
- if (ret != LDB_SUCCESS) {
- goto failed;
- }
-
- attrs = new_attrs;
- break;
- }
- }
-
- for (i = 0; attrs[i]; i++) {
- /* Wildcards are kept remotely, too */
- if (ldb_attr_cmp(attrs[i], "*") == 0) {
- /* Add all 'include in wildcard' attributes */
- name = attrs[i];
- goto named;
- }
-
- /* Add remote names of mapped attrs */
- map = map_attr_find_local(data, attrs[i]);
- if (map == NULL) {
- continue;
- }
-
- switch (map->type) {
- case LDB_MAP_IGNORE:
- continue;
-
- case LDB_MAP_KEEP:
- name = attrs[i];
- goto named;
-
- case LDB_MAP_RENAME:
- case LDB_MAP_CONVERT:
- name = map->u.rename.remote_name;
- goto named;
-
- case LDB_MAP_GENERATE:
- /* Add all remote names of "generate" attrs */
- for (j = 0; map->u.generate.remote_names[j]; j++) {
- result = talloc_realloc(mem_ctx, result, const char *, last+2);
- if (result == NULL) {
- goto failed;
- }
-
- result[last] = talloc_strdup(result, map->u.generate.remote_names[j]);
- result[last+1] = NULL;
- last++;
- }
- continue;
- }
-
- named: /* We found a single remote name, add that */
- result = talloc_realloc(mem_ctx, result, const char *, last+2);
- if (result == NULL) {
- goto failed;
- }
-
- result[last] = talloc_strdup(result, name);
- result[last+1] = NULL;
- last++;
- }
-
- return result;
-
-failed:
- talloc_free(result);
- map_oom(module);
- return NULL;
-}
-
-/* Split attributes that stay in the local partition from those that
- * are mapped into the remote partition. */
-static int map_attrs_partition(struct ldb_module *module, void *mem_ctx, const char ***local_attrs, const char ***remote_attrs, const char * const *attrs)
-{
- *local_attrs = map_attrs_select_local(module, mem_ctx, attrs);
- *remote_attrs = map_attrs_collect_remote(module, mem_ctx, attrs);
-
- return 0;
-}
-
-/* Mapping message elements
- * ======================== */
-
-/* Add an element to a message, overwriting any old identically named elements. */
-static int ldb_msg_replace(struct ldb_message *msg, const struct ldb_message_element *el)
-{
- struct ldb_message_element *old;
-
- old = ldb_msg_find_element(msg, el->name);
-
- /* no local result, add as new element */
- if (old == NULL) {
- if (ldb_msg_add_empty(msg, el->name, 0, &old) != 0) {
- return -1;
- }
- talloc_free(discard_const_p(char, old->name));
- }
-
- /* copy new element */
- *old = *el;
-
- /* and make sure we reference the contents */
- if (!talloc_reference(msg->elements, el->name)) {
- return -1;
- }
- if (!talloc_reference(msg->elements, el->values)) {
- return -1;
- }
-
- return 0;
-}
-
-/* Map a message element back into the local partition. */
-static struct ldb_message_element *ldb_msg_el_map_remote(struct ldb_module *module,
- void *mem_ctx,
- const struct ldb_map_attribute *map,
- const char *attr_name,
- const struct ldb_message_element *old)
-{
- const struct ldb_map_context *data = map_get_context(module);
- const char *local_attr_name = attr_name;
- struct ldb_message_element *el;
- unsigned int i;
-
- el = talloc_zero(mem_ctx, struct ldb_message_element);
- if (el == NULL) {
- map_oom(module);
- return NULL;
- }
-
- el->values = talloc_array(el, struct ldb_val, old->num_values);
- if (el->values == NULL) {
- talloc_free(el);
- map_oom(module);
- return NULL;
- }
-
- for (i = 0; data->attribute_maps[i].local_name; i++) {
- struct ldb_map_attribute *am = &data->attribute_maps[i];
- if ((am->type == LDB_MAP_RENAME &&
- !strcmp(am->u.rename.remote_name, attr_name))
- || (am->type == LDB_MAP_CONVERT &&
- !strcmp(am->u.convert.remote_name, attr_name))) {
-
- local_attr_name = am->local_name;
- break;
- }
- }
-
- el->name = talloc_strdup(el, local_attr_name);
- if (el->name == NULL) {
- talloc_free(el);
- map_oom(module);
- return NULL;
- }
-
- for (i = 0; i < old->num_values; i++) {
- el->values[i] = ldb_val_map_remote(module, el->values, map, &old->values[i]);
- /* Conversions might fail, in which case bail */
- if (!el->values[i].data) {
- talloc_free(el);
- return NULL;
- }
- el->num_values++;
- }
-
- return el;
-}
-
-/* Merge a remote message element into a local message. */
-static int ldb_msg_el_merge(struct ldb_module *module, struct ldb_message *local,
- struct ldb_message *remote, const char *attr_name)
-{
- const struct ldb_map_context *data = map_get_context(module);
- const struct ldb_map_attribute *map;
- struct ldb_message_element *old, *el=NULL;
- const char *remote_name = NULL;
- struct ldb_context *ldb;
-
- ldb = ldb_module_get_ctx(module);
-
- /* We handle wildcards in ldb_msg_el_merge_wildcard */
- if (ldb_attr_cmp(attr_name, "*") == 0) {
- return LDB_SUCCESS;
- }
-
- map = map_attr_find_local(data, attr_name);
-
- /* Unknown attribute in remote message:
- * skip, attribute was probably auto-generated */
- if (map == NULL) {
- return LDB_SUCCESS;
- }
-
- switch (map->type) {
- case LDB_MAP_IGNORE:
- break;
- case LDB_MAP_CONVERT:
- remote_name = map->u.convert.remote_name;
- break;
- case LDB_MAP_KEEP:
- remote_name = attr_name;
- break;
- case LDB_MAP_RENAME:
- remote_name = map->u.rename.remote_name;
- break;
- case LDB_MAP_GENERATE:
- break;
- }
-
- switch (map->type) {
- case LDB_MAP_IGNORE:
- return LDB_SUCCESS;
-
- case LDB_MAP_CONVERT:
- if (map->u.convert.convert_remote == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "Skipping attribute '%s': "
- "'convert_remote' not set",
- attr_name);
- return LDB_SUCCESS;
- }
- /* fall through */
- case LDB_MAP_KEEP:
- case LDB_MAP_RENAME:
- old = ldb_msg_find_element(remote, remote_name);
- if (old) {
- el = ldb_msg_el_map_remote(module, local, map, attr_name, old);
- } else {
- return LDB_ERR_NO_SUCH_ATTRIBUTE;
- }
- break;
-
- case LDB_MAP_GENERATE:
- if (map->u.generate.generate_local == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "ldb_map: "
- "Skipping attribute '%s': "
- "'generate_local' not set",
- attr_name);
- return LDB_SUCCESS;
- }
-
- el = map->u.generate.generate_local(module, local, attr_name, remote);
- if (!el) {
- /* Generation failure is probably due to lack of source attributes */
- return LDB_ERR_NO_SUCH_ATTRIBUTE;
- }
- break;
- }
-
- if (el == NULL) {
- return LDB_ERR_NO_SUCH_ATTRIBUTE;
- }
-
- return ldb_msg_replace(local, el);
-}
-
-/* Handle wildcard parts of merging a remote message element into a local message. */
-static int ldb_msg_el_merge_wildcard(struct ldb_module *module, struct ldb_message *local,
- struct ldb_message *remote)
-{
- const struct ldb_map_context *data = map_get_context(module);
- const struct ldb_map_attribute *map = map_attr_find_local(data, "*");
- struct ldb_message_element *el=NULL;
- unsigned int i;
- int ret;
-
- /* Perhaps we have a mapping for "*" */
- if (map && map->type == LDB_MAP_KEEP) {
- /* We copy everything over, and hope that anything with a
- more specific rule is overwritten */
- for (i = 0; i < remote->num_elements; i++) {
- el = ldb_msg_el_map_remote(module, local, map, remote->elements[i].name,
- &remote->elements[i]);
- if (el == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_msg_replace(local, el);
- if (ret) {
- return ret;
- }
- }
- }
-
- /* Now walk the list of possible mappings, and apply each */
- for (i = 0; data->attribute_maps[i].local_name; i++) {
- ret = ldb_msg_el_merge(module, local, remote,
- data->attribute_maps[i].local_name);
- if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE) {
- continue;
- } else if (ret) {
- return ret;
- } else {
- continue;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-/* Mapping messages
- * ================ */
-
-/* Merge two local messages into a single one. */
-static int ldb_msg_merge_local(struct ldb_module *module, struct ldb_message *msg1, struct ldb_message *msg2)
-{
- unsigned int i;
- int ret;
-
- for (i = 0; i < msg2->num_elements; i++) {
- ret = ldb_msg_replace(msg1, &msg2->elements[i]);
- if (ret) {
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-/* Merge a local and a remote message into a single local one. */
-static int ldb_msg_merge_remote(struct map_context *ac, struct ldb_message *local,
- struct ldb_message *remote)
-{
- unsigned int i;
- int ret;
- const char * const *attrs = ac->all_attrs;
- if (!attrs) {
- ret = ldb_msg_el_merge_wildcard(ac->module, local, remote);
- if (ret) {
- return ret;
- }
- }
-
- for (i = 0; attrs && attrs[i]; i++) {
- if (ldb_attr_cmp(attrs[i], "*") == 0) {
- ret = ldb_msg_el_merge_wildcard(ac->module, local, remote);
- if (ret) {
- return ret;
- }
- break;
- }
- }
-
- /* Try to map each attribute back;
- * Add to local message is possible,
- * Overwrite old local attribute if necessary */
- for (i = 0; attrs && attrs[i]; i++) {
- ret = ldb_msg_el_merge(ac->module, local, remote,
- attrs[i]);
- if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE) {
- } else if (ret) {
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-/* Mapping search results
- * ====================== */
-
-/* Map a search result back into the local partition. */
-static int map_reply_remote(struct map_context *ac, struct ldb_reply *ares)
-{
- struct ldb_message *msg;
- struct ldb_dn *dn;
- int ret;
-
- /* There is no result message, skip */
- if (ares->type != LDB_REPLY_ENTRY) {
- return 0;
- }
-
- /* Create a new result message */
- msg = ldb_msg_new(ares);
- if (msg == NULL) {
- map_oom(ac->module);
- return -1;
- }
-
- /* Merge remote message into new message */
- ret = ldb_msg_merge_remote(ac, msg, ares->message);
- if (ret) {
- talloc_free(msg);
- return ret;
- }
-
- /* Create corresponding local DN */
- dn = ldb_dn_map_rebase_remote(ac->module, msg, ares->message->dn);
- if (dn == NULL) {
- talloc_free(msg);
- return -1;
- }
- msg->dn = dn;
-
- /* Store new message with new DN as the result */
- talloc_free(ares->message);
- ares->message = msg;
-
- return 0;
-}
-
-/* Mapping parse trees
- * =================== */
-
-/* Check whether a parse tree can safely be split in two. */
-static bool ldb_parse_tree_check_splittable(const struct ldb_parse_tree *tree)
-{
- const struct ldb_parse_tree *subtree = tree;
- bool negate = false;
-
- while (subtree) {
- switch (subtree->operation) {
- case LDB_OP_NOT:
- negate = !negate;
- subtree = subtree->u.isnot.child;
- continue;
-
- case LDB_OP_AND:
- return !negate; /* if negate: False */
-
- case LDB_OP_OR:
- return negate; /* if negate: True */
-
- default:
- return true; /* simple parse tree */
- }
- }
-
- return true; /* no parse tree */
-}
-
-/* Collect a list of attributes required to match a given parse tree. */
-static int ldb_parse_tree_collect_attrs(struct ldb_module *module, void *mem_ctx, const char ***attrs, const struct ldb_parse_tree *tree)
-{
- const char **new_attrs;
- unsigned int i;
- int ret;
-
- if (tree == NULL) {
- return 0;
- }
-
- switch (tree->operation) {
- case LDB_OP_OR:
- case LDB_OP_AND: /* attributes stored in list of subtrees */
- for (i = 0; i < tree->u.list.num_elements; i++) {
- ret = ldb_parse_tree_collect_attrs(module, mem_ctx,
- attrs, tree->u.list.elements[i]);
- if (ret) {
- return ret;
- }
- }
- return 0;
-
- case LDB_OP_NOT: /* attributes stored in single subtree */
- return ldb_parse_tree_collect_attrs(module, mem_ctx, attrs, tree->u.isnot.child);
-
- default: /* single attribute in tree */
- new_attrs = ldb_attr_list_copy_add(mem_ctx, *attrs, tree->u.equality.attr);
- talloc_free(*attrs);
- *attrs = new_attrs;
- return 0;
- }
-}
-
-static int map_subtree_select_local(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree);
-
-/* Select a negated subtree that queries attributes in the local partition */
-static int map_subtree_select_local_not(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree)
-{
- struct ldb_parse_tree *child;
- int ret;
-
- /* Prepare new tree */
- *new = talloc_memdup(mem_ctx, tree, sizeof(struct ldb_parse_tree));
- if (*new == NULL) {
- map_oom(module);
- return -1;
- }
-
- /* Generate new subtree */
- ret = map_subtree_select_local(module, *new, &child, tree->u.isnot.child);
- if (ret) {
- talloc_free(*new);
- return ret;
- }
-
- /* Prune tree without subtree */
- if (child == NULL) {
- talloc_free(*new);
- *new = NULL;
- return 0;
- }
-
- (*new)->u.isnot.child = child;
-
- return ret;
-}
-
-/* Select a list of subtrees that query attributes in the local partition */
-static int map_subtree_select_local_list(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree)
-{
- unsigned int i, j;
- int ret=0;
-
- /* Prepare new tree */
- *new = talloc_memdup(mem_ctx, tree, sizeof(struct ldb_parse_tree));
- if (*new == NULL) {
- map_oom(module);
- return -1;
- }
-
- /* Prepare list of subtrees */
- (*new)->u.list.num_elements = 0;
- (*new)->u.list.elements = talloc_array(*new, struct ldb_parse_tree *, tree->u.list.num_elements);
- if ((*new)->u.list.elements == NULL) {
- map_oom(module);
- talloc_free(*new);
- return -1;
- }
-
- /* Generate new list of subtrees */
- j = 0;
- for (i = 0; i < tree->u.list.num_elements; i++) {
- struct ldb_parse_tree *child;
- ret = map_subtree_select_local(module, *new, &child, tree->u.list.elements[i]);
- if (ret) {
- talloc_free(*new);
- return ret;
- }
-
- if (child) {
- (*new)->u.list.elements[j] = child;
- j++;
- }
- }
-
- /* Prune tree without subtrees */
- if (j == 0) {
- talloc_free(*new);
- *new = NULL;
- return 0;
- }
-
- /* Fix subtree list size */
- (*new)->u.list.num_elements = j;
- (*new)->u.list.elements = talloc_realloc(*new, (*new)->u.list.elements, struct ldb_parse_tree *, (*new)->u.list.num_elements);
-
- return ret;
-}
-
-/* Select a simple subtree that queries attributes in the local partition */
-static int map_subtree_select_local_simple(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree)
-{
- /* Prepare new tree */
- *new = talloc_memdup(mem_ctx, tree, sizeof(struct ldb_parse_tree));
- if (*new == NULL) {
- map_oom(module);
- return -1;
- }
-
- return 0;
-}
-
-/* Select subtrees that query attributes in the local partition */
-static int map_subtree_select_local(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree)
-{
- const struct ldb_map_context *data = map_get_context(module);
-
- if (tree == NULL) {
- return 0;
- }
-
- if (tree->operation == LDB_OP_NOT) {
- return map_subtree_select_local_not(module, mem_ctx, new, tree);
- }
-
- if (tree->operation == LDB_OP_AND || tree->operation == LDB_OP_OR) {
- return map_subtree_select_local_list(module, mem_ctx, new, tree);
- }
-
- if (map_attr_check_remote(data, tree->u.equality.attr)) {
- *new = NULL;
- return 0;
- }
-
- return map_subtree_select_local_simple(module, mem_ctx, new, tree);
-}
-
-static int map_subtree_collect_remote(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree);
-
-/* Collect a negated subtree that queries attributes in the remote partition */
-static int map_subtree_collect_remote_not(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree)
-{
- struct ldb_parse_tree *child;
- int ret;
-
- /* Prepare new tree */
- *new = talloc_memdup(mem_ctx, tree, sizeof(struct ldb_parse_tree));
- if (*new == NULL) {
- map_oom(module);
- return -1;
- }
-
- /* Generate new subtree */
- ret = map_subtree_collect_remote(module, *new, &child, tree->u.isnot.child);
- if (ret) {
- talloc_free(*new);
- return ret;
- }
-
- /* Prune tree without subtree */
- if (child == NULL) {
- talloc_free(*new);
- *new = NULL;
- return 0;
- }
-
- (*new)->u.isnot.child = child;
-
- return ret;
-}
-
-/* Collect a list of subtrees that query attributes in the remote partition */
-static int map_subtree_collect_remote_list(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree)
-{
- unsigned int i, j;
- int ret=0;
-
- /* Prepare new tree */
- *new = talloc_memdup(mem_ctx, tree, sizeof(struct ldb_parse_tree));
- if (*new == NULL) {
- map_oom(module);
- return -1;
- }
-
- /* Prepare list of subtrees */
- (*new)->u.list.num_elements = 0;
- (*new)->u.list.elements = talloc_array(*new, struct ldb_parse_tree *, tree->u.list.num_elements);
- if ((*new)->u.list.elements == NULL) {
- map_oom(module);
- talloc_free(*new);
- return -1;
- }
-
- /* Generate new list of subtrees */
- j = 0;
- for (i = 0; i < tree->u.list.num_elements; i++) {
- struct ldb_parse_tree *child;
- ret = map_subtree_collect_remote(module, *new, &child, tree->u.list.elements[i]);
- if (ret) {
- talloc_free(*new);
- return ret;
- }
-
- if (child) {
- (*new)->u.list.elements[j] = child;
- j++;
- }
- }
-
- /* Prune tree without subtrees */
- if (j == 0) {
- talloc_free(*new);
- *new = NULL;
- return 0;
- }
-
- /* Fix subtree list size */
- (*new)->u.list.num_elements = j;
- (*new)->u.list.elements = talloc_realloc(*new, (*new)->u.list.elements, struct ldb_parse_tree *, (*new)->u.list.num_elements);
-
- return ret;
-}
-
-/* Collect a simple subtree that queries attributes in the remote partition */
-int map_subtree_collect_remote_simple(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree, const struct ldb_map_attribute *map)
-{
- const char *attr;
-
- /* Prepare new tree */
- *new = talloc(mem_ctx, struct ldb_parse_tree);
- if (*new == NULL) {
- map_oom(module);
- return -1;
- }
- **new = *tree;
-
- if (map->type == LDB_MAP_KEEP) {
- /* Nothing to do here */
- return 0;
- }
-
- /* Store attribute and value in new tree */
- switch (tree->operation) {
- case LDB_OP_PRESENT:
- attr = map_attr_map_local(*new, map, tree->u.present.attr);
- (*new)->u.present.attr = attr;
- break;
- case LDB_OP_SUBSTRING:
- {
- attr = map_attr_map_local(*new, map, tree->u.substring.attr);
- (*new)->u.substring.attr = attr;
- break;
- }
- case LDB_OP_EQUALITY:
- attr = map_attr_map_local(*new, map, tree->u.equality.attr);
- (*new)->u.equality.attr = attr;
- break;
- case LDB_OP_LESS:
- case LDB_OP_GREATER:
- case LDB_OP_APPROX:
- attr = map_attr_map_local(*new, map, tree->u.comparison.attr);
- (*new)->u.comparison.attr = attr;
- break;
- case LDB_OP_EXTENDED:
- attr = map_attr_map_local(*new, map, tree->u.extended.attr);
- (*new)->u.extended.attr = attr;
- break;
- default: /* unknown kind of simple subtree */
- talloc_free(*new);
- return -1;
- }
-
- if (attr == NULL) {
- talloc_free(*new);
- *new = NULL;
- return 0;
- }
-
- if (map->type == LDB_MAP_RENAME) {
- /* Nothing more to do here, the attribute has been renamed */
- return 0;
- }
-
- /* Store attribute and value in new tree */
- switch (tree->operation) {
- case LDB_OP_PRESENT:
- break;
- case LDB_OP_SUBSTRING:
- {
- int i;
- /* Map value */
- (*new)->u.substring.chunks = NULL;
- for (i=0; tree->u.substring.chunks[i]; i++) {
- (*new)->u.substring.chunks = talloc_realloc(*new, (*new)->u.substring.chunks, struct ldb_val *, i+2);
- if (!(*new)->u.substring.chunks) {
- talloc_free(*new);
- *new = NULL;
- return 0;
- }
- (*new)->u.substring.chunks[i] = talloc(*new, struct ldb_val);
- if (!(*new)->u.substring.chunks[i]) {
- talloc_free(*new);
- *new = NULL;
- return 0;
- }
- *(*new)->u.substring.chunks[i] = ldb_val_map_local(module, *new, map, tree->u.substring.chunks[i]);
- (*new)->u.substring.chunks[i+1] = NULL;
- }
- break;
- }
- case LDB_OP_EQUALITY:
- (*new)->u.equality.value = ldb_val_map_local(module, *new, map, &tree->u.equality.value);
- break;
- case LDB_OP_LESS:
- case LDB_OP_GREATER:
- case LDB_OP_APPROX:
- (*new)->u.comparison.value = ldb_val_map_local(module, *new, map, &tree->u.comparison.value);
- break;
- case LDB_OP_EXTENDED:
- (*new)->u.extended.value = ldb_val_map_local(module, *new, map, &tree->u.extended.value);
- (*new)->u.extended.rule_id = talloc_strdup(*new, tree->u.extended.rule_id);
- break;
- default: /* unknown kind of simple subtree */
- talloc_free(*new);
- return -1;
- }
-
- return 0;
-}
-
-/* Collect subtrees that query attributes in the remote partition */
-static int map_subtree_collect_remote(struct ldb_module *module, void *mem_ctx, struct ldb_parse_tree **new, const struct ldb_parse_tree *tree)
-{
- const struct ldb_map_context *data = map_get_context(module);
- const struct ldb_map_attribute *map;
- struct ldb_context *ldb;
-
- ldb = ldb_module_get_ctx(module);
-
- if (tree == NULL) {
- return 0;
- }
-
- if (tree->operation == LDB_OP_NOT) {
- return map_subtree_collect_remote_not(module, mem_ctx, new, tree);
- }
-
- if ((tree->operation == LDB_OP_AND) || (tree->operation == LDB_OP_OR)) {
- return map_subtree_collect_remote_list(module, mem_ctx, new, tree);
- }
-
- if (!map_attr_check_remote(data, tree->u.equality.attr)) {
- *new = NULL;
- return 0;
- }
-
- map = map_attr_find_local(data, tree->u.equality.attr);
- if (map->convert_operator) {
- return map->convert_operator(module, mem_ctx, new, tree);
- }
-
- if (map->type == LDB_MAP_GENERATE) {
- ldb_debug(ldb, LDB_DEBUG_WARNING, "ldb_map: "
- "Skipping attribute '%s': "
- "'convert_operator' not set",
- tree->u.equality.attr);
- *new = NULL;
- return 0;
- }
-
- return map_subtree_collect_remote_simple(module, mem_ctx, new, tree, map);
-}
-
-/* Split subtrees that query attributes in the local partition from
- * those that query the remote partition. */
-static int ldb_parse_tree_partition(struct ldb_module *module,
- void *mem_ctx,
- struct ldb_parse_tree **local_tree,
- struct ldb_parse_tree **remote_tree,
- const struct ldb_parse_tree *tree)
-{
- int ret;
-
- *local_tree = NULL;
- *remote_tree = NULL;
-
- /* No original tree */
- if (tree == NULL) {
- return 0;
- }
-
- /* Generate local tree */
- ret = map_subtree_select_local(module, mem_ctx, local_tree, tree);
- if (ret) {
- return ret;
- }
-
- /* Generate remote tree */
- ret = map_subtree_collect_remote(module, mem_ctx, remote_tree, tree);
- if (ret) {
- talloc_free(*local_tree);
- return ret;
- }
-
- return 0;
-}
-
-/* Collect a list of attributes required either explicitly from a
- * given list or implicitly from a given parse tree; split the
- * collected list into local and remote parts. */
-static int map_attrs_collect_and_partition(struct ldb_module *module, struct map_context *ac,
- const char * const *search_attrs,
- const struct ldb_parse_tree *tree)
-{
- void *tmp_ctx;
- const char **tree_attrs;
- const char **remote_attrs;
- const char **local_attrs;
- int ret;
-
- /* There is no tree, just partition the searched attributes */
- if (tree == NULL) {
- ret = map_attrs_partition(module, ac,
- &local_attrs, &remote_attrs, search_attrs);
- if (ret == 0) {
- ac->local_attrs = local_attrs;
- ac->remote_attrs = remote_attrs;
- ac->all_attrs = search_attrs;
- }
- return ret;
- }
-
- /* Create context for temporary memory */
- tmp_ctx = talloc_new(ac);
- if (tmp_ctx == NULL) {
- goto oom;
- }
-
- /* Prepare list of attributes from tree */
- tree_attrs = talloc_array(tmp_ctx, const char *, 1);
- if (tree_attrs == NULL) {
- talloc_free(tmp_ctx);
- goto oom;
- }
- tree_attrs[0] = NULL;
-
- /* Collect attributes from tree */
- ret = ldb_parse_tree_collect_attrs(module, tmp_ctx, &tree_attrs, tree);
- if (ret) {
- goto done;
- }
-
- /* Merge attributes from search operation */
- ret = map_attrs_merge(module, tmp_ctx, &tree_attrs, search_attrs);
- if (ret) {
- goto done;
- }
-
- /* Split local from remote attributes */
- ret = map_attrs_partition(module, ac, &local_attrs,
- &remote_attrs, tree_attrs);
-
- if (ret == 0) {
- ac->local_attrs = local_attrs;
- ac->remote_attrs = remote_attrs;
- talloc_steal(ac, tree_attrs);
- ac->all_attrs = tree_attrs;
- }
-done:
- /* Free temporary memory */
- talloc_free(tmp_ctx);
- return ret;
-
-oom:
- map_oom(module);
- return -1;
-}
-
-
-/* Outbound requests: search
- * ========================= */
-
-static int map_remote_search_callback(struct ldb_request *req,
- struct ldb_reply *ares);
-static int map_local_merge_callback(struct ldb_request *req,
- struct ldb_reply *ares);
-static int map_search_local(struct map_context *ac);
-
-static int map_save_entry(struct map_context *ac, struct ldb_reply *ares)
-{
- struct map_reply *mr;
-
- mr = talloc_zero(ac, struct map_reply);
- if (mr == NULL) {
- map_oom(ac->module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- mr->remote = talloc_steal(mr, ares);
- if (ac->r_current) {
- ac->r_current->next = mr;
- } else {
- /* first entry */
- ac->r_list = mr;
- }
- ac->r_current = mr;
-
- return LDB_SUCCESS;
-}
-
-/* Pass a merged search result up the callback chain. */
-int map_return_entry(struct map_context *ac, struct ldb_reply *ares)
-{
- struct ldb_message_element *el;
- const char * const *attrs;
- struct ldb_context *ldb;
- unsigned int i;
- int ret;
- bool matched;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- /* Merged result doesn't match original query, skip */
- ret = ldb_match_msg_error(ldb, ares->message,
- ac->req->op.search.tree,
- ac->req->op.search.base,
- ac->req->op.search.scope,
- &matched);
- if (ret != LDB_SUCCESS) return ret;
- if (!matched) {
- ldb_debug(ldb, LDB_DEBUG_TRACE, "ldb_map: "
- "Skipping record '%s': "
- "doesn't match original search",
- ldb_dn_get_linearized(ares->message->dn));
- return LDB_SUCCESS;
- }
-
- /* Limit result to requested attrs */
- if (ac->req->op.search.attrs &&
- (! ldb_attr_in_list(ac->req->op.search.attrs, "*"))) {
-
- attrs = ac->req->op.search.attrs;
- i = 0;
-
- while (i < ares->message->num_elements) {
-
- el = &ares->message->elements[i];
- if ( ! ldb_attr_in_list(attrs, el->name)) {
- ldb_msg_remove_element(ares->message, el);
- } else {
- i++;
- }
- }
- }
-
- return ldb_module_send_entry(ac->req, ares->message, ares->controls);
-}
-
-/* Search a record. */
-int ldb_map_search(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_parse_tree *remote_tree;
- struct ldb_parse_tree *local_tree;
- struct ldb_request *remote_req;
- struct ldb_context *ldb;
- struct map_context *ac;
- int ret;
-
- const char *wildcard[] = { "*", NULL };
- const char * const *attrs;
-
- ldb = ldb_module_get_ctx(module);
-
- /* if we're not yet initialized, go to the next module */
- if (!ldb_module_get_private(module))
- return ldb_next_request(module, req);
-
- /* Do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.search.base)) {
- return ldb_next_request(module, req);
- }
-
- /* No mapping requested, skip to next module */
- if ((req->op.search.base) && (!ldb_dn_check_local(module, req->op.search.base))) {
- return ldb_next_request(module, req);
- }
-
- /* TODO: How can we be sure about which partition we are
- * targetting when there is no search base? */
-
- /* Prepare context and handle */
- ac = map_init_context(module, req);
- if (ac == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* It is easier to deal with the two different ways of
- * expressing the wildcard in the same codepath */
- attrs = req->op.search.attrs;
- if (attrs == NULL) {
- attrs = wildcard;
- }
-
- /* Split local from remote attrs */
- ret = map_attrs_collect_and_partition(module, ac,
- attrs, req->op.search.tree);
- if (ret) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Split local from remote tree */
- ret = ldb_parse_tree_partition(module, ac,
- &local_tree, &remote_tree,
- req->op.search.tree);
- if (ret) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (((local_tree != NULL) && (remote_tree != NULL)) &&
- (!ldb_parse_tree_check_splittable(req->op.search.tree))) {
- /* The query can't safely be split, enumerate the remote partition */
- local_tree = NULL;
- remote_tree = NULL;
- }
-
- if (local_tree == NULL) {
- /* Construct default local parse tree */
- local_tree = talloc_zero(ac, struct ldb_parse_tree);
- if (local_tree == NULL) {
- map_oom(ac->module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- local_tree->operation = LDB_OP_PRESENT;
- local_tree->u.present.attr = talloc_strdup(local_tree, IS_MAPPED);
- }
- if (remote_tree == NULL) {
- /* Construct default remote parse tree */
- remote_tree = ldb_parse_tree(ac, NULL);
- if (remote_tree == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- ac->local_tree = local_tree;
-
- /* Prepare the remote operation */
- ret = ldb_build_search_req_ex(&remote_req, ldb, ac,
- req->op.search.base,
- req->op.search.scope,
- remote_tree,
- ac->remote_attrs,
- req->controls,
- ac, map_remote_search_callback,
- req);
- LDB_REQ_SET_LOCATION(remote_req);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_remote_request(module, remote_req);
-}
-
-/* Now, search the local part of a remote search result. */
-static int map_remote_search_callback(struct ldb_request *req,
- struct ldb_reply *ares)
-{
- struct map_context *ac;
- int ret;
-
- ac = talloc_get_type(req->context, struct map_context);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- switch (ares->type) {
- case LDB_REPLY_REFERRAL:
-
- /* ignore referrals */
- talloc_free(ares);
- return LDB_SUCCESS;
-
- case LDB_REPLY_ENTRY:
-
- /* Map result record into a local message */
- ret = map_reply_remote(ac, ares);
- if (ret) {
- talloc_free(ares);
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- /* if we have no local db, then we can just return the reply to
- * the upper layer, otherwise we must save it and process it
- * when all replies ahve been gathered */
- if ( ! map_check_local_db(ac->module)) {
- ret = map_return_entry(ac, ares);
- } else {
- ret = map_save_entry(ac,ares);
- }
-
- if (ret != LDB_SUCCESS) {
- talloc_free(ares);
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- break;
-
- case LDB_REPLY_DONE:
-
- if ( ! map_check_local_db(ac->module)) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, LDB_SUCCESS);
- }
-
- /* reset the pointer to the start of the list */
- ac->r_current = ac->r_list;
-
- /* no entry just return */
- if (ac->r_current == NULL) {
- ret = ldb_module_done(ac->req, ares->controls,
- ares->response, LDB_SUCCESS);
- talloc_free(ares);
- return ret;
- }
-
- ac->remote_done_ares = talloc_steal(ac, ares);
-
- ret = map_search_local(ac);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL, ret);
- }
- }
-
- return LDB_SUCCESS;
-}
-
-static int map_search_local(struct map_context *ac)
-{
- struct ldb_request *search_req;
-
- if (ac->r_current == NULL || ac->r_current->remote == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* Prepare local search request */
- /* TODO: use GUIDs here instead? */
- search_req = map_search_base_req(ac,
- ac->r_current->remote->message->dn,
- NULL, NULL,
- ac, map_local_merge_callback);
- if (search_req == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_request(ac->module, search_req);
-}
-
-/* Merge the remote and local parts of a search result. */
-int map_local_merge_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct ldb_context *ldb;
- struct map_context *ac;
- int ret;
-
- ac = talloc_get_type(req->context, struct map_context);
- ldb = ldb_module_get_ctx(ac->module);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- switch (ares->type) {
- case LDB_REPLY_ENTRY:
- /* We have already found a local record */
- if (ac->r_current->local) {
- talloc_free(ares);
- ldb_set_errstring(ldb, "ldb_map: Too many results!");
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- /* Store local result */
- ac->r_current->local = talloc_steal(ac->r_current, ares);
-
- break;
-
- case LDB_REPLY_REFERRAL:
- /* ignore referrals */
- talloc_free(ares);
- break;
-
- case LDB_REPLY_DONE:
- /* We don't need the local 'ares', but we will use the remote one from below */
- talloc_free(ares);
-
- /* No local record found, map and send remote record */
- if (ac->r_current->local != NULL) {
- /* Merge remote into local message */
- ret = ldb_msg_merge_local(ac->module,
- ac->r_current->local->message,
- ac->r_current->remote->message);
- if (ret == LDB_SUCCESS) {
- ret = map_return_entry(ac, ac->r_current->local);
- }
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- } else {
- ret = map_return_entry(ac, ac->r_current->remote);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req,
- NULL, NULL, ret);
- }
- }
-
- if (ac->r_current->next != NULL) {
- ac->r_current = ac->r_current->next;
- if (ac->r_current->remote->type == LDB_REPLY_ENTRY) {
- ret = map_search_local(ac);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req,
- NULL, NULL, ret);
- }
- break;
- }
- }
-
- /* ok we are done with all search, finally it is time to
- * finish operations for this module */
- return ldb_module_done(ac->req,
- ac->remote_done_ares->controls,
- ac->remote_done_ares->response,
- ac->remote_done_ares->error);
- }
-
- return LDB_SUCCESS;
-}
diff --git a/source4/lib/ldb/ldb_map/ldb_map_private.h b/source4/lib/ldb/ldb_map/ldb_map_private.h
deleted file mode 100644
index 7faaa99708..0000000000
--- a/source4/lib/ldb/ldb_map/ldb_map_private.h
+++ /dev/null
@@ -1,96 +0,0 @@
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-
-/* A handy macro to report Out of Memory conditions */
-#define map_oom(module) ldb_set_errstring(ldb_module_get_ctx(module), talloc_asprintf(module, "Out of Memory"));
-
-/* The type of search callback functions */
-typedef int (*ldb_map_callback_t)(struct ldb_request *, struct ldb_reply *);
-
-/* The special DN from which the local and remote base DNs are fetched */
-#define MAP_DN_NAME "@MAP"
-#define MAP_DN_FROM "@FROM"
-#define MAP_DN_TO "@TO"
-
-/* Private data structures
- * ======================= */
-
-struct map_reply {
- struct map_reply *next;
- struct ldb_reply *remote;
- struct ldb_reply *local;
-};
-
-/* Context data for mapped requests */
-struct map_context {
-
- struct ldb_module *module;
- struct ldb_request *req;
-
- struct ldb_dn *local_dn;
- const struct ldb_parse_tree *local_tree;
- const char * const *local_attrs;
- const char * const *remote_attrs;
- const char * const *all_attrs;
-
- struct ldb_message *local_msg;
- struct ldb_request *remote_req;
-
- struct map_reply *r_list;
- struct map_reply *r_current;
-
- /* The response continaing any controls the remote server gave */
- struct ldb_reply *remote_done_ares;
-};
-
-/* Common operations
- * ================= */
-
-/* The following definitions come from lib/ldb/modules/ldb_map.c */
-const struct ldb_map_context *map_get_context(struct ldb_module *module);
-struct map_context *map_init_context(struct ldb_module *module,
- struct ldb_request *req);
-
-int ldb_next_remote_request(struct ldb_module *module, struct ldb_request *request);
-
-bool map_check_local_db(struct ldb_module *module);
-bool map_attr_check_remote(const struct ldb_map_context *data, const char *attr);
-bool ldb_dn_check_local(struct ldb_module *module, struct ldb_dn *dn);
-
-const struct ldb_map_attribute *map_attr_find_local(const struct ldb_map_context *data, const char *name);
-const struct ldb_map_attribute *map_attr_find_remote(const struct ldb_map_context *data, const char *name);
-
-const char *map_attr_map_local(void *mem_ctx, const struct ldb_map_attribute *map, const char *attr);
-const char *map_attr_map_remote(void *mem_ctx, const struct ldb_map_attribute *map, const char *attr);
-int map_attrs_merge(struct ldb_module *module, void *mem_ctx, const char ***attrs, const char * const *more_attrs);
-
-struct ldb_val ldb_val_map_local(struct ldb_module *module, void *mem_ctx, const struct ldb_map_attribute *map, const struct ldb_val *val);
-struct ldb_val ldb_val_map_remote(struct ldb_module *module, void *mem_ctx, const struct ldb_map_attribute *map, const struct ldb_val *val);
-
-struct ldb_dn *ldb_dn_map_local(struct ldb_module *module, void *mem_ctx, struct ldb_dn *dn);
-struct ldb_dn *ldb_dn_map_remote(struct ldb_module *module, void *mem_ctx, struct ldb_dn *dn);
-struct ldb_dn *ldb_dn_map_rebase_remote(struct ldb_module *module, void *mem_ctx, struct ldb_dn *dn);
-
-struct ldb_request *map_search_base_req(struct map_context *ac,
- struct ldb_dn *dn,
- const char * const *attrs,
- const struct ldb_parse_tree *tree,
- void *context,
- ldb_map_callback_t callback);
-struct ldb_request *map_build_fixup_req(struct map_context *ac,
- struct ldb_dn *olddn,
- struct ldb_dn *newdn,
- void *context,
- ldb_map_callback_t callback);
-int map_subtree_collect_remote_simple(struct ldb_module *module, void *mem_ctx,
- struct ldb_parse_tree **new,
- const struct ldb_parse_tree *tree,
- const struct ldb_map_attribute *map);
-int map_return_fatal_error(struct ldb_request *req,
- struct ldb_reply *ares);
-int map_return_normal_error(struct ldb_request *req,
- struct ldb_reply *ares,
- int error);
-
-int map_return_entry(struct map_context *ac, struct ldb_reply *ares);
diff --git a/source4/lib/ldb/ldb_sqlite3/README b/source4/lib/ldb/ldb_sqlite3/README
deleted file mode 100644
index 6cda0a7759..0000000000
--- a/source4/lib/ldb/ldb_sqlite3/README
+++ /dev/null
@@ -1,7 +0,0 @@
-trees.ps contains an explanation of the Genealogical Representation of Trees
-in Databases which is being used in ldb_sqlite3. Note that we use fgID
-representation with 4 bytes per level, so we can represent 6.5E+08 subclasses
-of any object class. This should be adequate for our purposes. :-)
-
-The following document is the primary basis for the schema currently being
-used here: http://www.research.ibm.com/journal/sj/392/shi.html
diff --git a/source4/lib/ldb/ldb_sqlite3/base160.c b/source4/lib/ldb/ldb_sqlite3/base160.c
deleted file mode 100644
index 7ad39f7c2f..0000000000
--- a/source4/lib/ldb/ldb_sqlite3/base160.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- base160 code used by ldb_sqlite3
-
- Copyright (C) 2004 Derrell Lipman
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-
-/*
- * ldb_sqlite3_base160()
- *
- * Convert an integer value to a string containing the base 160 representation
- * of the integer. We always convert to a string representation that is 4
- * bytes in length, and we always null terminate.
- *
- * Parameters:
- * val --
- * The value to be converted
- *
- * result --
- * Buffer in which the result is to be placed
- *
- * Returns:
- * nothing
- */
-static unsigned char base160tab[161] =
-{
- 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , /* 0-9 */
- 58 , 59 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , /* : ; A-H */
- 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , /* I-R */
- 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 97 , 98 , /* S-Z , a-b */
- 99 , 100, 101, 102, 103, 104, 105, 106, 107, 108, /* c-l */
- 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, /* m-v */
- 119, 120, 121, 122, 160, 161, 162, 163, 164, 165, /* w-z, latin1 */
- 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, /* latin1 */
- 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, /* latin1 */
- 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, /* latin1 */
- 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, /* latin1 */
- 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, /* latin1 */
- 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, /* latin1 */
- 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, /* latin1 */
- 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, /* latin1 */
- 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, /* latin1 */
- '\0'
-};
-
-
-/*
- * lsqlite3_base160()
- *
- * Convert an unsigned long integer into a base160 representation of the
- * number.
- *
- * Parameters:
- * val --
- * value to be converted
- *
- * result --
- * character array, 5 bytes long, into which the base160 representation
- * will be placed. The result will be a four-digit representation of the
- * number (with leading zeros prepended as necessary), and null
- * terminated.
- *
- * Returns:
- * Nothing
- */
-void
-lsqlite3_base160(unsigned long val,
- unsigned char result[5])
-{
- int i;
-
- for (i = 3; i >= 0; i--) {
-
- result[i] = base160tab[val % 160];
- val /= 160;
- }
-
- result[4] = '\0';
-}
-
-
-/*
- * lsqlite3_base160Next()
- *
- * Retrieve the next-greater number in the base160 sequence for the terminal
- * tree node (the last four digits). Only one tree level (four digits) are
- * operated on.
- *
- * Parameters:
- * base160 -- a character array containing either an empty string (in which
- * case no operation is performed), or a string of base160 digits
- * with a length of a multiple of four digits.
- *
- * Upon return, the trailing four digits (one tree level) will
- * have been incremented by 1.
- *
- * Returns:
- * base160 -- the modified array
- */
-char *
-lsqlite3_base160Next(char base160[])
-{
- int i;
- int len;
- unsigned char * pTab;
- char * pBase160 = base160;
-
- /*
- * We need a minimum of four digits, and we will always get a multiple of
- * four digits.
- */
- if ((len = strlen(pBase160)) >= 4)
- {
- pBase160 += strlen(pBase160) - 1;
-
- /* We only carry through four digits: one level in the tree */
- for (i = 0; i < 4; i++) {
-
- /* What base160 value does this digit have? */
- pTab = strchr(base160tab, *pBase160);
-
- /* Is there a carry? */
- if (pTab < base160tab + sizeof(base160tab) - 1) {
-
- /* Nope. Just increment this value and we're done. */
- *pBase160 = *++pTab;
- break;
- } else {
-
- /*
- * There's a carry. This value gets base160tab[0], we
- * decrement the buffer pointer to get the next higher-order
- * digit, and continue in the loop.
- */
- *pBase160-- = base160tab[0];
- }
- }
- }
-
- return base160;
-}
diff --git a/source4/lib/ldb/ldb_sqlite3/ldb_sqlite3.c b/source4/lib/ldb/ldb_sqlite3/ldb_sqlite3.c
deleted file mode 100644
index 223868a6c0..0000000000
--- a/source4/lib/ldb/ldb_sqlite3/ldb_sqlite3.c
+++ /dev/null
@@ -1,1940 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Derrell Lipman 2005
- Copyright (C) Simo Sorce 2005-2009
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb sqlite3 backend
- *
- * Description: core files for SQLITE3 backend
- *
- * Author: Derrell Lipman (based on Andrew Tridgell's LDAP backend)
- */
-
-#include "ldb_module.h"
-
-#include <sqlite3.h>
-
-struct lsqlite3_private {
- int trans_count;
- char **options;
- sqlite3 *sqlite;
-};
-
-struct lsql_context {
- struct ldb_module *module;
- struct ldb_request *req;
-
- /* search stuff */
- long long current_eid;
- const char * const * attrs;
- struct ldb_reply *ares;
-
- bool callback_failed;
- struct tevent_timer *timeout_event;
-};
-
-/*
- * Macros used throughout
- */
-
-#ifndef FALSE
-# define FALSE (0)
-# define TRUE (! FALSE)
-#endif
-
-#define RESULT_ATTR_TABLE "temp_result_attrs"
-
-
-/* for testing, define to nothing, (create non-temporary table) */
-#define TEMPTAB "TEMPORARY"
-
-/*
- * Static variables
- */
-sqlite3_stmt * stmtGetEID = NULL;
-
-static char *lsqlite3_tprintf(TALLOC_CTX *mem_ctx, const char *fmt, ...)
-{
- char *str, *ret;
- va_list ap;
-
- va_start(ap, fmt);
- str = sqlite3_vmprintf(fmt, ap);
- va_end(ap);
-
- if (str == NULL) return NULL;
-
- ret = talloc_strdup(mem_ctx, str);
- if (ret == NULL) {
- sqlite3_free(str);
- return NULL;
- }
-
- sqlite3_free(str);
- return ret;
-}
-
-static char base160tab[161] = {
- 48 ,49 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 , /* 0-9 */
- 58 ,59 ,65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 , /* : ; A-H */
- 73 ,74 ,75 ,76 ,77 ,78 ,79 ,80 ,81 ,82 , /* I-R */
- 83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,97 ,98 , /* S-Z , a-b */
- 99 ,100,101,102,103,104,105,106,107,108, /* c-l */
- 109,110,111,112,113,114,115,116,117,118, /* m-v */
- 119,120,121,122,160,161,162,163,164,165, /* w-z, latin1 */
- 166,167,168,169,170,171,172,173,174,175, /* latin1 */
- 176,177,178,179,180,181,182,183,184,185, /* latin1 */
- 186,187,188,189,190,191,192,193,194,195, /* latin1 */
- 196,197,198,199,200,201,202,203,204,205, /* latin1 */
- 206,207,208,209,210,211,212,213,214,215, /* latin1 */
- 216,217,218,219,220,221,222,223,224,225, /* latin1 */
- 226,227,228,229,230,231,232,233,234,235, /* latin1 */
- 236,237,238,239,240,241,242,243,244,245, /* latin1 */
- 246,247,248,249,250,251,252,253,254,255, /* latin1 */
- '\0'
-};
-
-
-/*
- * base160()
- *
- * Convert an unsigned long integer into a base160 representation of the
- * number.
- *
- * Parameters:
- * val --
- * value to be converted
- *
- * result --
- * character array, 5 bytes long, into which the base160 representation
- * will be placed. The result will be a four-digit representation of the
- * number (with leading zeros prepended as necessary), and null
- * terminated.
- *
- * Returns:
- * Nothing
- */
-static void
-base160_sql(sqlite3_context * hContext,
- int argc,
- sqlite3_value ** argv)
-{
- int i;
- long long val;
- char result[5];
-
- val = sqlite3_value_int64(argv[0]);
-
- for (i = 3; i >= 0; i--) {
-
- result[i] = base160tab[val % 160];
- val /= 160;
- }
-
- result[4] = '\0';
-
- sqlite3_result_text(hContext, result, -1, SQLITE_TRANSIENT);
-}
-
-
-/*
- * base160next_sql()
- *
- * This function enhances sqlite by adding a "base160_next()" function which is
- * accessible via queries.
- *
- * Retrieve the next-greater number in the base160 sequence for the terminal
- * tree node (the last four digits). Only one tree level (four digits) is
- * operated on.
- *
- * Input:
- * A character string: either an empty string (in which case no operation is
- * performed), or a string of base160 digits with a length of a multiple of
- * four digits.
- *
- * Output:
- * Upon return, the trailing four digits (one tree level) will have been
- * incremented by 1.
- */
-static void
-base160next_sql(sqlite3_context * hContext,
- int argc,
- sqlite3_value ** argv)
-{
- int i;
- int len;
- char * pTab;
- char * pBase160 = strdup((const char *)sqlite3_value_text(argv[0]));
- char * pStart = pBase160;
-
- /*
- * We need a minimum of four digits, and we will always get a multiple
- * of four digits.
- */
- if (pBase160 != NULL &&
- (len = strlen(pBase160)) >= 4 &&
- len % 4 == 0) {
-
- if (pBase160 == NULL) {
-
- sqlite3_result_null(hContext);
- return;
- }
-
- pBase160 += strlen(pBase160) - 1;
-
- /* We only carry through four digits: one level in the tree */
- for (i = 0; i < 4; i++) {
-
- /* What base160 value does this digit have? */
- pTab = strchr(base160tab, *pBase160);
-
- /* Is there a carry? */
- if (pTab < base160tab + sizeof(base160tab) - 1) {
-
- /*
- * Nope. Just increment this value and we're
- * done.
- */
- *pBase160 = *++pTab;
- break;
- } else {
-
- /*
- * There's a carry. This value gets
- * base160tab[0], we decrement the buffer
- * pointer to get the next higher-order digit,
- * and continue in the loop.
- */
- *pBase160-- = base160tab[0];
- }
- }
-
- sqlite3_result_text(hContext,
- pStart,
- strlen(pStart),
- free);
- } else {
- sqlite3_result_value(hContext, argv[0]);
- if (pBase160 != NULL) {
- free(pBase160);
- }
- }
-}
-
-static char *parsetree_to_sql(struct ldb_module *module,
- void *mem_ctx,
- const struct ldb_parse_tree *t)
-{
- struct ldb_context *ldb;
- const struct ldb_schema_attribute *a;
- struct ldb_val value, subval;
- char *wild_card_string;
- char *child, *tmp;
- char *ret = NULL;
- char *attr;
- unsigned int i;
-
- ldb = ldb_module_get_ctx(module);
-
- switch(t->operation) {
- case LDB_OP_AND:
-
- tmp = parsetree_to_sql(module, mem_ctx, t->u.list.elements[0]);
- if (tmp == NULL) return NULL;
-
- for (i = 1; i < t->u.list.num_elements; i++) {
-
- child = parsetree_to_sql(module, mem_ctx, t->u.list.elements[i]);
- if (child == NULL) return NULL;
-
- tmp = talloc_asprintf_append(tmp, " INTERSECT %s ", child);
- if (tmp == NULL) return NULL;
- }
-
- ret = talloc_asprintf(mem_ctx, "SELECT * FROM ( %s )\n", tmp);
-
- return ret;
-
- case LDB_OP_OR:
-
- tmp = parsetree_to_sql(module, mem_ctx, t->u.list.elements[0]);
- if (tmp == NULL) return NULL;
-
- for (i = 1; i < t->u.list.num_elements; i++) {
-
- child = parsetree_to_sql(module, mem_ctx, t->u.list.elements[i]);
- if (child == NULL) return NULL;
-
- tmp = talloc_asprintf_append(tmp, " UNION %s ", child);
- if (tmp == NULL) return NULL;
- }
-
- return talloc_asprintf(mem_ctx, "SELECT * FROM ( %s ) ", tmp);
-
- case LDB_OP_NOT:
-
- child = parsetree_to_sql(module, mem_ctx, t->u.isnot.child);
- if (child == NULL) return NULL;
-
- return talloc_asprintf(mem_ctx,
- "SELECT eid FROM ldb_entry "
- "WHERE eid NOT IN ( %s ) ", child);
-
- case LDB_OP_EQUALITY:
- /*
- * For simple searches, we want to retrieve the list of EIDs that
- * match the criteria.
- */
- attr = ldb_attr_casefold(mem_ctx, t->u.equality.attr);
- if (attr == NULL) return NULL;
- a = ldb_schema_attribute_by_name(ldb, attr);
-
- /* Get a canonicalised copy of the data */
- a->syntax->canonicalise_fn(ldb, mem_ctx, &(t->u.equality.value), &value);
- if (value.data == NULL) {
- return NULL;
- }
-
- if (strcasecmp(t->u.equality.attr, "dn") == 0) {
- /* DN query is a special ldb case */
- const char *cdn = ldb_dn_get_casefold(
- ldb_dn_new(mem_ctx, ldb,
- (const char *)value.data));
-
- return lsqlite3_tprintf(mem_ctx,
- "SELECT eid FROM ldb_entry "
- "WHERE norm_dn = '%q'", cdn);
-
- } else {
- /* A normal query. */
- return lsqlite3_tprintf(mem_ctx,
- "SELECT eid FROM ldb_attribute_values "
- "WHERE norm_attr_name = '%q' "
- "AND norm_attr_value = '%q'",
- attr,
- value.data);
-
- }
-
- case LDB_OP_SUBSTRING:
-
- wild_card_string = talloc_strdup(mem_ctx,
- (t->u.substring.start_with_wildcard)?"*":"");
- if (wild_card_string == NULL) return NULL;
-
- for (i = 0; t->u.substring.chunks[i]; i++) {
- wild_card_string = talloc_asprintf_append(wild_card_string, "%s*",
- t->u.substring.chunks[i]->data);
- if (wild_card_string == NULL) return NULL;
- }
-
- if ( ! t->u.substring.end_with_wildcard ) {
- /* remove last wildcard */
- wild_card_string[strlen(wild_card_string) - 1] = '\0';
- }
-
- attr = ldb_attr_casefold(mem_ctx, t->u.substring.attr);
- if (attr == NULL) return NULL;
- a = ldb_schema_attribute_by_name(ldb, attr);
-
- subval.data = (void *)wild_card_string;
- subval.length = strlen(wild_card_string) + 1;
-
- /* Get a canonicalised copy of the data */
- a->syntax->canonicalise_fn(ldb, mem_ctx, &(subval), &value);
- if (value.data == NULL) {
- return NULL;
- }
-
- return lsqlite3_tprintf(mem_ctx,
- "SELECT eid FROM ldb_attribute_values "
- "WHERE norm_attr_name = '%q' "
- "AND norm_attr_value GLOB '%q'",
- attr,
- value.data);
-
- case LDB_OP_GREATER:
- attr = ldb_attr_casefold(mem_ctx, t->u.equality.attr);
- if (attr == NULL) return NULL;
- a = ldb_schema_attribute_by_name(ldb, attr);
-
- /* Get a canonicalised copy of the data */
- a->syntax->canonicalise_fn(ldb, mem_ctx, &(t->u.equality.value), &value);
- if (value.data == NULL) {
- return NULL;
- }
-
- return lsqlite3_tprintf(mem_ctx,
- "SELECT eid FROM ldb_attribute_values "
- "WHERE norm_attr_name = '%q' "
- "AND ldap_compare(norm_attr_value, '>=', '%q', '%q') ",
- attr,
- value.data,
- attr);
-
- case LDB_OP_LESS:
- attr = ldb_attr_casefold(mem_ctx, t->u.equality.attr);
- if (attr == NULL) return NULL;
- a = ldb_schema_attribute_by_name(ldb, attr);
-
- /* Get a canonicalised copy of the data */
- a->syntax->canonicalise_fn(ldb, mem_ctx, &(t->u.equality.value), &value);
- if (value.data == NULL) {
- return NULL;
- }
-
- return lsqlite3_tprintf(mem_ctx,
- "SELECT eid FROM ldb_attribute_values "
- "WHERE norm_attr_name = '%q' "
- "AND ldap_compare(norm_attr_value, '<=', '%q', '%q') ",
- attr,
- value.data,
- attr);
-
- case LDB_OP_PRESENT:
- if (strcasecmp(t->u.present.attr, "dn") == 0) {
- return talloc_strdup(mem_ctx, "SELECT eid FROM ldb_entry");
- }
-
- attr = ldb_attr_casefold(mem_ctx, t->u.present.attr);
- if (attr == NULL) return NULL;
-
- return lsqlite3_tprintf(mem_ctx,
- "SELECT eid FROM ldb_attribute_values "
- "WHERE norm_attr_name = '%q' ",
- attr);
-
- case LDB_OP_APPROX:
- attr = ldb_attr_casefold(mem_ctx, t->u.equality.attr);
- if (attr == NULL) return NULL;
- a = ldb_schema_attribute_by_name(ldb, attr);
-
- /* Get a canonicalised copy of the data */
- a->syntax->canonicalise_fn(ldb, mem_ctx, &(t->u.equality.value), &value);
- if (value.data == NULL) {
- return NULL;
- }
-
- return lsqlite3_tprintf(mem_ctx,
- "SELECT eid FROM ldb_attribute_values "
- "WHERE norm_attr_name = '%q' "
- "AND ldap_compare(norm_attr_value, '~%', 'q', '%q') ",
- attr,
- value.data,
- attr);
-
- case LDB_OP_EXTENDED:
-#warning "work out how to handle bitops"
- return NULL;
-
- default:
- break;
- };
-
- /* should never occur */
- abort();
- return NULL;
-}
-
-/*
- * query_int()
- *
- * This function is used for the common case of queries that return a single
- * integer value.
- *
- * NOTE: If more than one value is returned by the query, all but the first
- * one will be ignored.
- */
-static int
-query_int(const struct lsqlite3_private * lsqlite3,
- long long * pRet,
- const char * pSql,
- ...)
-{
- int ret;
- int bLoop;
- char * p;
- sqlite3_stmt * pStmt;
- va_list args;
-
- /* Begin access to variable argument list */
- va_start(args, pSql);
-
- /* Format the query */
- if ((p = sqlite3_vmprintf(pSql, args)) == NULL) {
- va_end(args);
- return SQLITE_NOMEM;
- }
-
- /*
- * Prepare and execute the SQL statement. Loop allows retrying on
- * certain errors, e.g. SQLITE_SCHEMA occurs if the schema changes,
- * requiring retrying the operation.
- */
- for (bLoop = TRUE; bLoop; ) {
-
- /* Compile the SQL statement into sqlite virtual machine */
- if ((ret = sqlite3_prepare(lsqlite3->sqlite,
- p,
- -1,
- &pStmt,
- NULL)) == SQLITE_SCHEMA) {
- if (stmtGetEID != NULL) {
- sqlite3_finalize(stmtGetEID);
- stmtGetEID = NULL;
- }
- continue;
- } else if (ret != SQLITE_OK) {
- break;
- }
-
- /* One row expected */
- if ((ret = sqlite3_step(pStmt)) == SQLITE_SCHEMA) {
- if (stmtGetEID != NULL) {
- sqlite3_finalize(stmtGetEID);
- stmtGetEID = NULL;
- }
- (void) sqlite3_finalize(pStmt);
- continue;
- } else if (ret != SQLITE_ROW) {
- (void) sqlite3_finalize(pStmt);
- break;
- }
-
- /* Get the value to be returned */
- *pRet = sqlite3_column_int64(pStmt, 0);
-
- /* Free the virtual machine */
- if ((ret = sqlite3_finalize(pStmt)) == SQLITE_SCHEMA) {
- if (stmtGetEID != NULL) {
- sqlite3_finalize(stmtGetEID);
- stmtGetEID = NULL;
- }
- continue;
- } else if (ret != SQLITE_OK) {
- (void) sqlite3_finalize(pStmt);
- break;
- }
-
- /*
- * Normal condition is only one time through loop. Loop is
- * rerun in error conditions, via "continue", above.
- */
- bLoop = FALSE;
- }
-
- /* All done with variable argument list */
- va_end(args);
-
-
- /* Free the memory we allocated for our query string */
- sqlite3_free(p);
-
- return ret;
-}
-
-/*
- * This is a bad hack to support ldap style comparisons within sqlite.
- * val is the attribute in the row currently under test
- * func is the desired test "<=" ">=" "~" ":"
- * cmp is the value to compare against (eg: "test")
- * attr is the attribute name the value of which we want to test
- */
-
-static void lsqlite3_compare(sqlite3_context *ctx, int argc,
- sqlite3_value **argv)
-{
- struct ldb_context *ldb = (struct ldb_context *)sqlite3_user_data(ctx);
- const char *val = (const char *)sqlite3_value_text(argv[0]);
- const char *func = (const char *)sqlite3_value_text(argv[1]);
- const char *cmp = (const char *)sqlite3_value_text(argv[2]);
- const char *attr = (const char *)sqlite3_value_text(argv[3]);
- const struct ldb_schema_attribute *a;
- struct ldb_val valX;
- struct ldb_val valY;
- int ret;
-
- switch (func[0]) {
- /* greater */
- case '>': /* >= */
- a = ldb_schema_attribute_by_name(ldb, attr);
- valX.data = (uint8_t *)cmp;
- valX.length = strlen(cmp);
- valY.data = (uint8_t *)val;
- valY.length = strlen(val);
- ret = a->syntax->comparison_fn(ldb, ldb, &valY, &valX);
- if (ret >= 0)
- sqlite3_result_int(ctx, 1);
- else
- sqlite3_result_int(ctx, 0);
- return;
-
- /* lesser */
- case '<': /* <= */
- a = ldb_schema_attribute_by_name(ldb, attr);
- valX.data = (uint8_t *)cmp;
- valX.length = strlen(cmp);
- valY.data = (uint8_t *)val;
- valY.length = strlen(val);
- ret = a->syntax->comparison_fn(ldb, ldb, &valY, &valX);
- if (ret <= 0)
- sqlite3_result_int(ctx, 1);
- else
- sqlite3_result_int(ctx, 0);
- return;
-
- /* approx */
- case '~':
- /* TODO */
- sqlite3_result_int(ctx, 0);
- return;
-
- /* bitops */
- case ':':
- /* TODO */
- sqlite3_result_int(ctx, 0);
- return;
-
- default:
- break;
- }
-
- sqlite3_result_error(ctx, "Value must start with a special operation char (<>~:)!", -1);
- return;
-}
-
-
-/* rename a record */
-static int lsqlite3_safe_rollback(sqlite3 *sqlite)
-{
- char *errmsg;
- int ret;
-
- /* execute */
- ret = sqlite3_exec(sqlite, "ROLLBACK;", NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- printf("lsqlite3_safe_rollback: Error: %s\n", errmsg);
- free(errmsg);
- }
- return -1;
- }
-
- return 0;
-}
-
-/* return an eid as result */
-static int lsqlite3_eid_callback(void *result, int col_num, char **cols, char **names)
-{
- long long *eid = (long long *)result;
-
- if (col_num != 1) return SQLITE_ABORT;
- if (strcasecmp(names[0], "eid") != 0) return SQLITE_ABORT;
-
- *eid = atoll(cols[0]);
- return SQLITE_OK;
-}
-
-/*
- * add a single set of ldap message values to a ldb_message
- */
-static int lsqlite3_search_callback(void *result, int col_num, char **cols, char **names)
-{
- struct ldb_context *ldb;
- struct lsql_context *ac;
- struct ldb_message *msg;
- long long eid;
- unsigned int i;
- int ret;
-
- ac = talloc_get_type(result, struct lsql_context);
- ldb = ldb_module_get_ctx(ac->module);
-
- /* eid, dn, attr_name, attr_value */
- if (col_num != 4) return SQLITE_ABORT;
-
- eid = atoll(cols[0]);
-
- if (ac->ares) {
- msg = ac->ares->message;
- }
-
- if (eid != ac->current_eid) { /* here begin a new entry */
-
- /* call the async callback for the last entry
- * except the first time */
- if (ac->current_eid != 0) {
- ret = ldb_msg_normalize(ldb, ac->req, msg, &msg);
- if (ret != LDB_SUCCESS) {
- return SQLITE_ABORT;
- }
-
- ret = ldb_module_send_entry(ac->req, msg, NULL);
- if (ret != LDB_SUCCESS) {
- ac->callback_failed = true;
- /* free msg object */
- TALLOC_FREE(msg);
- return SQLITE_ABORT;
- }
-
- /* free msg object */
- TALLOC_FREE(msg);
- }
-
- /* start over */
- ac->ares = talloc_zero(ac, struct ldb_reply);
- if (!ac->ares) return SQLITE_ABORT;
-
- msg = ldb_msg_new(ac->ares);
- if (!msg) return SQLITE_ABORT;
-
- ac->ares->type = LDB_REPLY_ENTRY;
- ac->current_eid = eid;
- }
-
- if (msg->dn == NULL) {
- msg->dn = ldb_dn_new(msg, ldb, cols[1]);
- if (msg->dn == NULL)
- return SQLITE_ABORT;
- }
-
- if (ac->attrs) {
- int found = 0;
- for (i = 0; ac->attrs[i]; i++) {
- if (strcasecmp(cols[2], ac->attrs[i]) == 0) {
- found = 1;
- break;
- }
- }
- if (!found) goto done;
- }
-
- if (ldb_msg_add_string(msg, cols[2], cols[3]) != 0) {
- return SQLITE_ABORT;
- }
-
-done:
- ac->ares->message = msg;
- return SQLITE_OK;
-}
-
-
-/*
- * lsqlite3_get_eid()
- * lsqlite3_get_eid_ndn()
- *
- * These functions are used for the very common case of retrieving an EID value
- * given a (normalized) DN.
- */
-
-static long long lsqlite3_get_eid_ndn(sqlite3 *sqlite, void *mem_ctx, const char *norm_dn)
-{
- char *errmsg;
- char *query;
- long long eid = -1;
- long long ret;
-
- /* get object eid */
- query = lsqlite3_tprintf(mem_ctx, "SELECT eid "
- "FROM ldb_entry "
- "WHERE norm_dn = '%q';", norm_dn);
- if (query == NULL) return -1;
-
- ret = sqlite3_exec(sqlite, query, lsqlite3_eid_callback, &eid, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- printf("lsqlite3_get_eid: Fatal Error: %s\n", errmsg);
- free(errmsg);
- }
- return -1;
- }
-
- return eid;
-}
-
-static long long lsqlite3_get_eid(struct lsqlite3_private *lsqlite3,
- struct ldb_dn *dn)
-{
- TALLOC_CTX *local_ctx;
- long long eid = -1;
- char *cdn;
-
- /* ignore ltdb specials */
- if (ldb_dn_is_special(dn)) {
- return -1;
- }
-
- /* create a local ctx */
- local_ctx = talloc_named(lsqlite3, 0, "lsqlite3_get_eid local context");
- if (local_ctx == NULL) {
- return -1;
- }
-
- cdn = ldb_dn_alloc_casefold(local_ctx, dn);
- if (!cdn) goto done;
-
- eid = lsqlite3_get_eid_ndn(lsqlite3->sqlite, local_ctx, cdn);
-
-done:
- talloc_free(local_ctx);
- return eid;
-}
-
-/*
- * Interface functions referenced by lsqlite3_ops
- */
-
-/* search for matching records, by tree */
-int lsql_search(struct lsql_context *ctx)
-{
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- struct lsqlite3_private *lsqlite3;
- struct ldb_context *ldb;
- char *norm_basedn;
- char *sqlfilter;
- char *errmsg;
- char *query = NULL;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
- lsqlite3 = talloc_get_type(ldb_module_get_private(module),
- struct lsqlite3_private);
-
- if ((( ! ldb_dn_is_valid(req->op.search.base)) ||
- ldb_dn_is_null(req->op.search.base)) &&
- (req->op.search.scope == LDB_SCOPE_BASE ||
- req->op.search.scope == LDB_SCOPE_ONELEVEL)) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (req->op.search.base) {
- norm_basedn = ldb_dn_alloc_casefold(ctx, req->op.search.base);
- if (norm_basedn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- } else norm_basedn = talloc_strdup(ctx, "");
-
- /* Convert filter into a series of SQL conditions (constraints) */
- sqlfilter = parsetree_to_sql(module, ctx, req->op.search.tree);
-
- switch(req->op.search.scope) {
- case LDB_SCOPE_DEFAULT:
- case LDB_SCOPE_SUBTREE:
- if (*norm_basedn != '\0') {
- query = lsqlite3_tprintf(ctx,
- "SELECT entry.eid,\n"
- " entry.dn,\n"
- " av.attr_name,\n"
- " av.attr_value\n"
- " FROM ldb_entry AS entry\n"
-
- " LEFT OUTER JOIN ldb_attribute_values AS av\n"
- " ON av.eid = entry.eid\n"
-
- " WHERE entry.eid IN\n"
- " (SELECT DISTINCT ldb_entry.eid\n"
- " FROM ldb_entry\n"
- " WHERE (ldb_entry.norm_dn GLOB('*,%q')\n"
- " OR ldb_entry.norm_dn = '%q')\n"
- " AND ldb_entry.eid IN\n"
- " (%s)\n"
- " )\n"
-
- " ORDER BY entry.eid ASC;",
- norm_basedn,
- norm_basedn,
- sqlfilter);
- } else {
- query = lsqlite3_tprintf(ctx,
- "SELECT entry.eid,\n"
- " entry.dn,\n"
- " av.attr_name,\n"
- " av.attr_value\n"
- " FROM ldb_entry AS entry\n"
-
- " LEFT OUTER JOIN ldb_attribute_values AS av\n"
- " ON av.eid = entry.eid\n"
-
- " WHERE entry.eid IN\n"
- " (SELECT DISTINCT ldb_entry.eid\n"
- " FROM ldb_entry\n"
- " WHERE ldb_entry.eid IN\n"
- " (%s)\n"
- " )\n"
-
- " ORDER BY entry.eid ASC;",
- sqlfilter);
- }
-
- break;
-
- case LDB_SCOPE_BASE:
- query = lsqlite3_tprintf(ctx,
- "SELECT entry.eid,\n"
- " entry.dn,\n"
- " av.attr_name,\n"
- " av.attr_value\n"
- " FROM ldb_entry AS entry\n"
-
- " LEFT OUTER JOIN ldb_attribute_values AS av\n"
- " ON av.eid = entry.eid\n"
-
- " WHERE entry.eid IN\n"
- " (SELECT DISTINCT ldb_entry.eid\n"
- " FROM ldb_entry\n"
- " WHERE ldb_entry.norm_dn = '%q'\n"
- " AND ldb_entry.eid IN\n"
- " (%s)\n"
- " )\n"
-
- " ORDER BY entry.eid ASC;",
- norm_basedn,
- sqlfilter);
- break;
-
- case LDB_SCOPE_ONELEVEL:
- query = lsqlite3_tprintf(ctx,
- "SELECT entry.eid,\n"
- " entry.dn,\n"
- " av.attr_name,\n"
- " av.attr_value\n"
- " FROM ldb_entry AS entry\n"
-
- " LEFT OUTER JOIN ldb_attribute_values AS av\n"
- " ON av.eid = entry.eid\n"
-
- " WHERE entry.eid IN\n"
- " (SELECT DISTINCT ldb_entry.eid\n"
- " FROM ldb_entry\n"
- " WHERE norm_dn GLOB('*,%q')\n"
- " AND NOT norm_dn GLOB('*,*,%q')\n"
- " AND ldb_entry.eid IN\n(%s)\n"
- " )\n"
-
- " ORDER BY entry.eid ASC;",
- norm_basedn,
- norm_basedn,
- sqlfilter);
- break;
- }
-
- if (query == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* * /
- printf ("%s\n", query);
- / * */
-
- ctx->current_eid = 0;
- ctx->attrs = req->op.search.attrs;
- ctx->ares = NULL;
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- ret = sqlite3_exec(lsqlite3->sqlite, query, lsqlite3_search_callback, ctx, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- ldb_set_errstring(ldb, errmsg);
- free(errmsg);
- }
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* complete the last message if any */
- if (ctx->ares) {
- ret = ldb_msg_normalize(ldb, ctx->ares,
- ctx->ares->message,
- &ctx->ares->message);
- if (ret != LDB_SUCCESS) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_module_send_entry(req, ctx->ares->message, NULL);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
-
- return LDB_SUCCESS;
-}
-
-/* add a record */
-static int lsql_add(struct lsql_context *ctx)
-{
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- struct lsqlite3_private *lsqlite3;
- struct ldb_context *ldb;
- struct ldb_message *msg = req->op.add.message;
- long long eid;
- char *dn, *ndn;
- char *errmsg;
- char *query;
- unsigned int i;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
- lsqlite3 = talloc_get_type(ldb_module_get_private(module),
- struct lsqlite3_private);
-
- /* See if this is an ltdb special */
- if (ldb_dn_is_special(msg->dn)) {
-/*
- struct ldb_dn *c;
- c = ldb_dn_new(local_ctx, ldb, "@INDEXLIST");
- if (ldb_dn_compare(ldb, msg->dn, c) == 0) {
-#warning "should we handle indexes somehow ?"
- ret = LDB_ERR_UNWILLING_TO_PERFORM;
- goto done;
- }
-*/
- /* Others return an error */
- return LDB_ERR_UNWILLING_TO_PERFORM;
- }
-
- /* create linearized and normalized dns */
- dn = ldb_dn_alloc_linearized(ctx, msg->dn);
- ndn = ldb_dn_alloc_casefold(ctx, msg->dn);
- if (dn == NULL || ndn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- query = lsqlite3_tprintf(ctx,
- /* Add new entry */
- "INSERT OR ABORT INTO ldb_entry "
- "('dn', 'norm_dn') "
- "VALUES ('%q', '%q');",
- dn, ndn);
- if (query == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = sqlite3_exec(lsqlite3->sqlite, query, NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- ldb_set_errstring(ldb, errmsg);
- free(errmsg);
- }
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- eid = lsqlite3_get_eid_ndn(lsqlite3->sqlite, ctx, ndn);
- if (eid == -1) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- for (i = 0; i < msg->num_elements; i++) {
- const struct ldb_message_element *el = &msg->elements[i];
- const struct ldb_schema_attribute *a;
- char *attr;
- unsigned int j;
-
- /* Get a case-folded copy of the attribute name */
- attr = ldb_attr_casefold(ctx, el->name);
- if (attr == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- a = ldb_schema_attribute_by_name(ldb, el->name);
-
- if (el->num_value == 0) {
- ldb_asprintf_errstring(ldb, "attribute %s on %s specified, but with 0 values (illegal)",
- el->name, ldb_dn_get_linearized(msg->dn));
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- /* For each value of the specified attribute name... */
- for (j = 0; j < el->num_values; j++) {
- struct ldb_val value;
- char *insert;
-
- /* Get a canonicalised copy of the data */
- a->syntax->canonicalise_fn(ldb, ctx, &(el->values[j]), &value);
- if (value.data == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- insert = lsqlite3_tprintf(ctx,
- "INSERT OR ROLLBACK INTO ldb_attribute_values "
- "('eid', 'attr_name', 'norm_attr_name',"
- " 'attr_value', 'norm_attr_value') "
- "VALUES ('%lld', '%q', '%q', '%q', '%q');",
- eid, el->name, attr,
- el->values[j].data, value.data);
- if (insert == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = sqlite3_exec(lsqlite3->sqlite, insert, NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- ldb_set_errstring(ldb, errmsg);
- free(errmsg);
- }
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
- }
-
- return LDB_SUCCESS;
-}
-
-/* modify a record */
-static int lsql_modify(struct lsql_context *ctx)
-{
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- struct lsqlite3_private *lsqlite3;
- struct ldb_context *ldb;
- struct ldb_message *msg = req->op.mod.message;
- long long eid;
- char *errmsg;
- unsigned int i;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
- lsqlite3 = talloc_get_type(ldb_module_get_private(module),
- struct lsqlite3_private);
-
- /* See if this is an ltdb special */
- if (ldb_dn_is_special(msg->dn)) {
- /* Others return an error */
- return LDB_ERR_UNWILLING_TO_PERFORM;
- }
-
- eid = lsqlite3_get_eid(lsqlite3, msg->dn);
- if (eid == -1) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- for (i = 0; i < msg->num_elements; i++) {
- const struct ldb_message_element *el = &msg->elements[i];
- const struct ldb_schema_attribute *a;
- unsigned int flags = el->flags & LDB_FLAG_MOD_MASK;
- char *attr;
- char *mod;
- unsigned int j;
-
- /* Get a case-folded copy of the attribute name */
- attr = ldb_attr_casefold(ctx, el->name);
- if (attr == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- a = ldb_schema_attribute_by_name(ldb, el->name);
-
- switch (flags) {
-
- case LDB_FLAG_MOD_REPLACE:
-
- for (j=0; j<el->num_values; j++) {
- if (ldb_msg_find_val(el, &el->values[j]) != &el->values[j]) {
- ldb_asprintf_errstring(ldb, "%s: value #%d provided more than once", el->name, j);
- return LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS;
- }
- }
-
- /* remove all attributes before adding the replacements */
- mod = lsqlite3_tprintf(ctx,
- "DELETE FROM ldb_attribute_values "
- "WHERE eid = '%lld' "
- "AND norm_attr_name = '%q';",
- eid, attr);
- if (mod == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = sqlite3_exec(lsqlite3->sqlite, mod, NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- ldb_set_errstring(ldb, errmsg);
- free(errmsg);
- }
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* MISSING break is INTENTIONAL */
-
- case LDB_FLAG_MOD_ADD:
-
- if (el->num_values == 0) {
- ldb_asprintf_errstring(ldb, "attribute %s on %s specified, but with 0 values (illigal)",
- el->name, ldb_dn_get_linearized(msg->dn));
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- /* For each value of the specified attribute name... */
- for (j = 0; j < el->num_values; j++) {
- struct ldb_val value;
-
- /* Get a canonicalised copy of the data */
- a->syntax->canonicalise_fn(ldb, ctx, &(el->values[j]), &value);
- if (value.data == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- mod = lsqlite3_tprintf(ctx,
- "INSERT OR ROLLBACK INTO ldb_attribute_values "
- "('eid', 'attr_name', 'norm_attr_name',"
- " 'attr_value', 'norm_attr_value') "
- "VALUES ('%lld', '%q', '%q', '%q', '%q');",
- eid, el->name, attr,
- el->values[j].data, value.data);
-
- if (mod == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = sqlite3_exec(lsqlite3->sqlite, mod, NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- ldb_set_errstring(ldb, errmsg);
- free(errmsg);
- }
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- break;
-
- case LDB_FLAG_MOD_DELETE:
-#warning "We should throw an error if the attribute we are trying to delete does not exist!"
- if (el->num_values == 0) {
- mod = lsqlite3_tprintf(ctx,
- "DELETE FROM ldb_attribute_values "
- "WHERE eid = '%lld' "
- "AND norm_attr_name = '%q';",
- eid, attr);
- if (mod == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = sqlite3_exec(lsqlite3->sqlite, mod, NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- ldb_set_errstring(ldb, errmsg);
- free(errmsg);
- }
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- /* For each value of the specified attribute name... */
- for (j = 0; j < el->num_values; j++) {
- struct ldb_val value;
-
- /* Get a canonicalised copy of the data */
- a->syntax->canonicalise_fn(ldb, ctx, &(el->values[j]), &value);
- if (value.data == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- mod = lsqlite3_tprintf(ctx,
- "DELETE FROM ldb_attribute_values "
- "WHERE eid = '%lld' "
- "AND norm_attr_name = '%q' "
- "AND norm_attr_value = '%q';",
- eid, attr, value.data);
-
- if (mod == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = sqlite3_exec(lsqlite3->sqlite, mod, NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- ldb_set_errstring(ldb, errmsg);
- free(errmsg);
- }
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- break;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-/* delete a record */
-static int lsql_delete(struct lsql_context *ctx)
-{
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- struct lsqlite3_private *lsqlite3;
- struct ldb_context *ldb;
- long long eid;
- char *errmsg;
- char *query;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
- lsqlite3 = talloc_get_type(ldb_module_get_private(module),
- struct lsqlite3_private);
-
- eid = lsqlite3_get_eid(lsqlite3, req->op.del.dn);
- if (eid == -1) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- query = lsqlite3_tprintf(ctx,
- /* Delete entry */
- "DELETE FROM ldb_entry WHERE eid = %lld; "
- /* Delete attributes */
- "DELETE FROM ldb_attribute_values WHERE eid = %lld; ",
- eid, eid);
- if (query == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = sqlite3_exec(lsqlite3->sqlite, query, NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- ldb_set_errstring(ldb, errmsg);
- free(errmsg);
- }
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
-}
-
-/* rename a record */
-static int lsql_rename(struct lsql_context *ctx)
-{
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- struct lsqlite3_private *lsqlite3;
- struct ldb_context *ldb;
- char *new_dn, *new_cdn, *old_cdn;
- char *errmsg;
- char *query;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
- lsqlite3 = talloc_get_type(ldb_module_get_private(module),
- struct lsqlite3_private);
-
- /* create linearized and normalized dns */
- old_cdn = ldb_dn_alloc_casefold(ctx, req->op.rename.olddn);
- new_cdn = ldb_dn_alloc_casefold(ctx, req->op.rename.newdn);
- new_dn = ldb_dn_alloc_linearized(ctx, req->op.rename.newdn);
- if (old_cdn == NULL || new_cdn == NULL || new_dn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* build the SQL query */
- query = lsqlite3_tprintf(ctx,
- "UPDATE ldb_entry SET dn = '%q', norm_dn = '%q' "
- "WHERE norm_dn = '%q';",
- new_dn, new_cdn, old_cdn);
- if (query == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* execute */
- ret = sqlite3_exec(lsqlite3->sqlite, query, NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- ldb_set_errstring(ldb, errmsg);
- free(errmsg);
- }
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
-}
-
-static int lsql_start_trans(struct ldb_module * module)
-{
- int ret;
- char *errmsg;
- struct lsqlite3_private *lsqlite3;
-
- lsqlite3 = talloc_get_type(ldb_module_get_private(module),
- struct lsqlite3_private);
-
- if (lsqlite3->trans_count == 0) {
- ret = sqlite3_exec(lsqlite3->sqlite, "BEGIN IMMEDIATE;", NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- printf("lsqlite3_start_trans: error: %s\n", errmsg);
- free(errmsg);
- }
- return -1;
- }
- };
-
- lsqlite3->trans_count++;
-
- return 0;
-}
-
-static int lsql_end_trans(struct ldb_module *module)
-{
- int ret;
- char *errmsg;
- struct lsqlite3_private *lsqlite3;
-
- lsqlite3 = talloc_get_type(ldb_module_get_private(module),
- struct lsqlite3_private);
-
- if (lsqlite3->trans_count > 0) {
- lsqlite3->trans_count--;
- } else return -1;
-
- if (lsqlite3->trans_count == 0) {
- ret = sqlite3_exec(lsqlite3->sqlite, "COMMIT;", NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- printf("lsqlite3_end_trans: error: %s\n", errmsg);
- free(errmsg);
- }
- return -1;
- }
- }
-
- return 0;
-}
-
-static int lsql_del_trans(struct ldb_module *module)
-{
- struct lsqlite3_private *lsqlite3;
-
- lsqlite3 = talloc_get_type(ldb_module_get_private(module),
- struct lsqlite3_private);
-
- if (lsqlite3->trans_count > 0) {
- lsqlite3->trans_count--;
- } else return -1;
-
- if (lsqlite3->trans_count == 0) {
- return lsqlite3_safe_rollback(lsqlite3->sqlite);
- }
-
- return -1;
-}
-
-static int destructor(struct lsqlite3_private *lsqlite3)
-{
- if (lsqlite3->sqlite) {
- sqlite3_close(lsqlite3->sqlite);
- }
- return 0;
-}
-
-static void lsql_request_done(struct lsql_context *ctx, int error)
-{
- struct ldb_context *ldb;
- struct ldb_request *req;
- struct ldb_reply *ares;
-
- ldb = ldb_module_get_ctx(ctx->module);
- req = ctx->req;
-
- /* if we already returned an error just return */
- if (ldb_request_get_status(req) != LDB_SUCCESS) {
- return;
- }
-
- ares = talloc_zero(req, struct ldb_reply);
- if (!ares) {
- ldb_oom(ldb);
- req->callback(req, NULL);
- return;
- }
- ares->type = LDB_REPLY_DONE;
- ares->error = error;
-
- req->callback(req, ares);
-}
-
-static void lsql_timeout(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval t,
- void *private_data)
-{
- struct lsql_context *ctx;
- ctx = talloc_get_type(private_data, struct lsql_context);
-
- lsql_request_done(ctx, LDB_ERR_TIME_LIMIT_EXCEEDED);
-}
-
-static void lsql_callback(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval t,
- void *private_data)
-{
- struct lsql_context *ctx;
- int ret;
-
- ctx = talloc_get_type(private_data, struct lsql_context);
-
- switch (ctx->req->operation) {
- case LDB_SEARCH:
- ret = lsql_search(ctx);
- break;
- case LDB_ADD:
- ret = lsql_add(ctx);
- break;
- case LDB_MODIFY:
- ret = lsql_modify(ctx);
- break;
- case LDB_DELETE:
- ret = lsql_delete(ctx);
- break;
- case LDB_RENAME:
- ret = lsql_rename(ctx);
- break;
-/* TODO:
- case LDB_EXTENDED:
- ret = lsql_extended(ctx);
- break;
- */
- default:
- /* no other op supported */
- ret = LDB_ERR_PROTOCOL_ERROR;
- }
-
- if (!ctx->callback_failed) {
- /* Once we are done, we do not need timeout events */
- talloc_free(ctx->timeout_event);
- lsql_request_done(ctx, ret);
- }
-}
-
-static int lsql_handle_request(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct tevent_context *ev;
- struct lsql_context *ac;
- struct tevent_timer *te;
- struct timeval tv;
-
- if (ldb_check_critical_controls(req->controls)) {
- return LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION;
- }
-
- if (req->starttime == 0 || req->timeout == 0) {
- ldb_set_errstring(ldb, "Invalid timeout settings");
- return LDB_ERR_TIME_LIMIT_EXCEEDED;
- }
-
- ldb = ldb_module_get_ctx(module);
- ev = ldb_get_event_context(ldb);
-
- ac = talloc_zero(req, struct lsql_context);
- if (ac == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->module = module;
- ac->req = req;
-
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- te = tevent_add_timer(ev, ac, tv, lsql_callback, ac);
- if (NULL == te) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- tv.tv_sec = req->starttime + req->timeout;
- ac->timeout_event = tevent_add_timer(ev, ac, tv, lsql_timeout, ac);
- if (NULL == ac->timeout_event) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
-}
-
-/*
- * Table of operations for the sqlite3 backend
- */
-static const struct ldb_module_ops lsqlite3_ops = {
- .name = "sqlite",
- .search = lsql_handle_request,
- .add = lsql_handle_request,
- .modify = lsql_handle_request,
- .del = lsql_handle_request,
- .rename = lsql_handle_request,
- .extended = lsql_handle_request,
- .start_transaction = lsql_start_trans,
- .end_transaction = lsql_end_trans,
- .del_transaction = lsql_del_trans,
-};
-
-/*
- * Static functions
- */
-
-static int initialize(struct lsqlite3_private *lsqlite3,
- struct ldb_context *ldb, const char *url,
- unsigned int flags)
-{
- TALLOC_CTX *local_ctx;
- long long queryInt;
- int rollback = 0;
- char *errmsg;
- char *schema;
- int ret;
-
- /* create a local ctx */
- local_ctx = talloc_named(lsqlite3, 0, "lsqlite3_rename local context");
- if (local_ctx == NULL) {
- return -1;
- }
-
- schema = lsqlite3_tprintf(local_ctx,
-
-
- "CREATE TABLE ldb_info AS "
- " SELECT 'LDB' AS database_type,"
- " '1.0' AS version;"
-
- /*
- * The entry table holds the information about an entry.
- * This table is used to obtain the EID of the entry and to
- * support scope=one and scope=base. The parent and child
- * table is included in the entry table since all the other
- * attributes are dependent on EID.
- */
- "CREATE TABLE ldb_entry "
- "("
- " eid INTEGER PRIMARY KEY AUTOINCREMENT,"
- " dn TEXT UNIQUE NOT NULL,"
- " norm_dn TEXT UNIQUE NOT NULL"
- ");"
-
-
- "CREATE TABLE ldb_object_classes"
- "("
- " class_name TEXT PRIMARY KEY,"
- " parent_class_name TEXT,"
- " tree_key TEXT UNIQUE,"
- " max_child_num INTEGER DEFAULT 0"
- ");"
-
- /*
- * We keep a full listing of attribute/value pairs here
- */
- "CREATE TABLE ldb_attribute_values"
- "("
- " eid INTEGER REFERENCES ldb_entry,"
- " attr_name TEXT,"
- " norm_attr_name TEXT,"
- " attr_value TEXT,"
- " norm_attr_value TEXT "
- ");"
-
-
- /*
- * Indexes
- */
- "CREATE INDEX ldb_attribute_values_eid_idx "
- " ON ldb_attribute_values (eid);"
-
- "CREATE INDEX ldb_attribute_values_name_value_idx "
- " ON ldb_attribute_values (attr_name, norm_attr_value);"
-
-
-
- /*
- * Triggers
- */
-
- "CREATE TRIGGER ldb_object_classes_insert_tr"
- " AFTER INSERT"
- " ON ldb_object_classes"
- " FOR EACH ROW"
- " BEGIN"
- " UPDATE ldb_object_classes"
- " SET tree_key = COALESCE(tree_key, "
- " ("
- " SELECT tree_key || "
- " (SELECT base160(max_child_num + 1)"
- " FROM ldb_object_classes"
- " WHERE class_name = "
- " new.parent_class_name)"
- " FROM ldb_object_classes "
- " WHERE class_name = new.parent_class_name "
- " ));"
- " UPDATE ldb_object_classes "
- " SET max_child_num = max_child_num + 1"
- " WHERE class_name = new.parent_class_name;"
- " END;"
-
- /*
- * Table initialization
- */
-
- "INSERT INTO ldb_object_classes "
- " (class_name, tree_key) "
- " VALUES "
- " ('TOP', '0001');");
-
- /* Skip protocol indicator of url */
- if (strncmp(url, "sqlite3://", 10) != 0) {
- return SQLITE_MISUSE;
- }
-
- /* Update pointer to just after the protocol indicator */
- url += 10;
-
- /* Try to open the (possibly empty/non-existent) database */
- if ((ret = sqlite3_open(url, &lsqlite3->sqlite)) != SQLITE_OK) {
- return ret;
- }
-
- /* In case this is a new database, enable auto_vacuum */
- ret = sqlite3_exec(lsqlite3->sqlite, "PRAGMA auto_vacuum = 1;", NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- printf("lsqlite3 initializaion error: %s\n", errmsg);
- free(errmsg);
- }
- goto failed;
- }
-
- if (flags & LDB_FLG_NOSYNC) {
- /* DANGEROUS */
- ret = sqlite3_exec(lsqlite3->sqlite, "PRAGMA synchronous = OFF;", NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- printf("lsqlite3 initializaion error: %s\n", errmsg);
- free(errmsg);
- }
- goto failed;
- }
- }
-
- /* */
-
- /* Establish a busy timeout of 30 seconds */
- if ((ret = sqlite3_busy_timeout(lsqlite3->sqlite,
- 30000)) != SQLITE_OK) {
- return ret;
- }
-
- /* Create a function, callable from sql, to increment a tree_key */
- if ((ret =
- sqlite3_create_function(lsqlite3->sqlite,/* handle */
- "base160_next", /* function name */
- 1, /* number of args */
- SQLITE_ANY, /* preferred text type */
- NULL, /* user data */
- base160next_sql, /* called func */
- NULL, /* step func */
- NULL /* final func */
- )) != SQLITE_OK) {
- return ret;
- }
-
- /* Create a function, callable from sql, to convert int to base160 */
- if ((ret =
- sqlite3_create_function(lsqlite3->sqlite,/* handle */
- "base160", /* function name */
- 1, /* number of args */
- SQLITE_ANY, /* preferred text type */
- NULL, /* user data */
- base160_sql, /* called func */
- NULL, /* step func */
- NULL /* final func */
- )) != SQLITE_OK) {
- return ret;
- }
-
- /* Create a function, callable from sql, to perform various comparisons */
- if ((ret =
- sqlite3_create_function(lsqlite3->sqlite, /* handle */
- "ldap_compare", /* function name */
- 4, /* number of args */
- SQLITE_ANY, /* preferred text type */
- ldb , /* user data */
- lsqlite3_compare, /* called func */
- NULL, /* step func */
- NULL /* final func */
- )) != SQLITE_OK) {
- return ret;
- }
-
- /* Begin a transaction */
- ret = sqlite3_exec(lsqlite3->sqlite, "BEGIN EXCLUSIVE;", NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- printf("lsqlite3: initialization error: %s\n", errmsg);
- free(errmsg);
- }
- goto failed;
- }
- rollback = 1;
-
- /* Determine if this is a new database. No tables means it is. */
- if (query_int(lsqlite3,
- &queryInt,
- "SELECT COUNT(*)\n"
- " FROM sqlite_master\n"
- " WHERE type = 'table';") != 0) {
- goto failed;
- }
-
- if (queryInt == 0) {
- /*
- * Create the database schema
- */
- ret = sqlite3_exec(lsqlite3->sqlite, schema, NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- printf("lsqlite3 initializaion error: %s\n", errmsg);
- free(errmsg);
- }
- goto failed;
- }
- } else {
- /*
- * Ensure that the database we opened is one of ours
- */
- if (query_int(lsqlite3,
- &queryInt,
- "SELECT "
- " (SELECT COUNT(*) = 2"
- " FROM sqlite_master "
- " WHERE type = 'table' "
- " AND name IN "
- " ("
- " 'ldb_entry', "
- " 'ldb_object_classes' "
- " ) "
- " ) "
- " AND "
- " (SELECT 1 "
- " FROM ldb_info "
- " WHERE database_type = 'LDB' "
- " AND version = '1.0'"
- " );") != 0 ||
- queryInt != 1) {
-
- /* It's not one that we created. See ya! */
- goto failed;
- }
- }
-
- /* Commit the transaction */
- ret = sqlite3_exec(lsqlite3->sqlite, "COMMIT;", NULL, NULL, &errmsg);
- if (ret != SQLITE_OK) {
- if (errmsg) {
- printf("lsqlite3: iniialization error: %s\n", errmsg);
- free(errmsg);
- }
- goto failed;
- }
-
- return SQLITE_OK;
-
-failed:
- if (rollback) lsqlite3_safe_rollback(lsqlite3->sqlite);
- sqlite3_close(lsqlite3->sqlite);
- return -1;
-}
-
-/*
- * connect to the database
- */
-static int lsqlite3_connect(struct ldb_context *ldb,
- const char *url,
- unsigned int flags,
- const char *options[],
- struct ldb_module **_module)
-{
- struct ldb_module *module;
- struct lsqlite3_private *lsqlite3;
- unsigned int i;
- int ret;
-
- module = ldb_module_new(ldb, ldb, "ldb_sqlite3 backend", &lsqlite3_ops);
- if (!module) return LDB_ERR_OPERATIONS_ERROR;
-
- lsqlite3 = talloc(module, struct lsqlite3_private);
- if (!lsqlite3) {
- goto failed;
- }
-
- lsqlite3->sqlite = NULL;
- lsqlite3->options = NULL;
- lsqlite3->trans_count = 0;
-
- ret = initialize(lsqlite3, ldb, url, flags);
- if (ret != SQLITE_OK) {
- goto failed;
- }
-
- talloc_set_destructor(lsqlite3, destructor);
-
- ldb_module_set_private(module, lsqlite3);
-
- if (options) {
- /*
- * take a copy of the options array, so we don't have to rely
- * on the caller keeping it around (it might be dynamic)
- */
- for (i=0;options[i];i++) ;
-
- lsqlite3->options = talloc_array(lsqlite3, char *, i+1);
- if (!lsqlite3->options) {
- goto failed;
- }
-
- for (i=0;options[i];i++) {
-
- lsqlite3->options[i+1] = NULL;
- lsqlite3->options[i] =
- talloc_strdup(lsqlite3->options, options[i]);
- if (!lsqlite3->options[i]) {
- goto failed;
- }
- }
- }
-
- *_module = module;
- return LDB_SUCCESS;
-
-failed:
- if (lsqlite3 && lsqlite3->sqlite != NULL) {
- (void) sqlite3_close(lsqlite3->sqlite);
- }
- talloc_free(lsqlite3);
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-int ldb_sqlite3_init(const char *version)
-{
- LDB_MODULE_CHECK_VERSION(version);
- return ldb_register_backend("sqlite3", lsqlite3_connect, false);
-}
diff --git a/source4/lib/ldb/ldb_sqlite3/schema b/source4/lib/ldb/ldb_sqlite3/schema
deleted file mode 100644
index ab7c5cc406..0000000000
--- a/source4/lib/ldb/ldb_sqlite3/schema
+++ /dev/null
@@ -1,328 +0,0 @@
- -- ------------------------------------------------------
-
- PRAGMA auto_vacuum=1;
-
- -- ------------------------------------------------------
-
- BEGIN EXCLUSIVE;
-
- -- ------------------------------------------------------
-
- CREATE TABLE ldb_info AS
- SELECT 'LDB' AS database_type,
- '1.0' AS version;
-
- /*
- * Get the next USN value with:
- * BEGIN EXCLUSIVE;
- * UPDATE usn SET value = value + 1;
- * SELECT value FROM usn;
- * COMMIT;
- */
- CREATE TABLE usn
- (
- value INTEGER
- );
-
- CREATE TABLE ldb_object
- (
- /* tree_key is auto-generated by the insert trigger */
- tree_key TEXT PRIMARY KEY,
-
- parent_tree_key TEXT,
- dn TEXT,
-
- attr_name TEXT REFERENCES ldb_attributes,
- attr_value TEXT,
-
- /*
- * object_type can take on these values (to date):
- * 1: object is a node of a DN
- * 2: object is an attribute/value pair of its parent DN
- */
- object_type INTEGER,
-
- /*
- * if object_type is 1, the node can have children.
- * this tracks the maximum previously assigned child
- * number so we can generate a new unique tree key for
- * a new child object. note that this is always incremented,
- * so if children are deleted, this will not represent
- * the _number_ of children.
- */
- max_child_num INTEGER,
-
- /*
- * Automatically maintained meta-data (a gift for metze)
- */
- object_guid TEXT UNIQUE,
- timestamp INTEGER, -- originating_time
- invoke_id TEXT, -- GUID: originating_invocation_id
- usn INTEGER, -- hyper: originating_usn
-
- /* do not allow duplicate name/value pairs */
- UNIQUE (parent_tree_key, attr_name, attr_value, object_type)
- );
-
- CREATE TABLE ldb_attributes
- (
- attr_name TEXT PRIMARY KEY,
- parent_tree_key TEXT,
-
- objectclass_p BOOLEAN DEFAULT 0,
-
- case_insensitive_p BOOLEAN DEFAULT 0,
- wildcard_p BOOLEAN DEFAULT 0,
- hidden_p BOOLEAN DEFAULT 0,
- integer_p BOOLEAN DEFAULT 0,
-
- /* tree_key is auto-generated by the insert trigger */
- tree_key TEXT, -- null if not a object/sub class
- -- level 1 if an objectclass
- -- level 1-n if a subclass
- max_child_num INTEGER
- );
-
- -- ------------------------------------------------------
-
- CREATE INDEX ldb_object_dn_idx
- ON ldb_object (dn);
-
- CREATE INDEX ldb_attributes_tree_key_ids
- ON ldb_attributes (tree_key);
-
- -- ------------------------------------------------------
-
- /* Gifts for metze. Automatically updated meta-data */
- CREATE TRIGGER ldb_object_insert_tr
- AFTER INSERT
- ON ldb_object
- FOR EACH ROW
- BEGIN
- UPDATE ldb_object
- SET max_child_num = max_child_num + 1
- WHERE tree_key = new.parent_tree_key;
- UPDATE usn SET value = value + 1;
- UPDATE ldb_object
- SET tree_key =
- (SELECT
- new.tree_key ||
- base160(SELECT max_child_num
- FROM ldb_object
- WHERE tree_key =
- new.parent_tree_key));
- max_child_num = 0,
- object_guid = random_guid(),
- timestamp = strftime('%s', 'now'),
- usn = (SELECT value FROM usn);
- WHERE tree_key = new.tree_key;
- END;
-
- CREATE TRIGGER ldb_object_update_tr
- AFTER UPDATE
- ON ldb_object
- FOR EACH ROW
- BEGIN
- UPDATE usn SET value = value + 1;
- UPDATE ldb_object
- SET timestamp = strftime('%s', 'now'),
- usn = (SELECT value FROM usn);
- WHERE tree_key = new.tree_key;
- END;
-
- CREATE TRIGGER ldb_attributes_insert_tr
- AFTER INSERT
- ON ldb_attributes
- FOR EACH ROW
- BEGIN
- UPDATE ldb_attributes
- SET max_child_num = max_child_num + 1
- WHERE tree_key = new.parent_tree_key;
- UPDATE ldb_attributes
- SET tree_key =
- (SELECT
- new.tree_key ||
- base160(SELECT max_child_num
- FROM ldb_attributes
- WHERE tree_key =
- new.parent_tree_key));
- max_child_num = 0
- WHERE tree_key = new.tree_key;
- END;
-
-
- -- ------------------------------------------------------
-
- /* Initialize usn */
- INSERT INTO usn (value) VALUES (0);
-
- /* Create root object */
- INSERT INTO ldb_object
- (tree_key, parent_tree_key,
- dn,
- object_type, max_child_num)
- VALUES ('', NULL,
- '',
- 1, 0);
-
- /* We need an implicit "top" level object class */
- INSERT INTO ldb_attributes (attr_name,
- parent_tree_key)
- SELECT 'top', '';
-
- -- ------------------------------------------------------
-
- COMMIT;
-
- -- ------------------------------------------------------
-
-/*
- * dn: o=University of Michigan,c=US
- * objectclass: organization
- * objectclass: domainRelatedObject
- */
--- newDN
-BEGIN;
-
-INSERT OR IGNORE INTO ldb_object
- (parent_tree_key
- dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('',
- 'c=US',
- 'c', 'US', 1, 0);
-
-INSERT INTO ldb_object
- (parent_tree_key,
- dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('0001',
- 'o=University of Michigan,c=US',
- 'o', 'University of Michigan', 1, 0);
-
--- newObjectClass
-INSERT OR IGNORE INTO ldb_attributes
- (attr_name, parent_tree_key, objectclass_p)
- VALUES
- ('objectclass', '', 1);
-
-INSERT INTO ldb_object
- (parent_tree_key,
- dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('00010001',
- NULL,
- 'objectclass', 'organization', 2, 0);
-
-INSERT OR IGNORE INTO ldb_attributes
- (attr_name, parent_tree_key, objectclass_p)
- VALUES
- ('objectclass', '', 1);
-
-INSERT INTO ldb_object
- (parent_tree_key,
- dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('00010001',
- NULL,
- 'objectclass', 'domainRelatedObject', 2, 0);
-
-COMMIT;
-
-
-/*
- * dn: o=University of Michigan,c=US
- * l: Ann Arbor, Michigan
- * st: Michigan
- * o: University of Michigan
- * o: UMICH
- * seeAlso:
- * telephonenumber: +1 313 764-1817
- */
--- addAttrValuePair
-BEGIN;
-
-INSERT INTO ldb_object
- (parent_tree_key, dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('00010001', NULL,
- 'l', 'Ann Arbor, Michigan', 2, 0);
-
-INSERT INTO ldb_object
- (parent_tree_key, dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('00010001', NULL,
- 'st', 'Michigan', 2, 0);
-
-INSERT INTO ldb_object
- (parent_tree_key, dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('00010001', NULL,
- 'o', 'University of Michigan', 2, 0);
-
-INSERT INTO ldb_object
- (parent_tree_key, dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('00010001', NULL,
- 'o', 'UMICH', 2, 0);
-
-INSERT INTO ldb_object
- (parent_tree_key, dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('00010001', NULL,
- 'seeAlso', '', 2, 0);
-
-INSERT INTO ldb_object
- (parent_tree_key, dn,
- attr_name, attr_value, object_type, max_child_num)
- VALUES ('00010001', NULL,
- 'telephonenumber', '+1 313 764-1817', 2, 0);
-
-COMMIT;
-
--- ----------------------------------------------------------------------
-
-/*
- * dn: @ATTRIBUTES
- * uid: CASE_INSENSITIVE WILDCARD
- * cn: CASE_INSENSITIVE
- * ou: CASE_INSENSITIVE
- * dn: CASE_INSENSITIVE
- */
--- newAttribute
-
-BEGIN;
-
-INSERT OR IGNORE INTO ldb_attributes
- (attr_name, parent_tree_key, objectclass_p)
- VALUES
- ('uid', '', 0);
-
-UPDATE ldb_attributes
- SET case_insensitive_p = 1,
- wildcard_p = 1,
- hidden_p = 0,
- integer_p = 0
- WHERE attr_name = 'uid'
-
-UPDATE ldb_attributes
- SET case_insensitive_p = 1,
- wildcard_p = 0,
- hidden_p = 0,
- integer_p = 0
- WHERE attr_name = 'cn'
-
-UPDATE ldb_attributes
- SET case_insensitive_p = 1,
- wildcard_p = 0,
- hidden_p = 0,
- integer_p = 0
- WHERE attr_name = 'ou'
-
-UPDATE ldb_attributes
- SET case_insensitive_p = 1,
- wildcard_p = 0,
- hidden_p = 0,
- integer_p = 0
- WHERE attr_name = 'dn'
-
diff --git a/source4/lib/ldb/ldb_sqlite3/trees.ps b/source4/lib/ldb/ldb_sqlite3/trees.ps
deleted file mode 100644
index 433a064816..0000000000
--- a/source4/lib/ldb/ldb_sqlite3/trees.ps
+++ /dev/null
@@ -1,1760 +0,0 @@
-%!PS-Adobe-2.0
-%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
-%%Title: trees.dvi
-%%Pages: 7
-%%PageOrder: Ascend
-%%BoundingBox: 0 0 596 842
-%%EndComments
-%DVIPSWebPage: (www.radicaleye.com)
-%DVIPSCommandLine: dvips -f trees.dvi
-%DVIPSParameters: dpi=600, compressed
-%DVIPSSource: TeX output 2000.05.06:2055
-%%BeginProcSet: texc.pro
-%!
-/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
-N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
-mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
-0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
-landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
-mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
-matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
-exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
-statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
-N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
-/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
-/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
-array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
-df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
-definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
-}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
-B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
-1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
-1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
-0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
-sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
-rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
-gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
-/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
-/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
-A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
-get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
-ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
-fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
-{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
-chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
-1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
-forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
-/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
-}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
-bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
-mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
-SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
-userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
-1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
-index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
-/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
-/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
-(LaserWriter 16/600)]{A length product length le{A length product exch 0
-exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
-end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
-grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
-imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
-exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
-fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
-delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
-B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
-p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
-rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
-
-%%EndProcSet
-TeXDict begin 39158280 55380996 1000 600 600 (trees.dvi)
-@start
-%DVIPSBitmapFont: Fa cmr10 10 6
-/Fa 6 55 df<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485AA212075B
-120F90C7FCA25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F12077F1203A2
-6C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>40
-D<12C07E12707E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7F
-A21480A3EB07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A2
-5BA2485A485AA2485A48C7FC120E5A5A5A5A5A13527CBD20>I<15301578B3A6007FB812
-F8B912FCA26C17F8C80078C8FCB3A6153036367BAF41>43 D<EB03F8EB1FFF90387E0FC0
-9038F803E03901E000F0484813780007147C48487FA248C77EA2481580A3007EEC0FC0A6
-00FE15E0B3007E15C0A4007F141F6C1580A36C15006D5B000F143EA26C6C5B6C6C5B6C6C
-485A6C6C485A90387E0FC0D91FFFC7FCEB03F8233A7DB72A>48 D<EB01C013031307131F
-13FFB5FCA2131F1200B3B3A8497E007FB512F0A31C3879B72A>I<EC3FC0903801FFF001
-0713FC90380FE03E90383F800790387E001F49EB3F804848137F485AA2485A000FEC3F00
-49131E001F91C7FCA2485AA3127F90C9FCEB01FC903807FF8039FF1E07E090383801F049
-6C7E01607F01E0137E497FA249148016C0151FA290C713E0A57EA56C7E16C0A2121FED3F
-807F000F15006C6C5B15FE6C6C5B6C6C485A3900FE07F090383FFFC06D90C7FCEB03FC23
-3A7DB72A>54 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fb cmr7 7 3
-/Fb 3 55 df<EB3F803801FFF03803E0F83807803C48487E001E7F003E1480A2003C1307
-007C14C0A400FC14E0AE007C14C0A36CEB0F80A36CEB1F006C131E6C6C5A3803E0F86CB4
-5A38003F801B277EA521>48 D<13381378EA01F8121F12FE12E01200B3AB487EB512F8A2
-15267BA521>I<EB0FE0EB3FF8EBF81C3801E0063803C01F48485AEA0F005A121E003E13
-1E91C7FC5AA21304EB3FC038FCFFF038FDC078EB003CB4133E48131E141FA2481480A412
-7CA4003C1400123E001E131E143E6C133C6C6C5A3803C1F03801FFC06C6CC7FC19277DA5
-21>54 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fc cmmi10 10 1
-/Fc 1 69 df<0103B7FC4916E018F8903B0007F80007FE4BEB00FFF03F80020FED1FC018
-0F4B15E0F007F0021F1503A24B15F81801143F19FC5DA2147FA292C8FCA25C18035CA213
-0119F84A1507A2130319F04A150FA2010717E0181F4A16C0A2010FEE3F80A24AED7F0018
-7E011F16FE4D5A4A5D4D5A013F4B5A4D5A4A4A5A057FC7FC017F15FEEE03FC91C7EA0FF0
-49EC7FC0B8C8FC16FC16C03E397DB845>68 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fd ectt1000 10 73
-/Fd 73 126 df<D807801307D81FE0EB0F80151F487E486C133F1600007C5CD8FCFC137E
-EAF87C15FE5D14015DA21403D8FCFC5BEA7CF8007F13075D383FF00FD81FE05BA2380780
-1FC75B143F92C7FCA25C147E14FE5CA213015CA213035C13075CA2130F5C131FEC800FED
-3FC0013FEB7FE0140049EBFFF0017E13F9A2D9FE0113F801FC13F0A2120113F8120313F0
-15F90007010013F05B000F14FF49EB7FE0A20007EC3FC06C48EB0F0025417DB92C>37
-D<EA0F80EA1FE0EA3FF0127F13F8A213FCA2123F121F120FEA007CA313FC13F8A2120113
-F01203EA07E0A2EA0FC0EA3F80127FEAFF005A12F812700E1D71B22C>39
-D<143814FC13011303EB07F8EB0FF0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F
-5B485AA2123F90C7FCA25A127EA312FE5AAC7E127EA3127F7EA27F121FA26C7E7F12077F
-12037F6C7E6C7E137FEB3F80EB1FC0EB0FF0EB07F8EB03FC130113001438164272B92C>
-I<127012FC7E7E6C7E6C7EEA0FE06C7E6C7E6C7E6C7E137F7F1480131F14C0130FEB07E0
-A214F01303A214F81301A314FC1300AC130114F8A3130314F0A2130714E0A2EB0FC0131F
-1480133F14005B13FE485A485A485A485AEA3FC0485A48C7FC5A5A1270164279B92C>I<
-EB0380497EA60020140800F8143E00FE14FE00FF13C1EBC7C7EBE7CF003FB512F8000F14
-E0000314806C140038007FFCA248B5FC481480000F14E0003F14F839FFE7CFFEEBC7C7EB
-07C100FE13C000F8143E0020140800001400A66D5A1F247AAA2C>I<147014F8AF003FB6
-12E0B712F8A4C700F8C7FCB0147025267DAB2C>I<EA0F80EA1FE0EA3FF0EA7FF8A213FC
-A3123F121F120F120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012FC12700E17
-718A2C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B708A2C>46
-D<1507ED0F80A2151F16005D153E157E157CA215FC5D14015D14035D14075D140F5D141F
-92C7FC5C143EA2147E147C14FC5C13015C13035C13075C130F5C131F91C8FC5B133EA213
-7E137C13FC5B12015B12035B12075B120F5B121F90C9FCA25A123E127E127C12FC5AA212
-7021417BB92C>I<EB03F8EB0FFE90383FFF80497F90B57E3901FE0FF03903F803F84848
-6C7EEBE0004848137EA248487FA248C7EA1F80A2003E140F007E15C0A3007C140700FC15
-E0AC6C140F007E15C0A46CEC1F80A36C6CEB3F00A26C6C137E6D13FE00075CEBF0016C6C
-485A3901FE0FF06CB55A6D5B6D5BD90FFEC7FCEB03F823357CB32C>I<1307497EA2131F
-A2133F137F13FF5A1207127FB5FC13DF139FEA7C1F1200B3AE007FB512E0B612F0A36C14
-E01C3477B32C>I<EB0FF890387FFF8048B512E00007804814FC391FF80FFE393FE001FF
-903880007F48C7EA3F80007E141F00FE15C0150F6C15E01507A3127E123CC8FCA2150F16
-C0151F1680153F16005D15FE4A5A14034A5A4A5A4A5A4A5AECFF804948C7FC495A495A49
-5AEB3FE0EB7F8049C8FC485A4848EB03C04848EB07E0EA1FE0485A48B6FCB7FCA36C15C0
-23347CB32C>I<000FB512FE4880A35D0180C8FCADEB83FE90389FFF8090B512E015F881
-9038FE03FE9038F000FF01C07F49EB3F8090C7121F6C15C0C8120FA2ED07E0A4123C127E
-B4FC150F16C0A248141F007EEC3F80007FEC7F006C6C5B6D485A391FF80FFC6CB55A6C5C
-000114C06C6C90C7FCEB0FF823347CB22C>53 D<EC3FC0903801FFF801077F011F7F497F
-90387FE07F9039FF003F804848137FEA03F8485A5B000FEC3F004848131E4990C7FC123F
-90C9FCA25A127EEB03FE90381FFF80D8FC7F13E000FDB57EB67E9038FE07FC9038F001FE
-9038C0007F49EB3F8090C7121F16C048140F16E01507A3127EA47E150F6D14C0001F141F
-6D1480000F143F6DEB7F003907F801FE3903FE07FC6CB55A6C5C6D5B011F1380D907FCC7
-FC23357CB32C>I<1278B712C016E0A316C000FCC7EA3F80ED7F0015FE00785CC712014A
-5A4A5A5D140F5D4A5A143F92C7FC5C147E14FE5C13015CA2495AA213075CA3495AA4495A
-A5133F91C8FCAA131E23357CB32C>I<EA0F80EA1FC0EA3FE0EA7FF0A5EA3FE0EA1FC0EA
-0F80C7FCAEEA0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F120013F8A21201EA03
-F01207EA1FE0EA7FC0EAFF80130012FC12700E3071A32C>59 D<1502ED0F80151F157F15
-FF913803FE00EC0FFCEC1FF0EC7FE0ECFF80D903FEC7FC495AEB1FF0495AEBFF80000390
-C8FCEA07FCEA1FF8EA3FE0EAFF8090C9FCA27FEA3FE0EA1FF8EA07FC6CB4FCC67FEB3FE0
-6D7EEB07FC6D7E903800FF80EC7FE0EC1FF0EC0FFCEC03FE913800FF80157F151F150FED
-0200212A7BAD2C>I<007FB612F0B712F8A36C15F0CAFCA8007FB612F0B712F8A36C15F0
-25127DA12C>I<122012F87EB4FC7FEA3FE0EA1FF8EA07FC6CB4FCC67FEB3FE06D7EEB07
-FC6D7E903800FF80EC7FE0EC1FF0EC0FFCEC03FE913800FF80157FA215FF913803FE00EC
-0FFCEC1FF0EC7FE0ECFF80D903FEC7FC495AEB1FF0495AEBFF80000390C8FCEA07FCEA1F
-F8EA3FE0EAFF8090C9FC12FC5A1220212A7BAD2C>I<14FE497EA4497FA214EFA2130781
-A214C7A2010F7FA314C390381F83F0A590383F01F8A490387E00FCA549137E90B512FEA3
-4880A29038F8003FA34848EB1F80A4000715C049130FD87FFEEBFFFC6D5AB514FE6C15FC
-497E27347EB32C>65 D<007FB512E015F8B612FE6C8016C03903F0003FED0FE0ED07F015
-03A2ED01F8A6ED03F0A21507ED0FE0ED1FC0EDFF8090B612005D5D15FF16C09039F0001F
-E0ED07F0ED03F81501ED00FCA216FE167EA616FE16FC1501ED03F8150FED3FF0007FB612
-E016C0B712806CECFE0015F027337FB22C>I<02FF13700107EBE0F84913F9013F13FD49
-13FFEBFF813901FE007F4848131FD807F0130F1507485A491303485A150148C7FCA25A00
-7EEC00F01600A212FE5AAB7E127EA3007F15F06CEC01F8A26C7EA26C6C13036D14F06C6C
-130716E0D803FC131F6C6CEB3FC03A00FF81FF806DB512006D5B010F5B6D13F001001380
-25357DB32C>I<007FB5FCB612C015F0816C803907E003FEEC00FFED7F80153FED1FC0ED
-0FE0A2150716F0150316F81501A4ED00FCACED01F8A3150316F0A2150716E0150FED1FC0
-153FED7F80EDFF00EC03FE007FB55AB65A5D15C06C91C7FC26337EB22C>I<007FB612F0
-B712F8A37E3903F00001A7ED00F01600A4EC01E04A7EA490B5FCA5EBF003A46E5A91C8FC
-A5163C167EA8007FB612FEB7FCA36C15FC27337EB22C>I<007FB612F8B712FCA37ED803
-F0C7FCA716781600A515F04A7EA490B5FCA5EBF001A46E5A92C7FCAD387FFFE0B5FC805C
-7E26337EB22C>I<903901FC038090390FFF87C04913EF017F13FF90B6FC4813073803FC
-01497E4848137F4848133F49131F121F5B003F140F90C7FCA2127EED078092C7FCA212FE
-5AA8913803FFF84A13FCA27E007E6D13F89138000FC0A36C141FA27F121F6D133F120F6D
-137F6C7E6C6C13FF6D5A3801FF076C90B5FC6D13EF011F13CF6DEB0780D901FCC7FC2635
-7DB32C>I<D87FFEEBFFFCB54813FEA36C486C13FCD807E0EB0FC0B190B6FCA59038E000
-0FB3D87FFEEBFFFCB54813FEA36C486C13FC27337EB22C>I<007FB512F8B612FCA36C14
-F839000FC000B3B3A5007FB512F8B612FCA36C14F81E3379B22C>I<D87FFCEB7FF8486C
-EBFFFCA36C48EB7FF8D807C0EB1F80153FED7F00157E5D4A5A14034A5A5D4A5A4A5A143F
-4AC7FC147E5CEBC1F813C3EBC7FCA2EBCFFEEBDFBEEBFFBF141F01FE7F496C7E13F86E7E
-EBF00301E07FEBC001816E7EA2157E153E153F811680ED0FC0A2ED07E0D87FFCEB1FFC48
-6CEB3FFEA36C48EB1FFC27337EB22C>75 D<387FFFE0B57EA36C5BD803F0C8FCB3AE16F0
-ED01F8A8007FB6FCB7FCA36C15F025337DB22C>I<D87FE0EB0FFC486CEB1FFEA26D133F
-007F15FC000F15E001BC137BA4019E13F3A3EB9F01A2018F13E3A21483A2018713C314C7
-A201831383A214EFA201811303A214FFEB80FEA3147C14381400ACD87FF0EB1FFC486CEB
-3FFEA36C48EB1FFC27337EB22C>I<D87FF0EB7FFC486CEBFFFEA27F007FEC7FFCD807FE
-EB07C013DEA213DF13CFA2148013C714C0A213C314E0A213C114F0A213C014F8A2147CA3
-143EA2141E141FA2140F1587A2140715C7A2140315E71401A215F71400A215FFD87FFC13
-7F487E153FA26C48EB1F8027337EB22C>I<EB7FFF0003B512E0000F14F848804880EBE0
-03EB800048C7127FA2007E80A300FE158048141FB3A86C143FA2007E1500A3007F5CA26C
-6C13FEEBF00790B5FC6C5C6C5C000314E0C66C90C7FC21357BB32C>I<007FB512C0B612
-F88115FF6C15802603F00013C0153FED0FE0ED07F0A2150316F81501A6150316F01507A2
-ED0FE0ED3FC015FF90B61280160015FC5D15C001F0C8FCB0387FFF80B57EA36C5B25337E
-B22C>I<EB7FFF0003B512E0000F14F848804880EBF007EB800048C7127FA2007E80A300
-FE158048141FB3A7EB01F0EB03F800FE143F267E01FC1300A2EB00FE007F5C147FD83F80
-13FEEBF03F90B5FC6C5C6C5C000314E0C67E90380007F0A26E7EA26E7EA26E7EA2157FA2
-153E21407BB32C>I<387FFFFCB67E15E015F86C803907E007FE1401EC007F6F7E151FA2
-6F7EA64B5AA2153F4BC7FCEC01FE140790B55A5D15E081819038E007FCEC01FE1400157F
-81A8160FEE1F80A5D87FFEEB1FBFB5ECFF00815E6C486D5AC8EA01F029347EB22C>I<90
-381FF80790B5EA0F804814CF000714FF5A381FF01F383FC003497E48C7FC007E147F00FE
-143F5A151FA46CEC0F00007E91C7FC127F7FEA3FE0EA1FFCEBFFC06C13FC0003EBFFC06C
-14F06C6C7F01077F9038007FFEEC07FF02001380153FED1FC0A2ED0FE0A20078140712FC
-A56CEC0FC0A26CEC1F806D133F01E0EB7F009038FE01FF90B55A5D00F914F0D8F83F13C0
-D8700790C7FC23357CB32C>I<007FB612FCB712FEA43AFC007E007EA70078153CC71400
-B3AF90383FFFFCA2497F6D5BA227337EB22C>I<3B7FFF803FFFC0B56C4813E0A36C496C
-13C03B03F00001F800B3AF6D130300015DA26D130700005D6D130F017F495A6D6C485AEC
-E0FF6DB5C7FC6D5B010313F86D5B9038003F802B3480B22C>I<D87FFCEB7FFC486CEBFF
-FEA36C48EB7FFCD80FC0EB07E06D130F000715C0A36D131F00031580A36D133F00011500
-A36D5B0000147EA4017E5BA46D485AA490381F83F0A4010F5B14C7A301075BA214EFA201
-035BA214FFA26D90C7FCA46D5A27347EB22C>I<D87FF0EB07FF486C491380A36C486D13
-00001FC8127CA46C6C5CA76C6C495AA4143E147FA33A03E0FF83E0A214F7A201E113C3A3
-000101E35BA201F113C701F313E7A314C1A200005DA201F713F71480A301FF13FF017F91
-C7FC4A7EA4013E133E29347FB22C>I<3A3FFF03FFE0484913F0148714076C6D13E03A01
-F800FE007F0000495A13FE017E5BEB7F03013F5B1487011F5B14CF010F5B14FF6D5BA26D
-90C7FCA26D5AA26D5AA2497EA2497EA2497F81EB0FCF81EB1FC7EC87F0EB3F83EC03F8EB
-7F01017E7FEBFE00497F0001147E49137F000380491480151FD87FFEEBFFFC6D5AB514FE
-6C15FC497E27337EB22C>I<D87FFCEB7FFC486CEBFFFEA36C48EB7FFCD807F0EB0FC015
-1F000315806D133F12016DEB7F0012006D137E017E13FE017F5BEB3F01EC81F8131FEC83
-F0EB0FC314C7903807E7E0A201035B14EF6DB45AA292C7FC7F5C147EB0903807FFE0497F
-A36D5B27337EB22C>I<387FFFFCB512FEA314FC00FCC7FCB3B3B3B512FC14FEA36C13FC
-17416FB92C>91 D<127012F8A27E127C127E123E123F7EA27F120F7F12077F12037F1201
-7F12007F137C137E133EA2133F7F80130F80130780130380130180130080147C147E143E
-A2143F8081140F81140781140381140181140081157CA2157E153E153F811680150FA2ED
-070021417BB92C>I<387FFFFCB512FEA37EC7127EB3B3B3387FFFFEB5FCA36C13FC1741
-7DB92C>I<EB07C0EB1FF0EB7FFC48B5FC000714C0001F14F0397FFC7FFC39FFF01FFEEB
-C007EB0001007CEB007C003014181F0C7AAE2C>I<007FB6FCB71280A46C150021067B7D
-2C>I<1338137CEA01FC1203EA07F813F0EA0FC0EA1F80A2EA3F00123E127E127CA212FC
-5AA3EAFFC013E013F013F8A2127FA2123F13F0EA1FE0EA07C00E1D72B82C>I<3801FFF0
-000713FE001F6D7E15E048809038C01FF81407EC01FC381F80000006C77EC8127EA3ECFF
-FE131F90B5FC1203120F48EB807E383FF800EA7FC090C7FC12FE5AA47E007F14FEEB8003
-383FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A003FF007FC27247CA32C>I<EA7FF048
-7EA3127F1201AAEC1FE0ECFFF801FB13FE90B6FC16809138F07FC09138801FE091380007
-F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07F0150F
-9138801FE09138E07FC091B51280160001FB5B01F813F83900F03FC027337FB22C>I<90
-3803FFE0011F13F8017F13FE48B5FC48804848C6FCEA0FF0485A49137E4848131890C9FC
-5A127EA25AA8127EA2127F6C140F6DEB1F806C7E6D133F6C6CEB7F003907FE03FF6CB55A
-6C5C6C6C5B011F13E0010390C7FC21247AA32C>I<EC0FFE4A7EA380EC003FAAEB07F8EB
-3FFE90B512BF4814FF5A3807FC0F380FF00348487E497E48487F90C7FC007E80A212FE5A
-A87E007E5CA2007F5C6C7E5C6C6C5A380FF0073807FC1F6CB612FC6CECBFFE6C143FEB3F
-FC90390FF01FFC27337DB22C>I<EB03FE90381FFFC0017F13F048B57E48803907FE03FE
-390FF800FFD81FE0EB3F805B4848EB1FC090C7120F5A007E15E015075AB7FCA416C000FC
-C9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0130F6C6CEB3FC001FF13FF000190B5
-12806C1500013F13FC010F13F00101138023247CA32C>I<ED03F8903907F80FFC90391F
-FE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003133E3A0FE001FC1CD9C0001300
-001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC0FF048B5FC5D481480D99FFEC7
-FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF804815E04815F03A3FC0001FF848
-C7EA03FC007E1400007C157C00FC157E48153EA46C157E007E15FCD87F801303D83FE0EB
-0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13F8010713C028387EA42C>103
-D<EA7FF0487EA3127F1201AAEC1FE0EC7FFC9038F9FFFE01FB7F90B6FC9138F03F80ECC0
-1F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029337FB22C>I<
-1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7EA2EA0007B3A8007F
-B512FCB612FEA36C14FC1F3479B32C>I<EA7FE0487EA3127F1201AA91381FFFF04A13F8
-A36E13F0913800FE004A5A4A5A4A5A4A5A4A5A4A5A4AC7FC14FEEBF1FC13F3EBF7FE90B5
-FCA2EC9F80EC0FC001FE7FEBFC07496C7E496C7E811400157E811680151F3A7FFFC0FFFC
-B500E113FEA36C01C013FC27337EB22C>107 D<387FFFE0B57EA37EEA0003B3B3A5007F
-B61280B712C0A36C158022337BB22C>I<3A7F83F007E09039CFFC1FF83AFFDFFE3FFCD8
-7FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01F013E001E013C0A301C01380B3
-3B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0023F137F2D2481A32C>I<397F
-F01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038F03F80ECC01F02807FEC000F5B
-5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029247FA32C>I<EB07FCEB1FFF017F
-13C048B512F048803907FC07FC390FF001FE48486C7E0180133F003F158090C7121F007E
-EC0FC0A348EC07E0A76C140F007E15C0A2007F141F6C15806D133F6C6CEB7F006D5B6C6C
-485A3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07FC23247CA32C>I<397FF01FE0
-39FFF8FFF801FB13FE90B6FC6C158000019038F07FC09138801FE091380007F049EB03F8
-5BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE0
-9138E07FC091B51280160001FB5B01F813F8EC3FC091C8FCAD387FFFE0B57EA36C5B2736
-7FA32C>I<903903FC078090391FFF0FC0017F13CF48B512EF4814FF3807FE07380FF001
-48487E49137F4848133F90C7FC48141F127E150F5AA87E007E141FA26C143F7F6C6C137F
-6D13FF380FF0033807FC0F6CB6FC6C14EF6C6C138F6D130FEB07F890C7FCAD0203B5FC4A
-1480A36E140029367DA32C>I<D87FFEEB3FC0B53801FFF0020713F8021F13FC6C5B3900
-3F7FE1ECFF019138FC00F84A13704A13005CA25C5CA391C8FCAF007FB512E0B67EA36C5C
-26247EA32C>I<90387FF8700003B512F8120F5A5A387FC00F387E00034813015AA36CEB
-00F0007F140013F0383FFFC06C13FE6CEBFF80000314E0C66C13F8010113FCEB0007EC00
-FE0078147F00FC143F151F7EA26C143F6D133E6D13FE9038F007FC90B5FC15F815E000F8
-148039701FFC0020247AA32C>I<131E133FA9007FB6FCB71280A36C1500D8003FC8FCB1
-ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6DB51280160001035B6D13F89038003FE023
-2E7EAD2C>I<3A7FF003FF80486C487FA3007F7F0001EB000FB3A3151FA2153F6D137F39
-00FE03FF90B7FC6D15807F6D13CF902603FE07130029247FA32C>I<3A3FFF03FFF04801
-8713F8A36C010313F03A00FC007E005D90387E01F8013F5BEB1F83EC87E090380FCFC090
-3807EF80EB03FF6D90C7FC5C6D5A147C14FE130180903803EF80903807CFC0EB0FC7EC83
-E090381F01F0013F7FEB7E00017C137C49137E0001803A7FFF01FFFC1483B514FE6C15FC
-140127247EA32C>120 D<3A7FFF01FFFCB5008113FE148314816C010113FC3A03E0000F
-806C7E151F6D140012005D6D133E137C017E137E013E137CA2013F13FC6D5BA2EB0F815D
-A2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7FC80A2143EA2147E147CA2
-14FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF806C90C8FC6C5A6C5AEA07E0
-27367EA32C>I<15FF02071380141F147F91B512004913C04AC7FCEB03F85CB31307EB1F
-E013FF007F5BB55A49C8FC6D7E6C7FC67F131FEB07F01303B380EB01FEECFFC06D13FF6E
-1380141F14070200130021417BB92C>123 D<127812FCB3B3B3A9127806416DB92C>I<EA
-7FC0EAFFF813FE6D7E6C7FC67F131FEB07F01303B380EB01FEECFFC06D13FF6E1380141F
-147F91B512004913C04AC7FCEB03F85CB31307EB1FE013FF007F5BB55A49C8FC13F8EA7F
-C021417BB92C>I E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fe ecti1000 10 33
-/Fe 33 122 df<EE3FFC4BB51280923907E007C092391F8001E0DB3F0013F0037E13034B
-1307A24A5A18E04A48EB038094C7FCA314075DA4140F5DA3010FB7FCA25F903A001F8000
-7EA217FE023F5C92C7FCA216015F5C147E16035FA214FE4A13075FA30101140F5F4AECC1
-C0A2161F1783010316805CA2EF870013074A5CEE0F8EEE079EEE03FC010FEC00F04A91C7
-FCA35C131FA2001C90CAFC127E5BEAFE3E133C137CEAF878EA78F0EA3FE0EA0F80344C82
-BA2F>28 D<150C151C153815F0EC01E0EC03C0EC0780EC0F00141E5C147C5C5C495A1303
-495A5C130F49C7FCA2133EA25BA25BA2485AA212035B12075BA2120F5BA2121FA290C8FC
-A25AA2123EA2127EA2127CA412FC5AAD1278A57EA3121C121EA2120E7EA26C7E6C7EA212
-001E5274BD22>40 D<140C140E80EC0380A2EC01C015E0A2140015F0A21578A4157C153C
-AB157CA715FCA215F8A21401A215F0A21403A215E0A21407A215C0140F1580A2141F1500
-A2143EA25CA25CA2495AA2495A5C1307495A91C7FC5B133E133C5B5B485A12035B48C8FC
-120E5A12785A12C01E527FBD22>I<4B7EA3150393C8FCA35D1506A3150E150CA3151C15
-18A315381530A31570B912E0A2C80060C8FC15E05DA314015DA3140392C9FCA35C1406A3
-140E140CA3141C1418A2333275AD40>43 D<EA03C0EA07F0120F121F13F8A313F0EA07B0
-EA003013701360A213E013C01201EA038013005A120E5A5A5A5A5A0D197A8819>I<120E
-EA3F80127F12FFA31300127E123C0909778819>46 D<0103B612FEEFFFC018F0903B0007
-F8000FF84BEB03FCEF00FE020F157FF03F804B141F19C0021F150F19E05D1807143F19F0
-5DA2147FA292C8FCA25C180F5CA2130119E04A151FA2130319C04A153FA201071780187F
-4A1600A2010F16FEA24A4A5A60011F15034D5A4A5D4D5A013F4B5A173F4A4AC7FC17FC01
-7FEC03F84C5A91C7EA1FC04949B45A007F90B548C8FCB712F016803C397CB83F>68
-D<0103B512F8A390390007F8005DA2140FA25DA2141FA25DA2143FA25DA2147FA292C7FC
-A25CA25CA21301A25CA21303A25CA21307A25CA2130FA25CA2131FA25CA2133FA25CA213
-7FA291C8FC497EB6FCA25C25397CB820>73 D<0107B512FCA25E9026000FF8C7FC5D5D14
-1FA25DA2143FA25DA2147FA292C8FCA25CA25CA21301A25CA21303A25CA21307A25CA213
-0F170C4A141CA2011F153C17384A1478A2013F157017F04A14E01601017F140317C091C7
-1207160F49EC1F80163F4914FF000102071300B8FCA25E2E397BB834>76
-D<ED03FE92383FFFC09238FC07F0913903E001F891390F80007C023FC77E027E8002F815
-804948EC0FC0EB07E04948EC07E0131F4A15F049C81203137E01FE16F8485AA2485AA248
-5AA2120F5B001F16075B123FA34848ED0FF0A448C9EA1FE0A3EF3FC0A21880177F18005F
-5F16015F6C4B5A4C5AA24C5A6C4B5A6D4A5A001F93C7FC6D147E000F5D6C6CEB03F06C6C
-495A6C6CEB0F806C6C013FC8FC90383F01FC90381FFFE0010190C9FC353D74BA40>79
-D<ED03FE92383FFFC09238FC07F0913903E001F891390FC0007C023FC77E027E804A1580
-D901F0EC0FC013074948EC07E0495A4A15F049C8FC49150301FE16F8485AA2485AA2485A
-A2120F491507121FA2485AA34848ED0FF0A448C9EA1FE0A3EF3FC0A21880177F4817005F
-5F16015F007F4B5A5F91380F800791393FE00FE06C903970601FC0902680E0305B261F81
-C049C7FC913880187ED80FC35C3A07E30019F00003EC1FE0D801FB14806CB46C48C8FC90
-263F81FC13186DB45A01010138133890C7003C1330177017F05FED3E03ED3F07EEFFC05F
-A294C7FC5E6F5A6F5AED07E0354B74BA40>81 D<92383FC00E913901FFF01C020713FC91
-391FC07E3C91393F001F7C027CEB0FF84A130749481303495A4948EB01F0A2495AA2011F
-15E091C7FCA34915C0A36E90C7FCA2806D7E14FCECFF806D13F015FE6D6D7E6D14E00100
-80023F7F14079138007FFC150F15031501A21500A2167C120EA3001E15FC5EA3003E4A5A
-A24B5AA2007F4A5A4B5A6D49C7FC6D133ED8F9F013FC39F8FC03F839F07FFFE0D8E01F13
-8026C003FCC8FC2F3D7ABA2F>83 D<0007B812E0A25AD9F800EB001F01C049EB07C0485A
-D900011403121E001C5C003C17801403123800785C00701607140700F01700485CA2140F
-C792C7FC5DA2141FA25DA2143FA25DA2147FA292C9FCA25CA25CA21301A25CA21303A25C
-A21307A25CA2130FA25CEB3FF0007FB512F8B6FCA2333971B83B>I<14F8EB07FE90381F
-871C90383E03FE137CEBF801120148486C5A485A120FEBC001001F5CA2EA3F801403007F
-5C1300A21407485C5AA2140F5D48ECC1C0A2141F15831680143F1587007C017F1300ECFF
-076C485B9038038F8E391F0F079E3907FE03FC3901F000F0222677A42A>97
-D<133FEA1FFFA3C67E137EA313FE5BA312015BA312035BA31207EBE0F8EBE7FE9038EF0F
-80390FFC07C013F89038F003E013E0D81FC013F0A21380A2123F1300A214075A127EA214
-0F12FE4814E0A2141F15C05AEC3F80A215005C147E5C387801F8007C5B383C03E0383E07
-C0381E1F80D80FFEC7FCEA01F01C3B77B926>I<147F903803FFC090380FC1E090381F00
-70017E13784913383901F801F83803F003120713E0120FD81FC013F091C7FC485AA2127F
-90C8FCA35A5AA45AA3153015381578007C14F0007EEB01E0003EEB03C0EC0F806CEB3E00
-380F81F83803FFE0C690C7FC1D2677A426>I<ED01F815FFA3150316F0A21507A216E0A2
-150FA216C0A2151FA21680A2153FA202F81300EB07FE90381F877F90383E03FF017C5BEB
-F80112013803F00048485B120FEBC001121F5DEA3F801403127F01005BA214075A485CA2
-140FA248ECC1C0A2141F15C3ED8380143F1587007C017F1300ECFF076C485B9038038F8E
-391F0F079E3907FE03FC3901F000F0253B77B92A>I<147F903803FFC090380FC1E09038
-3F00F0017E13785B485A485A485A120F4913F8001F14F0383F8001EC07E0EC1F80397F81
-FF00EBFFF8148090C8FC5A5AA55AA21530007C14381578007E14F0003EEB01E0EC03C06C
-EB0F806CEB3E00380781F83803FFE0C690C7FC1D2677A426>I<ED07C0ED1FF0ED3E38ED
-7C3CEDF8FC15F9140115F1020313F8EDF0F0160014075DA4140F5DA4141F5D010FB512C0
-5B16809039003F800092C7FCA45C147EA414FE5CA413015CA413035CA413075CA4130F5C
-A3131F5CA391C8FC5B121CEA7E3EA2EAFE3C137C1378EAF8F01278EA3FC0EA0F80264C82
-BA19>I<EC07C0EC3FF09138FC38E0903901F01FF0EB03E0903807C00FEB0F80011F1307
-D93F0013E05B017E130F13FE4914C01201151F1203491480A2153F1207491400A25DA249
-137EA215FEA25D00031301140314076C6C485A0000131FEB787BEB3FF390380FC3F0EB00
-031407A25DA2140F5D121C007E131F5D00FE49C7FC147E5C387801F8387C07E0381FFF80
-D803FEC8FC24367CA426>I<EB03F0EA01FFA3EA00075CA3130F5CA3131F5CA3133F91C8
-FCA35B90387E07F0EC1FFCEC783E9038FFE01F02C01380EC800F1400485A16C05B49EB1F
-8012035BA2153F000715005BA25D000F147E5B15FE5D121FD98001131C15F8163C003F01
-031338010013F0A216704814E0007E15F016E0EDE1C000FE903801E38048903800FF0000
-38143C263B7BB92A>I<EB01C0EB07E014F0130F14E01307EB038090C7FCAB13F0EA03FC
-EA071EEA0E1F121CA212385B1270A25BEAF07E12E013FEC65AA212015B1203A25B12075B
-A2000F13E013C013C1001F13C01381A2EB83801303EB0700A2130E6C5AEA07F8EA01E014
-3879B619>I<EB0FC0EA07FFA3EA001F1480A2133FA21400A25BA2137EA213FEA25BA212
-01A25BA21203A25BA21207A25BA2120FA25BA2121FA25BA2123FA290C7FCA25AA2EA7E0E
-A212FE131EEAFC1CA2133C133812F81378EA7870EA7CE0121FEA0F80123B79B915>108
-D<D801E001FEEB07F03C07F803FF801FFC3C0E3C0F07C0783E3C1E3E3C03E1E01F261C1F
-78D9F3C013803C383FF001F7800F02E01400007801C013FE007018C002805B4A4848EB1F
-80EAF07FD8E07E5CA200000207143F01FE1700495CA2030F5C0001177E495C18FE031F5C
-120349DA8001131C18F8033F153C00070403133849020013F0A24B1570000F17E049017E
-15F019E003FEECE1C0001FEE01E34949903800FF000007C70038143C3E2679A444>I<D8
-01E013FE3A07F803FF803A0E3C0F07C03A1E3E3C03E0261C1F787F39383FF00114E00078
-13C000708114804A485AEAF07FEAE07EA20000140701FE5C5BA2150F00015D5B151F5E12
-034990383F8380160316070007027F130049137EA2160E000F147C49141E161C5E001FEC
-3C7849EB1FE00007C7EA0780292679A42F>I<147F903803FFC090380FC1F090381F00F8
-017E137C5B4848137E4848133E0007143F5B120F485AA2485A157F127F90C7FCA215FF5A
-4814FEA2140115FC5AEC03F8A2EC07F015E0140F007C14C0007EEB1F80003EEB3F00147E
-6C13F8380F83F03803FFC0C648C7FC202677A42A>I<9039078007C090391FE03FF09039
-3CF0787C903938F8E03E9038787FC00170497EECFF00D9F0FE148013E05CEA01E113C15C
-A2D80003143FA25CA20107147FA24A1400A2010F5C5E5C4B5A131F5EEC80035E013F495A
-6E485A5E6E48C7FC017F133EEC70FC90387E3FF0EC0F8001FEC9FCA25BA21201A25BA212
-03A25B1207B512C0A3293580A42A>I<3903C003F0390FF01FFC391E783C0F381C7C703A
-3C3EE03F8038383FC0EB7F800078150000701300151CD8F07E90C7FCEAE0FE5BA2120012
-015BA312035BA312075BA3120F5BA3121F5BA3123F90C9FC120E212679A423>114
-D<14FE903807FF8090380F83C090383E00E04913F00178137001F813F00001130313F0A2
-15E00003EB01C06DC7FC7FEBFFC06C13F814FE6C7F6D13807F010F13C01300143F141F14
-0F123E127E00FE1480A348EB1F0012E06C133E00705B6C5B381E03E06CB45AD801FEC7FC
-1C267AA422>I<EB0380EB07C0130FA4131F1480A3133F1400A35B137E007FB5FCA2B6FC
-3800FC00A312015BA312035BA312075BA3120F5BA3121FEB801CA2143C003F1338EB0078
-147014F014E0EB01C0EA3E03381F0780380F0F00EA07FCEA01F0183579B31C>I<01F013
-0ED803FC133FD8071EEB7F80EA0E1F121C123C0038143F49131F0070140FA25BD8F07E14
-0000E08013FEC6485B150E12015B151E0003141C5BA2153C000714385B5DA35DA24A5A14
-0300035C6D48C7FC0001130E3800F83CEB7FF8EB0FC0212679A426>118
-D<903907E007C090391FF81FF89039787C383C9038F03E703A01E01EE0FE3803C01F0180
-13C0D8070014FC481480000E1570023F1300001E91C7FC121CA2C75AA2147EA214FEA25C
-A21301A24A1370A2010314F016E0001C5B007E1401010714C000FEEC0380010F1307010E
-EB0F0039781CF81E9038387C3C393FF03FF03907C00FC027267CA427>120
-D<13F0D803FCEB01C0D8071EEB03E0D80E1F1307121C123C0038140F4914C01270A24913
-1FD8F07E148012E013FEC648133F160012015B5D0003147E5BA215FE00075C5BA214015D
-A314035D14070003130FEBF01F3901F87FE038007FF7EB1FC7EB000F5DA2141F003F5C48
-133F92C7FC147E147C007E13FC387001F8EB03E06C485A383C1F80D80FFEC8FCEA03F023
-3679A428>I E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Ff cmsy10 10 1
-/Ff 1 16 df<EB1FF0EBFFFE487F000714C04814E04814F04814F8A24814FCA3B612FEA9
-6C14FCA36C14F8A26C14F06C14E06C14C0000114006C5BEB1FF01F1F7BA42A>15
-D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fg ecbx1000 10 36
-/Fg 36 119 df<913803FFC0027F13F00103B512FC010FEB00FED93FF8133FD97FE0EBFF
-8049485A5A1480484A13C04A6C1380A36F1300167E93C7FCA592383FFFC0B8FCA4000390
-C7FCB3ABB5D8FC3F13FFA4303A7EB935>28 D<B61280A819087F9620>45
-D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D0D798C1B>I<141E143E
-14FE1307137FB5FCA3138FEA000FB3B3A5007FB61280A4213679B530>49
-D<EB0FFE90387FFFC048B512F0000714FC390FE03FFF261F800F1380263F000313C0D87F
-8014E0EBE00100FF6D13F07FA2ED7FF8A46C5A6C5A0006C7FCC8FCEDFFF0A216E05C16C0
-4A138016004A5A4A5AEC1FF05D4A5A4AC7FC14FE495AD903F01378495A495A495A49C712
-F8017C14F05B49130148B6FC5A5A5A5A5A4815E0B7FCA425367BB530>I<EC0FF8ECFFFE
-0103EBFF8090390FF80FC090393FE003E090397F8001F09038FF000F48EC1FF84848133F
-485A120F5B121FA2003FEC1FF0ED0FE0484890C7FCA31408EC7FF039FFF1FFFC01F313FF
-D9F78013809039FF007FC049EB3FE04914F0ED1FF85B16FCA34914FEA4127FA5123F16FC
-A26C7E16F8000F143F6D14F0000715E06C6CEB7FC03A01FF81FF806C90B51200013F13FC
-010F13F00101138027377CB530>54 D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3F
-E0EA0F80C7FCABEA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D2579A41B
->58 D<B812C017FC17FF18C028007FF000037F04007F717E717E171F84A2717EA74D5AA2
-60173F4D5A4D5A4C13C0040F5B91B600FCC7FCA2EFFF8002F0C713F0EF3FF8717E717E71
-7E19807113C0A319E0A719C0A25F4D138019005FEF7FFE4C485AB912F018C095C7FC17F0
-3B397DB844>66 D<DB3FFCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00
-FF3F4901C0EB1FFFD91FFEC77E49481403D97FF080494880485B48177F4849153F4890C9
-FC181F485A180F123F5B1807127FA24993C7FC12FFAD127F7FF003C0123FA27F001F1707
-A26C6C1780180F6C6D16006C6D5D6C173E6C6D157ED97FF85D6D6C4A5A6DB44A5A010701
-C0EB0FE06D01FCEBFF80010090B548C7FC021F14F8020314E09126003FFEC8FC3A3B7BB9
-45>I<B87E17F817FF18C028007FF8000713F09338007FF8EF1FFE717E050313807113C0
-A27113E0F07FF0A2F03FF8A219FC181FA219FEA419FFAC19FEA419FC183FA219F8187F19
-F0F0FFE0A24D13C04D13804D1300EF1FFEEF7FFC933807FFF0B912C095C7FC17FC178040
-397DB849>I<B612FCA439007FF800B3B3ADB612FCA41E397DB824>73
-D<B7FCA426007FF8C9FCB3ACEF0780A5170F1800A35FA25FA25F5F5E5EEE0FFE167FB8FC
-A431397DB839>76 D<B500F80403B512F06E5EA26E5ED8007FF1E000A2D97BFF161EA201
-796D5DA201786D5DA26E6C5DA36E6C4A5AA26E6C4A5AA26E6C4A5AA26E6C4A5AA26E6C14
-1EA36E6D5BA26E6D5BA26F6C5BA26F6C485AA36F6C485AA26F6C485AA26F6C48C7FCA292
-3803FF1EA36F13BCA26F13F8A2705AA2705AA213FCB500FC6D4848B612F0A2EE0F80EE07
-0054397DB85B>I<B500FC0203B512F0A28080C66C6D90390003F0006F6E5A81017B7F13
-798101787F6E7E6E7E6E7F6E7FA26E7F6E7F6E7F6E7F6F7E153F826F13806F13C06F13E0
-6F13F06F13F88117FCEE7FFEEE3FFF7013817013C17013E18218F17013F97013FDEF7FFF
-8383A28383838383187FA2183F181F01FC160FB500FC150718031801A244397DB84B>I<
-EDFFF8020FEBFF80027F14F0903A01FFC01FFC010790380007FFD91FFC010113C0D93FF0
-6D6C7E49486E7E49486E7E48496E7E48834890C86C7EA248486F1380A248486F13C0A200
-3F18E0A348486F13F0A400FF18F8AC007F18F06D5DA3003F18E0A26D5D001F18C0A26C6C
-4B13806C18006E5C6C6D4A5A6C5F6C6D4A5A6D6C4A5AD93FFC49485A6DB401075B0107D9
-C01F90C7FC010190B512FC6D6C14F0020F1480020001F8C8FC3D3B7BB948>I<B8FC17F0
-17FEEFFF8028007FF8000F13C0040113E07013F0EF7FF8EF3FFCA2EF1FFEA218FFA818FE
-A2EF3FFCA2EF7FF8EFFFF04C13E0040F13C091B7120017FC17E002F8C9FCB3A4B612FCA4
-38397DB841>I<EDFFF8020FEBFF80027F14F0903A01FFE03FFC010790380007FFD91FFC
-010113C049486D7FD97FE0EC3FF049486E7E488348496E7E4890C86C7EA248486F1380A2
-001F18C04981003F18E0A3007F18F04981A300FF18F8AC007F18F0A36D5D003F18E0A36C
-6C4B13C0A2000FDA1FC014806C6C90267FF0071300EDFFF86C903A81F07C0FFE6C903AC3
-C01E1FFC6CDA800F5BD97FE3ECBFF0D93FF36DB45AD91FFF5D010701C091C7FC01019038
-F01FFC6D6CB500F01308020F6E131C0200EBF9FC92260001FE133C9438FF80FC18FF8219
-F8A28319F0A27113E0A27113C0711380711300EF01FC3E4A7BB948>I<D907FF130E013F
-EBE01E90B5EAF83E0003ECFE7E3A07FC01FFFE390FF0001F4848130F4848130349130100
-7F140090C8FC167E5A163EA27F161E7F7F6D91C7FC13FC387FFFE014FEECFFF06C14FE6F
-7E6C816C15F06C816C81C681133F010F801301D9000F1480EC007F030F13C01503818100
-F0157FA3163FA27E17807E167F6C16007E6D14FE01E0495A01F813039039FF801FF800FC
-90B512E0D8F83F5CD8F00749C7FC39E0007FF02A3B7BB935>83 D<B600FC011FB512C0A4
-26007FF8C8381FC000725AB3B3181F013F94C7FC8060011F163E6D6C157E187C6D6C15FC
-6D6D495A6D6DEB07F06D01F0EB1FE0DA7FFEEBFFC0021FB6C8FC02075C020014F0030F13
-80423A7DB849>85 D<B600F00103B512E0A4C601F0C83807F0006E5E017F5F6E150FA201
-3F5F6E151F011F94C7FC6E5D6D163E6F147E6D167CA26F14FC6D5E6F13016D5E6F13036D
-5E811707027F5D6F130F023F5D6F131F021F92C8FC815F6E143EEE807E6E147CEEC0FC6E
-5C16E016E16E5C16F36E5C16FF6F5BA36F5BA26F90C9FCA26F5AA36F5AA26F5AA26F5A43
-3A7EB848>I<B6D8E01FB500FC90383FFFFCA4000101F0C7D83FFCC8EA7E006C71153C17
-1F6E197C017F701578836E7014F8013F6F5E6E1801011F4B6D5CA26E18036D4B6D5CA26D
-6D496D495A173C6F170F6D037C6D91C7FCEF787F6F5F6D4B6C6C131E816D02016E5BEFE0
-1F03F8177C027F01036E13784D7E03FCEE80F8023F49486C5C15FE021F010FEDC1E04D7E
-03FF16C36E49EDE3C0041E7F049E15F76E01BC6D5C04FC15FF6E95C8FC4C80A26E5F4C14
-3F6E5F4C141FA2037F5E4C140FA26F486E5AA2031F5E93C812036F5E5E3A7EB863>I<13
-FFB5FCA412077EAF4AB47E020F13F0023F13FC9138FE03FFDAF00013804AEB7FC00280EB
-3FE091C713F0EE1FF8A217FC160FA217FEAA17FCA3EE1FF8A217F06E133F6EEB7FE06E14
-C0903AFDF001FF80903AF8FC07FE009039F03FFFF8D9E00F13E0D9C00390C7FC2F3A7EB9
-35>98 D<EE7F80ED7FFFA4150381AF903801FF81010F13F1013F13FD9038FFC07F0003EB
-001FD807FC1307000F8048487F5B123FA2485AA312FFAA127FA27F123FA26C6C5B000F5C
-6C6C5B6C6C4913C02701FF80FD13FE39007FFFF9011F13E1010113012F3A7DB935>100
-D<903803FF80011F13F0017F13FC3901FF83FE3A03FE007F804848133F484814C0001FEC
-1FE05B003FEC0FF0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA36C7E1678121F
-6C6C14F86D14F000071403D801FFEB0FE06C9038C07FC06DB51200010F13FC010113E025
-257DA42C>I<EC1FF0903801FFFC010713FF90391FF87F8090383FE0FFD9FFC113C0A248
-1381A24813016E1380A2ED3E0092C7FCA8B6FCA4000390C8FCB3ABB512FEA4223A7DB91D
->I<161FD907FEEBFFC090387FFFE348B6EAEFE02607FE07138F260FF801131F48486C13
-8F003F15CF4990387FC7C0EEC000007F81A6003F5DA26D13FF001F5D6C6C4890C7FC3907
-FE07FE48B512F86D13E0261E07FEC8FC90CAFCA2123E123F7F6C7E90B512F8EDFF8016E0
-6C15F86C816C815A001F81393FC0000F48C8138048157F5A163FA36C157F6C16006D5C6C
-6C495AD81FF0EB07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B377DA530>I<
-EA01F0EA07FC487EA2487EA56C5AA26C5AEA01F0C8FCA913FF127FA412077EB3A9B512F8
-A4153B7DBA1B>105 D<13FFB5FCA412077EAF92380FFFE0A4923803FC0016F0ED0FE0ED
-1F804BC7FC157E5DEC03F8EC07E04A5A141FEC7FE04A7E8181A2ECCFFEEC0FFF496C7F80
-6E7F6E7F82157F6F7E6F7E82150F82B5D8F83F13F8A42D3A7EB932>107
-D<13FFB5FCA412077EB3B3ACB512FCA4163A7DB91B>I<01FED97FE0EB0FFC00FF902601
-FFFC90383FFF80020701FF90B512E0DA1F81903983F03FF0DA3C00903887801F000749DA
-CF007F00034914DE6D48D97FFC6D7E4A5CA24A5CA291C75BB3A3B5D8FC1FB50083B512F0
-A44C257DA451>I<01FEEB7FC000FF903803FFF8020F13FE91381F03FFDA3C0113800007
-13780003497E6D4814C05CA25CA291C7FCB3A3B5D8FC3F13FFA430257DA435>I<903801
-FFC0010F13F8017F13FFD9FF807F3A03FE003FE048486D7E48486D7E48486D7EA2003F81
-491303007F81A300FF1680A9007F1600A3003F5D6D1307001F5DA26C6C495A6C6C495A6C
-6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029257DA430>I<9038FE03F000FFEB
-0FFEEC3FFF91387C7F809138F8FFC000075B6C6C5A5CA29138807F80ED3F00150C92C7FC
-91C8FCB3A2B512FEA422257EA427>114 D<90383FF0383903FFFEF8000F13FF381FC00F
-383F0003007E1301007C130012FC15787E7E6D130013FCEBFFE06C13FCECFF806C14C06C
-14F06C14F81203C614FC131F9038007FFE140700F0130114007E157E7E157C6C14FC6C14
-F8EB80019038F007F090B512C000F8140038E01FF81F257DA426>I<130FA55BA45BA25B
-5BA25A1207001FEBFFE0B6FCA3000390C7FCB21578A815F86CEB80F014816CEBC3E09038
-3FFFC06D1380903803FE001D357EB425>I<B539F001FFF8A4000390C7EA1F00161E6E13
-3E6C153C6E137C6C15786E13F8017F5CECF001013F5C14F8011F495AA2ECFC07010F5CEC
-FE0F010791C7FC6E5A6D131E15BE6D13BC15FC6D5BA36E5AA26E5AA26E5AA26E5AA22D25
-7EA432>118 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fh ecrm1000 10 89
-/Fh 89 126 df<486C1360000314E039070001C0000EEB038048EB070000181306003813
-0E0030130C0070131C00601318A200E01338481330A400CEEB338039FF803FE001C013F0
-A3007F131FA2393F800FE0390E0003801C1981B91C>16 D<001C1307007FEB1FC039FF80
-3FE0A201C013F0A3007F131F001CEB073000001300A400011470491360A2000314E090C7
-12C048130100061480000E130348EB070048130E485B006013181C1980B91C>I<B81280
-A2290280962A>21 D<DA0FF813FC91397FFF07FF903B01F807DF83C0903A07E001FF0F90
-3B1F8007FE1FE090393F000FFC137E16F85B9338F007804848010790C7FC1503ACB812F8
-A32801F80003F0C7FCB3AB486C497E267FFFE0B512F0A3333B7FBA30>27
-D<EC0FF8EC7FFE903901F80780903907E001C090391F8000E090383F0007017E497EA25B
-A2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F1503B3AA486C497E267FFFE0B5
-12C0A32A3B7FBA2E>I<DA0FF0EB1FF0DA7FFEEBFFFC903B01F80F83F00F903C07E001CF
-C00380903C1F8000FF0001C090273F0007FE130F017E4948497EA2495CA248485C03076E
-5A03030203C7FC95C8FCA9F007E0BAFCA33C01F80003F0001F1807B3AA486C496C497E26
-7FFFE0B500C1B51280A3413B7FBA45>30 D<EB0380A3EB0FF0EB7FFE48B512803903F38F
-C03907C381E0390F8380F0D81F031338123E003C141C007C140C150E0078143E00F814FE
-1481A400FCEB80FC157800FE140012FF127F13C313E3EA3FFF6C7F14F86C13FE6CEBFF80
-000114C06C14E0013F13F01303ECBFF8148FEC83FC1481A2EC80FE157E123C12FF153EA4
-12FE00F8143C00E0147C12600070147815F8003814F0003C1381001EEB83E0000FEB87C0
-3907E39F803901FFFE006C5BEB1FE0EB0380A41F437BBD2A>36 D<141FEC7FC0903801F0
-E0903803C0600107137090380F803090381F00381518A25BA2133E133F15381530A21570
-5D5D140190381F838092CAFC1487148E02DC49B51280EB0FF85C4A9039003FF8000107ED
-0FC06E5D71C7FC6E140E010F150CD91DFC141C01391518D970FE143801E015302601C07F
-1470D803805D00076D6C5BD80F00EBC00148011F5C4890380FE003003E6E48C8FC007E90
-3807F8060203130E00FE6E5A6E6C5A1400ED7F706C4B13036F5A6F7E6C6C6D6C5B701306
-6C6C496C130E6DD979FE5B281FF001F07F133C3C07F80FE03FC0F86CB539800FFFF0C690
-26FE000313C0D91FF0D9007FC7FC393E7DBB41>38 D<121C127FEAFF80A213C0A3127F12
-1C1200A412011380A2120313005A1206120E5A5A5A12600A1979B917>I<146014E0EB01
-C0EB0380EB0700130E131E5B5BA25B485AA2485AA212075B120F90C7FCA25A121EA2123E
-A35AA65AB2127CA67EA3121EA2121F7EA27F12077F1203A26C7EA26C7E1378A27F7F130E
-7FEB0380EB01C0EB00E01460135278BD20>I<12C07E12707E7E7E120F6C7E6C7EA26C7E
-6C7EA21378A2137C133C133E131EA2131F7FA21480A3EB07C0A6EB03E0B2EB07C0A6EB0F
-80A31400A25B131EA2133E133C137C1378A25BA2485A485AA2485A48C7FC120E5A5A5A5A
-5A13527CBD20>I<1530B3A8B912FCA2C80030C8FCB3A836367BAF41>43
-D<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A
-12600A19798817>I<B512FCA516057F941C>I<121C127FEAFF80A5EA7F00121C09097988
-17>I<1506A2150E150CA2151C151815381530A215701560A215E015C0A214011580A214
-0315005C1406A2140E140CA2141C1418A214381430A21470146014E05CA213015CA21303
-91C7FCA25B1306A2130E130C131C1318A213381330A213701360A213E05BA212015B1203
-90C8FCA25A1206A2120E120CA2121C1218A21238123012701260A212E05AA21F537BBD2A
->I<EB03F8EB1FFF90387E0FC09038F803E03901E000F0484813780007147C48487FA248
-C77EA2481580A3007EEC0FC0A500FE15E0B3007E15C0A4007F141F6C1580A36C1500A26C
-6C133EA26C6C5B6C6C5BEBF0013900F803E090387E0FC0D91FFFC7FCEB03F823397DB62A
->I<EB01C013031307131F13FFB5FCA2131F1200B3B3A7497E007FB512F0A31C3779B62A>
-I<EB0FF0EB7FFE48B57E3903E03FE0390F000FF0001E6D7E001C6D7E486D7E5A6E7E1260
-12FE6CEC7F807FA56CC7FC121CC8FCEDFF00A25D14015D14035D4A5A4A5A5D4A5A4AC7FC
-147E5C495A14E0495A495A49C8FC011EEB01805B5B49130348481400485A485A90C75A48
-B6FC5A5A485CB6FCA321377CB62A>I<EB07F8EB3FFF90B512C03901F80FF03903C007F8
-48486C7E390E0001FEEA0F80391FE000FF7FA56C5A6C5AC7485AA25D14035D4A5A5DEC0F
-80027FC7FCEB1FFCECFF809038000FE06E7EEC01FC816E7EED7F80A216C0A2153F16E0A2
-121EEA7F80A2487EA316C0157F491480007EC7FC0070ECFF006C495A121E390F8003F839
-07F00FF00001B512C06C6C90C7FCEB0FF823397DB62A>I<1538A2157815F8A214011403
-1407A2140F141F141B14331473146314C313011483EB030313071306130C131C13181330
-1370136013C01201EA038013005A120E120C5A123812305A12E0B712F8A3C73803F800AA
-4A7E0103B512F8A325387EB72A>I<0006140CD80780133C9038F003F890B5FC5D5D1580
-92C7FC14FC38067FE090C9FCAAEB07F8EB1FFE9038780F809038E007E03907C003F0496C
-7E130000066D7E81C8FC8181A21680A4121C127F5A7FA390C713005D12FC00605C12704A
-5A6C5C6C1303001E495A6C6C485A3907E03F800001B5C7FC38007FFCEB1FE021397CB62A
->I<EC3FC0903801FFF0010713FC90380FE03E90383F800790387E001F49EB3F80484813
-7F485A12075B000FEC3F0049131E001F91C7FC5B123FA3127F90C9FCEB01FC903807FF80
-39FF1E07E090383801F0496C7E01607F01E0137E497F16805BED1FC0A390C713E0A57EA4
-7F123F16C0A2001FEC3F807F000F15006D5B000714FE6C6C5B6C6C485A3900FE07F09038
-7FFFC0011F90C7FCEB03FC23397DB62A>I<12301238123E003FB612E0A316C05A168016
-000070C712060060140E5D5D00E014304814705D5DC712014A5A4AC7FC1406140E5CA25C
-1478147014F05C1301A213035C1307A2130FA3131F5CA2133FA5137FA96DC8FC131E233A
-7BB72A>I<EB03F8EB1FFF017F13C09038FC07F03901E001F83903C0007C4848133C90C7
-123E48141E000E141F001E80A3121FA26D5B6D131E7FD80FF85B6D137C01FF13786C6D5A
-6CEBE3E0ECF780C601FFC7FC6D5A6D6C7E010F13E0013F7F01F97F3901E07FFE48486C7E
-380F800F48486C1380001E010113C0487F007C143F0078EC1FE0150F00F81407481403A2
-1501A36C15C0A200781403007C15806C14076CEC0F006C6C131ED807E0137C3903F803F0
-C6B55A013F1380D907FCC7FC23397DB62A>I<EB03F8EB1FFF017F13C03901FC07E04848
-6C7E3907E001F8000F6D7E4848137E5B003F80A248C71380A25AED1FC0A516E0A56C143F
-A36C7E157F121F6C6C13FF6C6C13DF000313013901F0039F3900FC0F1FD93FFC13C0EB07
-F090C7FCA2153F1680A216005D120F486C137E486C5BA24A5A4A5A49485A381F000F001C
-EB1F80260F807FC7FC3807FFFE000113F838003FC023397DB62A>I<121C127FEAFF80A5
-EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317>I<121C127FEAFF80A5
-EA7F00121CC7FCB2121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A
-1206120E5A5A5A12600A3479A317>I<EF01C0EF0780EF1E0017F8EE03E0040FC7FC163C
-16F0ED03C0030FC8FC153CEC01F0EC07C0021EC9FC1478EB01E0EB0780011ECAFC13F8EA
-03E0000FCBFC123C12F0A2123C120FEA03E0EA00F8131EEB0780EB01E0EB0078141EEC07
-C0EC01F0EC003C150FED03C0ED00F0163C160FEE03E0EE00F8171EEF0780EF01C0322E79
-AB41>I<007FB812F8B912FCCCFCB0B912FC6C17F836147B9E41>I<12E01278121EEA07C0
-EA01F0EA003C130FEB03C0EB00F0143C140FEC03E0EC00F8151EED0780ED01E0ED007816
-1EEE07C0EE01F0EE003C170FEF03C0A2EF0F00173CEE01F0EE07C0041EC7FC1678ED01E0
-ED0780031EC8FC15F8EC03E0020FC9FC143C14F0EB03C0010FCAFC133CEA01F0EA07C000
-1ECBFC127812E0322E79AB41>I<EB3FE03801FFFE3907C03F80390E000FC0003CEB07F0
-00301303007014F8007C130100FE14FC7EA4127E003CEB03F8C7FCEC07F0A2EC0FE0EC1F
-80EC3F00147E147C5C495A5C495A5CA249C7FCA31306AA90C8FCA8130EEB3F80497EA56D
-5A010EC7FC1E3B7CBA27>I<1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA202
-0E7FEC0C1FA2021C7FEC180FA202387FEC3007A202707FEC6003A202C07F1501A2D90180
-7F81A249C77F167FA20106810107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7E
-A213E0707E1201486C81D80FFC02071380B56C90B512FEA3373C7DBB3E>65
-D<B712E016FC16FF0001903980007FC06C90C7EA1FE0707E707E707EA2707EA283A75F16
-035F4C5A4C5A4C5A4C5AEEFF8091B500FCC7FCA291C7EA7F80EE1FE0EE07F0707E707E83
-707EA21880177F18C0A7188017FFA24C13005F16034C5AEE1FF8486DEB7FF0B812C094C7
-FC16F832397DB83B>I<913A01FF800180020FEBE003027F13F8903A01FF807E07903A03
-FC000F0FD90FF0EB039F4948EB01DFD93F80EB00FF49C8127F01FE153F12014848151F48
-48150FA248481507A2485A1703123F5B007F1601A35B00FF93C7FCAD127F6DED0180A312
-3F7F001F160318006C7E5F6C7E17066C6C150E6C6C5D00001618017F15386D6C5CD91FE0
-5C6D6CEB03C0D903FCEB0F80902701FF803FC7FC9039007FFFFC020F13F002011380313D
-7BBA3C>I<B712C016F816FE000190398001FF806C90C7EA3FE0EE0FF0EE03F8707E707E
-177FA2EF3F8018C0171F18E0170F18F0A3EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F
-18C0EF3F80A2EF7F0017FE4C5A4C5AEE0FF0EE3FE0486DEBFF80B8C7FC16F816C036397D
-B83F>I<B812FEA3000190388000076C90C8FC173F838383A383A31880170116C0A394C7
-FCA31501A21503150F91B5FCA3EC000F15031501A21500A21860A318E093C712C0A41701
-A3EF0380A21707A2170F173F177F486D903807FF00B9FCA333397EB838>I<B812F8A300
-01903880001F6C90C71201EE00FC177C173C171CA2170CA4170E1706A2ED0180A21700A4
-1503A21507151F91B5FCA3EC001F15071503A21501A692C8FCAD4813C0B612C0A32F397D
-B836>I<DBFF8013C0020FEBF001023F13FC9139FF803F03903A03FC000787D90FF0EB03
-CF4948EB00EF4948147F4948143F49C8121F485A4848150F48481507A248481503A2485A
-1701123F5B007F1600A448481600AB93B6FCA26C7E9338007FE0EF3FC0A2123F7F121FA2
-6C7EA26C7EA26C7E6C7E6C6C157F6D7E6D6C14FF6D6C14EFD90FF8EB03C7D903FEEB0783
-903A00FFC03F0191393FFFFC00020F01F0130002001380383D7CBA41>I<B648B512FEA3
-0001902680000313006C90C76C5AB3A491B6FCA391C71201B3A6486D497EB648B512FEA3
-37397DB83E>I<B612C0A3C6EBC0006D5AB3B3AD497EB612C0A31A397EB81E>I<013FB512
-E0A39039001FFC00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A1380D87F005B0070131F6C
-5C6C495A6C49C7FC380781FC3801FFF038007F80233B7DB82B>I<B649B5FCA300010180
-9038007FF06C90C8EA3F80053EC7FC173C17385F5F4C5A4C5A4CC8FC160E5E5E5E5E4B5A
-ED0780030EC9FC5D153E157E15FF5C4A7F4A6C7E140E4A6C7E4A6C7E14704A6C7E4A6C7E
-14804A6C7E6F7EA26F7F707EA2707E707EA2707EA2707E707EA2707E707F8484486D497F
-B6011FEBFF80A339397DB841>I<B612E0A3000101C0C8FC6C90C9FCB3AD1718A5173817
-30A31770A317F0A216011603160FEE1FE0486D13FFB8FCA32D397DB834>I<B5933807FF
-F86E5DA20001F0FC002600DFC0ED1BF8A2D9CFE01533A3D9C7F01563A3D9C3F815C3A2D9
-C1FCEC0183A3D9C0FEEC0303A2027F1406A36E6C130CA36E6C1318A26E6C1330A36E6C13
-60A26E6C13C0A3913901FC0180A3913900FE0300A2ED7F06A3ED3F8CA2ED1FD8A3ED0FF0
-A3486C6D5A487ED80FFC6D48497EB500C00203B512F8A2ED018045397DB84C>I<B59138
-07FFFE8080C69238007FE06EEC1F80D9DFF0EC0F001706EBCFF8EBC7FCA2EBC3FEEBC1FF
-A201C07F6E7EA26E7E6E7E81140F6E7E8114036E7E168080ED7FC016E0153FED1FF0ED0F
-F8A2ED07FCED03FEA2ED01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE0FFEA216071603A216
-011600A2177E486C153E487ED80FFC151EB500C0140EA2170637397DB83E>I<EC03FF02
-1F13E09138FE01FC903901F8007ED907E0EB1F8049486D7ED93F80EB07F049C76C7E01FE
-6E7E48486E7E49157E0003167F4848ED3F80A24848ED1FC0A2001F17E049150F003F17F0
-A3007F17F8491507A300FF17FCAC007F17F86D150FA3003F17F0A26C6CED1FE0A36C6CED
-3FC0000717806D157F000317006C6C15FEA26C6C4A5A017F4A5A6D6C495A6D6C495AD907
-E0EB1F80D903F8017FC7FC903900FE01FC91381FFFE0020390C8FC363D7BBA41>I<B712
-C016FC16FF0001D9800013C06C90C7EA1FE0707EEE03F883707EA2707EA21880A71800A2
-4C5AA24C5A5FEE0FF04C5AEEFF8091B548C7FC16F091CAFCB3A5487FB6FCA331397EB838
->I<EC03FF021F13E09138FE01FC903901F8007ED907E0EB1F8049486D7ED93F80EB07F0
-49C76C7E01FE6E7E48486E7EA24848157F0007178049153F000F17C049151F001F17E0A2
-4848ED0FF0A3007F17F8A2491507A200FF17FCAC007F17F8A26D150FA2003F17F0A26C6C
-ED1FE0A36C6CED3FC00007027C14804AB4FC3C03F80383807F003B01FC0701C0FEEC0E00
-2600FE0CEBE1FC017FEC63F8D93F8CEB77F0D91FCCEB3FE0D907EE14806DB449C7FC0100
-D981FC130CEC1FFF0203131C91C7001E131C161F183CEF807CEFC0F8EE0FFFA318F08218
-E07013C07013809338007E00364B7BBA41>I<B612FEEDFFE016F8000190388007FE6C90
-C76C7EEE3FC0707E707E707EA2707EA283A65FA24C5AA24C5A4C5AEE3F8004FFC8FCED07
-FC91B512E05E9138000FF0ED03F8ED00FE82707E707EA2161F83A583A6F00180A217F816
-0F1803486D01071400B66D6C5A04011306933800FE0ECAEA3FFCEF07F0393B7DB83D>I<
-D90FF813C090383FFE0190B512813903F807E33907E000F74848137F4848133F48C7121F
-003E140F007E1407A2007C140312FC1501A36C1400A37E6D14006C7E7F13F86CB47E6C13
-F8ECFF806C14E06C14F86C14FEC680013F1480010714C0EB007F020713E0EC007FED3FF0
-151F150FED07F8A200C01403A21501A37EA216F07E15036C15E06C14076C15C06C140F6D
-EB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0D8C00190C7FC253D7CBA2E>I<
-003FB812E0A3D9C003EB001F273E0001FE130348EE01F00078160000701770A300601730
-A400E01738481718A4C71600B3B0913807FF80011FB612E0A335397DB83C>I<B6903807
-FFFEA3000101809038007FE06C90C8EA1F80EF0F001706B3B2170E6D150C80171C133F17
-186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC91387F807E91381FFF
-F8020713E09138007F80373B7DB83E>I<B500FC91387FFF80A30003018091380FFC006C
-90C8EA07E0715A6C705A6E1403017F93C7FCA280013F1506A26E140E011F150C80010F5D
-A28001075DA26E147001031560A26D6C5CA2806D4A5AA2ED8003027F91C8FCA291383FC0
-06A215E0021F5BA2EDF01C020F1318A26E6C5AA215FC02035BA2EDFEE002015BA26E6C5A
-A36FC9FCA3153EA2151CA3393B7EB83E>I<B5D8FC07B5D8F001B5FCA30007902780001F
-FEC7EA1FF86C48C7D80FF8EC07E000010307ED03C01B807F6C6F6C1500A26E5F017F6E6C
-1406A280013F4A6C5CA280011F4A6D5BEE067FA26D6C010E6D5BEE0C3FA26D6C011C6D5B
-EE181FA26D6C6F5BEE300FA26D6C6F485AEE6007A26D6C4CC7FC9338C003FCA203805D91
-3B7F818001FE06A203C1150EDA3FC3C7EAFF0CA203E3151CDA1FE6EC7F98A215F6DA0FFC
-EC3FF0A302075E4B141FA202035E4B140FA202015E4B1407A2020093C8FC4B80503B7EB8
-55>I<B500FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C
-140395C7FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F91383F
-E0015F91381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E6E13
-B016E0157F6F5AB3A24B7E023FB512C0A33B397FB83E>89 D<003FB7FCA39039FC0001FE
-01C0130349495A003EC7FC003C4A5A5E0038141F00784A5A12704B5A5E006014FF4A90C7
-FCA24A5A5DC712074A5AA24A5A5D143F4A5AA24A5A92C8FC5B495AA2495A5C130F4948EB
-0180A2495A5C137F495A16034890C7FC5B1203485AEE0700485A495C001F5D48485C5E48
-48495A49130FB8FCA329397BB833>I<EAFFFCA2EAFC00B3B3B3B3A7EAFFFCA20E5379BD
-17>I<EAFFFCA21200B3B3B3B3A712FFA20E537FBD17>93 D<007FB81280B912C0A26C17
-803204797041>95 D<EB1FE0EBFFFC3803E03F3907000F80390F8007E0486C6C7E13E06E
-7EA26E7E6C5A6C5AC8FCA4147FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA1FC0123F485A90
-C7FC160C12FEA31401A26C13036CEB077C903980063E18383FC01E3A0FE0781FF03A03FF
-F00FE03A007F8007C026277DA52A>97 D<EA03F012FFA3120F1203B0EC1FE0EC7FF89038
-F1E03E9039F3801F809039F7000FC001FEEB07E049EB03F049EB01F85BED00FCA216FEA2
-167E167FAA167E16FEA216FC15016D14F8ED03F07F01EEEB07E001C6EB0FC09039C7801F
-00903881E07E903800FFF8C7EA1FC0283B7EB92E>I<EB03FC90381FFF8090387E03E039
-01F80070484813F83907E001FC380FC003A2EA1F80123F90380001F848EB00F01500A212
-7E12FEAA127E127FA26C14067F001F140E6D130C000F141C6C6C13386C6C13706C6C13E0
-39007C07C090381FFF00EB07F81F277DA525>I<ED0FC0EC03FFA3EC003F150FB0EB03F8
-EB1FFF90387E078F9038F801EF3903F0007F4848133F4848131FA24848130F123F90C7FC
-5AA2127E12FEAA127E127FA27EA26C6C131FA26C6C133F6C6C137F6C6CEBEFF03A01F801
-CFFF39007C078F90381FFE0FD907F813C0283B7DB92E>I<EB07F8EB1FFF90387C0FC039
-01F803E03903F001F0D807E013F8380FC0004848137CA248C7127E153E5A153F127E12FE
-A3B7FCA248C8FCA5127EA2127FA26C14037F001F14076C6C13060007140E6D131CD801F0
-13386C6C137090387E03E090381FFF80903803FC0020277EA525>I<147E903803FF8090
-380FC1E0EB1F8790383F0FF0137EA213FCA23901F803C091C7FCADB512FCA3D801F8C7FC
-B3AB487E387FFFF8A31C3B7FBA19>I<ED03F090390FF00FF890393FFC3C3C9039F81F70
-7C3901F00FE03903E007C03A07C003E010000FECF000A248486C7EA86C6C485AA200075C
-6C6C485A6D485A6D48C7FC38073FFC38060FF0000EC9FCA4120FA213C06CB512C015F86C
-14FE6CECFF804815C03A0F80007FE048C7EA0FF0003E140348140116F8481400A56C1401
-007C15F06CEC03E0003F1407D80F80EB0F80D807E0EB3F003901FC01FC39007FFFF00107
-90C7FC26387EA52A>I<EA03F012FFA3120F1203B0EC0FF0EC3FFCECF03F9039F1C01F80
-9039F3800FC0EBF70013FE496D7EA25BA35BB3A3486C497EB500C1B51280A3293A7EB92E
->I<EA0380EA0FE0487EA56C5AEA0380C8FCAAEA03F012FFA312071203B3AA487EB512C0
-A312387EB717>I<EB01C0EB07F0EB0FF8A5EB07F0EB01C090C7FCAAEB01F813FFA31307
-1301B3B3A2123C127E00FF13F01303A214E038FE07C0127C383C0F00EA0FFEEA03F81549
-84B719>I<EA03F012FFA3120F1203B1913801FFFCA39138007FC01600157C15705D4A5A
-4A5A4AC7FC141E1438147814FC13F1EBF3FEEBF73F01FE7FEBF81F496C7E8114076E7E6E
-7E811400157E157F811680ED1FC0486CEB3FF0B500C0B5FCA3283A7EB92C>I<EA03F012
-FFA3120F1203B3B3AD487EB512C0A3123A7EB917>I<2703F00FF0EB1FE000FFD93FFCEB
-7FF8913AF03F01E07E903BF1C01F83803F3D0FF3800FC7001F802603F70013CE01FE14DC
-49D907F8EB0FC0A2495CA3495CB3A3486C496CEB1FE0B500C1B50083B5FCA340257EA445
->I<3903F00FF000FFEB3FFCECF03F9039F1C01F803A0FF3800FC03803F70013FE496D7E
-A25BA35BB3A3486C497EB500C1B51280A329257EA42E>I<EB03FE90380FFF8090383E03
-E09038F800F84848137C48487F48487F4848EB0F80001F15C090C712074815E0A2007EEC
-03F0A400FE15F8A9007E15F0A2007F14076C15E0A26C6CEB0FC0000F15806D131F6C6CEB
-3F006C6C137EC66C13F890387E03F090381FFFC0D903FEC7FC25277EA52A>I<3903F01F
-E000FFEB7FF89038F1E07E9039F3801F803A07F7000FC0D803FEEB07E049EB03F04914F8
-49130116FC150016FEA3167FAA16FEA3ED01FCA26DEB03F816F06D13076DEB0FE001F614
-C09039F7803F009038F1E07E9038F0FFF8EC1FC091C8FCAB487EB512C0A328357EA42E>
-I<D903F813C090381FFE0190387E07819038FC01C33903F000E300071477484813374913
-3F001F141F485A150F48C7FCA312FEAA127FA37E6D131F121F6D133F120F6C6C137F6C6C
-13EF3901F801CF39007E078F90381FFE0FEB07F890C7FCABED1FE00203B5FCA328357DA4
-2C>I<3807E01F00FFEB7FC09038E1E3E09038E387F0380FE707EA03E613EE9038EC03E0
-9038FC0080491300A45BB3A2487EB512F0A31C257EA421>I<EBFF03000313E7380F80FF
-381E003F487F487F00707F12F0A2807EA27EB490C7FCEA7FE013FF6C13E06C13F86C7F00
-037FC67F01071380EB007F141F00C0EB0FC01407A26C1303A37E15806C13077EEC0F00B4
-131E38F3C07C38E1FFF038C03F801A277DA521>I<1318A51338A31378A313F812011203
-1207001FB5FCB6FCA2D801F8C7FCB215C0A93800FC011580EB7C03017E13006D5AEB0FFE
-EB01F81A347FB220>I<D803F0EB07E000FFEB01FFA3000FEB001F00031407B3A4150FA3
-151F12016D133F0000EC77F86D9038E7FF8090383F03C790381FFF87903A03FC07E00029
-267EA42E>I<B538803FFEA33A0FF8000FF06C48EB07E00003EC03C06D148000011500A2
-6C6C1306A26D130E017E130CA26D5BA2EC8038011F1330A26D6C5AA214E001075BA29038
-03F180A3D901FBC7FCA214FF6D5AA2147CA31438A227257EA32C>I<B53A1FFFE03FFEA3
-260FF8009038000FF86C48017EEB03E018C00003023EEB0180A26C6C013FEB0300A36C6C
-EC8006156FA2017E9038EFC00C15C7171CD93F01EBE01815830281EBF038D91F83143015
-0102C3EBF87090260FC6001360A2D907E66D5A02EC137CA2D903FCEB7F804A133FA20101
-92C7FC4A7FA20100141E4A130E0260130C37257EA33C>I<B538807FFFA33A03FE003FF0
-0001EC1F80000092C7FC017E131C6D13186D6C5AECC070010F5B6D6C5AECF180EB03FB6D
-B4C8FC6D5AA2147F804A7E8114CF903801C7E090380383F090380703F8EB0601496C7E01
-1C137E49137F01787F496D7E486C80000FEC3FF0D8FFFE90B51280A329247FA32C>I<B5
-38803FFEA33A0FF8000FF06C48EB07C00003EC03806C7E16007F00001406A2017E5BA213
-7F6D5BA26D6C5AA2ECC070010F1360A26D6C5AA214F101035BA2D901FBC7FCA214FF6D5A
-A2147CA31438A21430A214701460A25CA2EA7C0100FE5B130391C8FC1306EAFC0EEA701C
-6C5AEA1FF0EA0FC027357EA32C>I<003FB512FCA2EB8003D83E0013F8003CEB07F00038
-EB0FE012300070EB1FC0EC3F800060137F150014FE495AA2C6485A495AA2495A495A495A
-A290387F000613FEA2485A485A0007140E5B4848130C4848131CA24848133C48C7127C48
-EB03FC90B5FCA21F247EA325>I<EC01F8140FEC3F80ECFC00495A495A495AA2130F5CB3
-A7131F5C133F49C7FC13FEEA03F8EA7FE048C8FCEA7FE0EA03F8EA00FE137F6D7E131F80
-130FB3A7801307A26D7E6D7E6D7EEC3F80EC0FF814011D537ABD2A>I<126012F0B3B3B3
-B3A91260045377BD17>I<12FCEAFFC0EA07F0EA01FCEA007E7F80131F80130FB3A78013
-07806D7E6D7EEB007EEC1FF0EC07F8EC1FF0EC7E00495A495A495A5C130F5CB3A7131F5C
-133F91C7FC137E485AEA07F0EAFFC000FCC8FC1D537ABD2A>I E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fi ecbx1440 14.4 34
-/Fi 34 118 df<EE7FFC031FB57E4AB612E0020715F8023F9038C00FFC913AFFFC0001FE
-4901F0EB007F010701C0EB03FF4949497F4990C75A5B5C495A4D7F01FF6F5B5CA27190C7
-FC715AEF00F895C8FCAA0407B512C0BAFCA5C601F8C7120F83B3B3A6B6D8F807B612C0A5
-42547DD349>28 D<B712E0AB230B7F9F2C>45 D<151E153E15FE1403140F147FEB07FF00
-03B5FCB6FCA3EBF87FEAFC00C7FCB3B3B3A6007FB712FCA52E4E76CD42>49
-D<EC1FFE49B512F0010F14FC013FECFF804915E02701FF803F7F2703FC000713FCD807F0
-01017F48486D7FD81F806E138048C87E7013C0D87FE016E001F8806D16F000FF817F7013
-F8A56C5AA26C5A6C5AEA0380C914F05EA218E05E18C05E18804C13005F4C5A4C5A5F4B5B
-4B5B4B5B94C7FCED0FFC4B5A4B5AED7FC04B5A4A90C8FCEC03FC4A5A4A4814F84A5A4A5A
-4AC8FC02FEEC01F0495A495A495A5CD90F80140349C8FC013E1507017FB7FC90B812E05A
-5A5A5A5A5A5AB9FC18C0A4354E7ACD42>I<913807FFC0027F13FC0103B67E010F15E090
-261FF80313F890267FC0007F01FEC7EA3FFE48488148486E138013FE486C6C6D13C08048
-17E080A66C5B18C06C5B6C90C75AD80038168090C8FC4C1300A24C5A5F4C5A4B5B4B13C0
-030F5BDB7FFEC7FC91387FFFF816C016FCEEFF80DA000313E09238007FF8EE3FFE707E70
-138018C07013E018F07013F8A218FC82A218FEA3EA03C0EA0FF0EA3FFC487EA2B5FCA218
-FCA25E18F8A26C4816F0495C4916E0D83FE04A13C06C485CD80FF04A1380D807FE91387F
-FE003B03FFE003FFFC6C90B65A6C6C15E0010F92C7FC010114FCD9001F1380374F7BCD42
->I<17FC1601A216031607160FA2161F163F167FA216FF5D5DA25D5D5D167F153E157E15
-FC15F8EC01F01403EC07E015C0EC0F80141FEC3F00143E5C14FC495A5C495A1307495A5C
-49C7FC5B137E137C5B1201485A5B485A120F485A90C8FC123E127E5ABA1280A5C901FCC7
-FCAF021FB71280A5394F7CCE42>I<486C150601F0153E01FEEC01FED9FFF0133F91B65A
-5F5F5F5F5F94C7FC16FC5E16E093C8FC15FC01F0138091CAFCAC913807FF80023F13F891
-B512FE01F36E7E9026FFFC0113E09139E0007FF891C76C7E496E7E01F86E7E5B70138049
-16C0C9FC18E08218F0A418F8A31203EA0FE0EA3FF8487EA212FF7FA218F0A25B5E6C4816
-E05B01C016C06CC85A18806C6C4A13007FD80FF04A5A6C6CECFFFCD803FE4913F02701FF
-E00F5B6C6CB612806D92C7FC010F14F8010114C09026003FFCC8FC354F7ACD42>I<EA07
-E0EA1FF8EA3FFCEA7FFEA2B5FCA6EA7FFEA2EA3FFCEA1FF8EA07E0C7FCB3A3EA07E0EA1F
-F8EA3FFCEA7FFEA2B5FCA6EA7FFEA2EA3FFCEA1FF8EA07E0103576B425>58
-D<932603FFF01407047F01FF5C0307B600E05B033F03F85B92B700FE5B02039126C003FF
-5B020F01F8C7EA3FC1023F01C0EC0FE391B5C80003B5FC4901FC814949814901E082011F
-498249498292CA7E4948834948835A4A83485B4885A2484984A2485B87A2485B87A25AA2
-98C8FC91CFFCA2B5FCAE7E067FB7128080A37E95C76C90C7FC807EA36C7FA26C7FA26C7F
-7E806C7F137F6D7E816D6D93B5FC01077F6D01F85D6D7F6D01FF5D023F01E0EC0FEF020F
-01FCEC3FE30203903AFFE001FF81020091B6C6FC033F03FC133F030703F0130FDB007F02
-801303040301F8CAFC595479D267>71 D<B81280A5D8000701F0C7FCB3B3B3B2B81280A5
-29527DD130>73 D<B812E0A5D8000F01E0CAFCB3B3A91AF8A419011AF0A51903A31907A2
-190F1AE0191FA2193F197F19FF60180760187F0503B5FCBB12C0A545527CD14F>76
-D<B600F84BB612FC818181A2D800076E91C7383FE00070EE0F80828214DF02CF7F02C77F
-8202C37F14C102C0806F7F836F7F816F7F6F7F83816F7F6F80707F8482707F707F707F84
-82707F7080717F8583717F717F85717F83717F7114801AC07213E0847213F07213F81AFC
-7213FE847213FF72148F1BCF7313EF857313FF85A285858585A286868686A286868686EB
-1FF0B600FE177F1B3F1B1F1B0FA25E527CD167>78 D<B912FCF0FFE019FE737E1AE0D800
-0F01E0C7003F7F060313FC06007F737E7313807313C07313E0851BF0A21BF885A21BFCA9
-1BF8A3611BF0A21BE04F13C0614F13804F13004F5A060713F8063F5B92B812C097C7FC19
-F8198003E0CBFCB3AEB712FEA54E527CD15A>80 D<93381FFF800303B512FC033FECFFC0
-92B712F00207D9F80113FE021F903AC0003FFF804A48C700077FDAFFF8020113F049496E
-7F49496F7E49496F7E49496F7E4990C96C7F4948707F4948707F01FF854849707F4A8248
-86A24849717E48864A83A2481B80A248497113C0A4481BE0A291CB7EA3B51AF0AF6C1BE0
-A36E5FA26C1BC0A36C1B806E5FA26C1B006E5F6C62A26C6DD903FC4A5A6CDB0FFF5D6E49
-EBC0016C4B01E05C6D6C90277E07F0035B6E9039F801F807902A3FFF01F000780F5B6D04
-7C5C6DD981E06D4890C7FC6D01E191381F7FFE010101F1EDFFF86DD9F9F06D5BDA3FFF16
-C06E6D013F5B02079027FE01FFFEC8FC020190B612F8DA003F4B141003071838DB001FEB
-83F893C7EA03FC1C7885726C14F8F2C003F2F01F97B512F084A31CE085A27314C01C8085
-1C00735B735B735B735B9638003FC0556A79D263>I<B912E018FF19F019FE737ED80007
-01F0C714E0060F7F060313FC06007F737E737F8587737FA28785A287A863A26163636163
-4F90C8FC4F5A4F5A06035B060F13E095B5128092B748C9FC19F019C019F09226F0000713
-FC050013FF063F7F727F727F727F727FA2727FA28486A886A71D707513F8A2851C017301
-C013F0A273EBE003B86C6D9038F007E0739038FC1FC0070190B51280736C1400080F5BCE
-13F85D537CD162>I<DA0FFE141C91B500F0133C010702FC137C011F02FF13FC017F15C1
-9026FFF00113E148903980001FFB4890C7EA07FFD807FC14014848804848153F171F4848
-150FA2007F1607491503A2170112FFA217007FA26D167CA27F7F6D93C7FC6C7E14C014F8
-ECFF806C14F8EDFFC06C15FC6CEDFF8017F06C16FC6C826C707E6C836D82011F82010782
-13016D6C81020781EC007F030380ED003F040314801600173F837113C0838312F883A383
-7EA319807EA26C5E19007F6D4B5A7F6D4B5A01FC4B5A6D151FD9FFC04A5AD97FF8ECFFE0
-28FE1FFF80075B010790B6C7FCD8FC0115FC486C6C14F048010F14C0489026007FFCC8FC
-3A5479D249>I<003FBB12FCA59126C0007FEB000301FCC7ED003FD87FF0F00FFE491807
-49180349180190C81600A2007E1A7EA3007C1A3EA500FC1A3F481A1FA6C91700B3B3AC49
-B912C0A550517BD05B>I<EC3FFE0107B512E0011F14FC017F14FF2701FFC00F13C02703
-FE00037F486C01007F6E6D7E486D80707EA2707EA3707F6C5B6C90C7FC6C5AC9FCA60307
-B5FC0203B6FC147F0103B7FC011FEBF00F017F1300EBFFFC000313F04813C0485B4890C7
-FC5A5B485AF081F012FF5BA35EA26D5C127F6D5C003F03F713C36DD901E314E06CD9C007
-14FF00079026F01F8114C06C90B5C61480C602FC6D1300011F01F0EB3FFC01010180EB07
-F03C387CB642>97 D<913803FFE0023F13FE91B67E010315E0010F9038003FF8D93FFCEB
-07FC4948497E4948131F4849497E485B485BA24890C7FC5A5B003F6F5A705A705A007F92
-C8FC5BA312FFAD127F7FA3123F7F6CEE0F80A26C6D141F18006C6D5C6C6D143E6C6D147E
-6C6D5C6D6C495A6DB4EB07F0010F9038C01FE06D90B5128001014AC7FCD9003F13F80203
-138031387CB63A>99 D<943803FF80040FB5FCA5EE003F170FB3A4913803FF80023F13F8
-49B512FE0107ECFF8F011F9038C03FEF90273FFE0007B5FCD97FF8130149487F48498048
-4980484980488291C8FC5A5B123FA2127F5BA312FFAD127FA37F123FA3121F7F6C5E6C6D
-5C5F6C6D91B5FC6C6D5B6C6D4914E0D97FFCD90FEFEBFF80D91FFFEB7F8F010790B5120F
-010114FC6D6C13E00207010049C7FC41547CD249>I<913807FF80027F13F849B512FE01
-076E7E011F010313E0903A3FFC007FF0D97FF06D7E49486D7E4849130F48496D7E488248
-90C77E1880485A82003F17C0A3485A18E082A212FFA290B8FCA401FCCAFCA6127FA37F12
-3FA2EF03E06C7E17076C17C06C6D140F18806C6D141F6C6DEC3F006C6D147ED97FFC495A
-D91FFFEB07F86D9038E03FF0010390B512C001005D023F01FCC7FC020113E033387CB63C
->I<ED1FF8913803FFFE020FEBFF80023F14C09139FFF83FE001039038E0FFF049138049
-010113F85BEB3FFEA2EB7FFCA26F13F0495AEE7FE0EE1F8093C7FCAEB712C0A5C601F8C8
-FCB3B3A7B612FEA52D547CD328>I<DA1FFE14FE49B539E007FF80010FDAFC1F13C0013F
-DAFF7F13E090267FF807EBFF072701FFE001EBF07F48497E484990387FF83F91C7003F14
-C048EEFC1F489338FE070049021F90C7FCA2003F82A9001F5EA26D143F6C5E6C5E6E137F
-6C6D495A6C6D485B6CD9F80713804890B6C8FCD803EF14FC01C114E02707C01FFEC9FC49
-CBFCA2487EA37FA27F13FC90B612FE6CEDFFF017FCEFFF806C8318F06C836C837F48B87E
-1207D80FFCC700037F4848EC003F4848150F48486F138083485A83A56D5D007F18006D5D
-003F5F6C6C4B5A01FE153FD807FFED7FF06C01C049485AC601FC011F1380013FB648C7FC
-010F15F8010115C0D9000F01F8C8FC3B4F7CB542>I<EB3FF8B5FCA51203C6FCB3A4EE1F
-FC93B57E030314E0030F14F892391FC07FFC92397E003FFE03F86D7EECF9F04B6D7FECFB
-C0ECFF8092C76C7FA25CA25CA45CB3ACB6D8F807B612C0A542537CD249>I<133FEBFFC0
-487F487FA2487FA66C5BA26C5B6C5B013FC7FC90C8FCAEEB1FF8B5FCA512017EB3B3A6B6
-12F0A51C547CD324>I<EB3FF8B5FCA51203C6FCB3B3B3B1B612F8A51D537CD224>108
-D<D93FF0D91FF84AB47EB591B56C010F13F8030302E0013F13FE030F6E90B6FCDB3F8090
-27F803F80F7F922A7E007FFC07E0077F000302F890283FFE0F80037FC6D9F1F0011F4948
-7EDAF3E0DAFF3E814B153CDAF7805D92C76C496D7F14FF4A5EA24A5EA34A5EB3ADB6D8F8
-0FB66CB612F8A565367BB56E>I<D93FF0EB1FFCB591B57E030314E0030F14F892391FC0
-7FFC92397E003FFE000302F86D7EC6EBF1F04B6D7FECF3C0ECF78092C76C7F14FF5CA25C
-A45CB3ACB6D8F807B612C0A542367CB549>I<913801FFC0023F13FE91B67E010315E001
-0F018013F8903A3FFC001FFED97FF0EB07FF49486D7F48496D7F48496D7F91C8127F4883
-488349153F001F83A2003F8349151FA2007F83A400FF1880AC007F1800A3003F5F6D153F
-A2001F5FA26C6C4B5AA26C6D4A5A6C5F6C6D495B6C6D495B6D6C4990C7FCD93FFCEB1FFE
-6DB46CB45A010790B512F0010115C0D9003F49C8FC020313E039387CB642>I<D93FF8EB
-7FF0B50107B5FC031F14C0037F14F09126F9FF0013FCDAFFF8EB3FFF000302E0010F7FC6
-02806D7F92C76C7F4A824A804A6E7F85187F85A2183F85A4721380AD4E1300A44E5AA261
-18FF616E5C616E4A5B6E4A5B6F495B03E04990C7FC6FEB7FFE913AF9FE01FFF802F8B65A
-033F14C0030749C8FC030013E093CAFCB1B612F8A5414D7DB549>I<90393FF001FCB590
-380FFF804B13E0037F13F09238FE1FF89138F1F83F00019138F07FFC6CEBF3E015C0ECF7
-80A2ECFF00EE3FF84AEB1FF0EE0FE093C7FC5CA45CB3ABB612FEA52E367DB535>114
-D<903903FFC00E011FEBFC1E90B6127E000315FE3907FE003FD80FF0130F484813034848
-1301491300127F90C8127EA248153EA27FA27F01F091C7FC13FCEBFF806C13FEECFFF06C
-14FE6F7E6C15E06C816C15FC6C81C681133F010F15801301D9000F14C0EC003F030713E0
-150100F880167F6C153FA2161F7EA217C07E6D143F17807F6DEC7F0001F85C6DEB03FE90
-39FF801FFC486CB512F0D8F81F14C0D8F00791C7FC39E0007FF02B387CB634>I<147CA6
-14FCA41301A31303A21307A2130F131F133F137F13FF1203000F90B512FEB7FCA426007F
-FCC8FCB3A9EE0F80ABEE1F006D7EA2011F143E806D6D5A6DEBC1F86DEBFFF001005C023F
-1380DA03FEC7FC294D7ECB33>I<D93FF8913801FFC0B50207B5FCA50003ED001FC61607
-B3AE5FA35FA25F137F5F6D6C14F7DC01E713F06D6CD907C7EBFFC0903A0FFF801F876D90
-B51207010114FC6D6C13F0020701C091C7FC42377CB549>I E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fj ecrm0900 9 5
-/Fj 5 109 df<123C127E12FFA4127E123C08087A8715>46 D<EB7F803803FFF0380F80
-FC381C003E003F133F6D6C7E6E7EA26E7EEA1F00C7FCA4EB01FF131FEBFF873803FC07EA
-0FF0EA1FC0EA3F80127F13004815C05AA3140FA26C131F6C133B3A3F8071F180391FC1E1
-FF2607FFC013003900FE003C22237DA126>97 D<EA03F012FFA312071203AEEC3F80ECFF
-E09038F3C0F89038F7007E01FE7F49EB1F8049EB0FC05BED07E016F0A2150316F8AA16F0
-150716E0A2ED0FC07F6DEB1F8001ECEB3F0001CF137C90388381F8903801FFE0C76CC7FC
-25357EB32B>I<EA03F012FFA312071203AEEC1FC0EC7FF09038F1E0FC9038F3807C9038
-F7007E13FE497FA25BA25BB3486CEB7F80B538C7FFFCA326347EB32B>104
-D<EA07E012FFA3120F1207B3B3A7EA0FF0B5FCA310347EB315>108
-D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fk ecbx0900 9 7
-/Fk 7 117 df<ED1F80A24B7EA24B7EA34B7EA24A7FA34A7FA24A7F15CFA2020F7F1587
-021F801503023F80EC3E01A2027E80EC7C0002FC804A137FA20101814A133F0103814A13
-1FA249B67EA24981A290271F8000077F91C77EA24982013E80017E82017C80A201FC8249
-157FB500F0013FB512F0A43C347DB343>65 D<EB7FFE0003B512E04814F8390FF00FFC39
-1FF803FF806E138016C0157F6C5A6C5AEA0180C8FCEC7FFF010FB5FC90B6FC0003EBF07F
-000F1300EA1FF8485A485A485A5BA315FF7F007F5B6D4813E03A3FF80FBFFF000FB5121F
-0003EBFC0F39007FE00728217EA02B>97 D<EA01FC12FFA4120F1207ADEC0FF8EC7FFF01
-FDB512C09039FFF01FF09138800FF84A6C7E496D7E496D7EA2178081A217C0A91780A25D
-1700A26D495A6D495A6E485A9039F7E03FF001E1B512C0D9C07F90C7FC9038801FF02A34
-7DB331>I<903807FF80013F13F090B512FC3903FE01FE4848487EEA0FF8EA1FF0EA3FE0
-A2007F6D5A496C5A153000FF91C7FCA9127F7FA2003FEC07807F6C6C130F000FEC1F00D8
-07FE133E3903FF80FCC6EBFFF8013F13E0010790C7FC21217DA027>I<3901F81F8000FF
-EB7FF0ECFFF89038F9E3FC9038FBC7FE380FFF876C1307A213FEEC03FCEC01F8EC006049
-1300B1B512F0A41F217EA024>114 D<9038FFE1C0000713FF5A383F803F387E000F1407
-5A14037EA26C6CC7FC13FCEBFFE06C13FC806CEBFF80000F14C06C14E0C6FC010F13F0EB
-007F140F00F0130714037EA26C14E06C13076CEB0FC09038C01F8090B5120000F913FC38
-E03FE01C217DA023>I<133CA5137CA313FCA21201A212031207001FB51280B6FCA3D807
-FCC7FCB0EC03C0A79038FE078012033901FF0F006C13FEEB3FFCEB0FF01A2F7EAE22>I
-E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fl ecrm1200 12 25
-/Fl 25 122 df<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A3120113
-80120313005A1206120E5A5A5A12600B1D78891B>44 D<14FF010713E090381F81F89038
-3E007C01FC133F4848EB1F8049130F4848EB07C04848EB03E0A2000F15F0491301001F15
-F8A2003F15FCA390C8FC4815FEA54815FFB3A46C15FEA56D1301003F15FCA3001F15F8A2
-6C6CEB03F0A36C6CEB07E0000315C06D130F6C6CEB1F806C6CEB3F00013E137C90381F81
-F8903807FFE0010090C7FC28447CC131>48 D<EB03FE90381FFFC0017F13F03901F80FFC
-3903C001FE48486C7E000EC7EA7F8048EC3FC0ED1FE04815F00030140F007015F8006014
-07126CB415FC7F7F1503A46C4813076CC7FCC8FC16F8A2150F16F0151F16E0A2ED3FC0ED
-7F8016005D5D4A5A4A5A4A5A5D4A5A4A5A4AC7FC147C5C5C495A495A495A49C7120C131E
-5B013814185B5B485A4848143848C81230000E1570001FB612F0A25A5AB712E0A326427B
-C131>50 D<EC07FCEC3FFF91B512C0903903FC03E0903907E000F0D91FC0133849C71258
-017EEB01FC01FE1303491307485A485AA24848EB03F8000FEC01F092C7FC485AA3485AA3
-127FA29038007F80903801FFF090380780FC39FF0E003E49EB1F8049EB0FC049EB07E013
-6001E0EB03F04914F8150116FC5BED00FEA390C812FFA47EA57F123FA216FE121F15016D
-14FC120FED03F86C7EED07F06C6C14E06C6CEB0FC06C6CEB1F80017EEB3F0090383F80FE
-90380FFFF8010313E00100138028447CC131>54 D<16C04B7EA34B7EA34B7EA34B7EA3ED
-19FEA3ED30FFA203707FED607FA203E07FEDC03FA2020180ED801FA2DA03007F160FA202
-06801607A24A6D7EA34A6D7EA34A6D7EA20270810260147FA202E08191B7FCA249820280
-C7121FA249C87F170FA20106821707A2496F7EA3496F7EA3496F7EA201788313F8486C83
-D80FFF03037FB500E0027FEBFFC0A342477DC649>65 D<B8FC17E017FC00019039C00003
-FF6C6C4801007FEF3FC0717E717E717E84170384170184A760A21703601707604D5A4D5A
-EF7FC04DC7FCEE03FEEE3FF091B65A17FC0280C7B47EEF1FC0EF0FF0717E717E717E717E
-1980187F19C0A2183F19E0A8F07FC0A2198018FF4D1300A24D5AEF0FFC4D5AEF7FE04848
-6C903803FFC0B9C7FC17FC17C03B447CC345>I<B712FEEEFFE017F800019039C00007FE
-6C6C48903800FF80EF3FC0EF0FF0717E717EEF00FE8484F03F80F01FC0A2F00FE019F018
-0719F8A2180319FCA3F001FEA419FFAD19FEA3180319FCA319F8180719F0180F19E0A2F0
-1FC0F03F80A2F07F0018FE4D5A4D5AEF0FF0EF3FE0EFFF8048486C010790C7FCB812FC17
-E04CC8FC40447CC34A>68 D<B56C933807FFFC6E5EA20001F1FE0026006FE0EE1BF8A3D9
-67F01633A2D963F81663A3D961FC16C3A3D960FEED0183A2027FED0303A36E6C1406A36E
-6C140CA26E6C1418A36E6C1430A36E6C1460A26E6C14C0A36E6CEB0180A3037FEB0300A2
-92383F8006A36F6C5AA36F6C5AA26F6C5AA36F6C5AA36F6C5AA26FB45AA370C7FC13F0A2
-486C143ED80FFFEF0FFEB500F0011C0107B512FCA34E447BC359>77
-D<003FB912F8A3903BF0001FF8001F01806D481303003EC7150048187C0078183CA20070
-181CA30060180CA5481806A5C81600B3B3A54B7EED7FFE49B77EA33F447DC346>84
-D<B600C0010FB5FCA3000101E0C813F026007F80ED1F80F00F00A21806B3B3A7180E6D6C
-150CA2181C131F6E1518010F163818306D6C1570606D6C14016D6C5D6D6CEC0780027F4A
-C7FC6E6C131EDA1FE0137C913907FC03F00201B55A6E6C1380DB07FCC8FC40467CC349>
-I<EB07FC90383FFF809038F80FE03903C003F048C66C7E000E6D7ED80FC0137E486C137F
-6D6D7EA36F7EA26C5AEA0380C8FCA4EC0FFF49B5FC90380FFE1FEB3FC0EBFF00EA03FC48
-5A485A485A485A127F5B176048C7FCA3153FA36D137F007F14EF6D9038C7E0C0003F1301
-3A1FE00783F13B07F81E03FF802701FFFC0113003A001FE0007C2B2E7CAC31>97
-D<EC7F80903803FFF090380FC07C90383F000F01FCEB03804848EB01C00003140F4848EB
-1FE049133F120F485AA2485AED1FC0007FEC070092C7FCA290C9FC5AAB7E7FA2123F1630
-7F001F15706C6C146016E06C6C14C06C6C13010001EC03806C6CEB0700013F131E90381F
-C078903807FFF001001380242E7DAC2B>99 D<167FED3FFFA315018182B3EC7F80903803
-FFF090380FC07C90383F000E017E1307496D5AD803F87F48487F5B000F81485AA2485AA2
-127FA290C8FC5AAB7E7FA2123FA26C7EA2000F5D7F6C6C5B00035C6C6C9038077F806C6C
-010E13C0013F011C13FE90380FC0F8903803FFE09026007F0013002F467DC436>I<EB01
-FE903807FFC090381F03F090387E00FC49137E48487F485A4848EB1F80000F15C049130F
-121F484814E01507A2007F15F090C7FCA25AA390B6FCA290C9FCA67EA27FA2123F16306C
-7E1670000F15606D14E06C6C14C0000314016C6CEB03806C6CEB0700013E131E90381F80
-F8903803FFE0010090C7FC242E7DAC2B>I<EE0F80D901FCEB7FE0903A0FFF81F0F09039
-3F07E3819039FC01FF033A01F800FE014848017E13E00007027FC7FC497F000F8149131F
-001F81A9000F5D6D133F000792C7FC6D5B0003147E6C6C5B6D485A3903BF07E090380FFF
-80260701FCC8FC90CAFCA25AA37F6C7E7F90B512F86C14FF16E06C15F86C6C8048B67E3A
-07C0000FFF48481300003FC8EA3F80003E151F48ED0FC0A2481507A56C150F007C168000
-7E151F003E16006C153E6C6C5CD807E0495AD801F8EB07E0D8007FEB3F8090261FFFFEC7
-FC010113E02C427DAC31>103 D<EA01E0EA07F8A2487EA46C5AA2EA01E0C8FCADEA01FC
-12FFA3120712031201B3B0487EB512F8A315437DC21C>105 D<EA01FC12FFA312071203
-1201B3B3B3A5487EB512F8A315457DC41C>108 D<3901FC01FE00FF903807FFC091381E
-07F091383801F8000701707F0003EBE0002601FDC07F5C01FF147F91C7FCA25BA35BB3A8
-486CECFF80B5D8F83F13FEA32F2C7DAB36>110 D<EC7F80903803FFF090380FC0FC9038
-3E001F496D7E496D7E48486D7E48486D7E48486D7E000F81A24848147E003F157FA290C8
-7E481680A44816C0AA6C1680A26D147F003F1600A2001F157E6D14FE000F5D6D13010007
-5D6C6C495A6C6C495A6C6C495A013E49C7FC90381FC0FE903807FFF89038007F802A2E7D
-AC31>I<3903F803F000FFEB1FFCEC3C3EEC707F0007EBE0FF3803F9C000015B13FBEC00
-7E153C01FF13005BA45BB3A748B4FCB512FEA3202C7DAB26>114
-D<90383FE0183901FFFC383907E01F78390F0003F8001E1301481300007C1478127800F8
-1438A21518A27EA27E6C6C13006C7E13FC383FFFE06C13FC6C13FF6C14C06C14E0C614F0
-011F13F81300EC0FFC140300C0EB01FE1400157E7E153EA27EA36C143C6C147C15786C14
-F86CEB01F039F38003E039F1F00F8039E07FFE0038C00FF01F2E7DAC26>I<1306A5130E
-A4131EA3133E137EA213FE12011207001FB512F0B6FCA2C648C7FCB3A4150CAA017E131C
-017F1318A26D133890381F8030ECC070903807E0E0903801FFC09038007F001E3E7EBC26
->I<D801FC147F00FFEC3FFFA300071401000380000181B3A85EA35DA212006D5B017E90
-38077F80017F010E13C06D011C13FE90380FC078903803FFF09026007F8013002F2D7DAB
-36>I<B539F001FFFCA3000790C7EA7FE06C48EC1F8000011600160E1200160C017F5CA2
-80013F5CA26E1370011F146080010F5CA2ECF00101075CA26D6C48C7FCA26E5A01011306
-A26D6C5AA214FF6E5AA215B8EC3FB015F06E5AA36E5AA26E5AA36EC8FC2E2C7EAA33>I<
-B539F001FFFCA3000790C7EA7FE06C48EC1F8000011600160E0000150C6D141C6D1418A2
-6E1338013F1430A26D6C5BA26E13E0010F5CA26D6C485AA2ECF803010391C7FCA2903801
-FC06A2ECFE0E0100130CA2EC7F18A215B8EC3FB0A2EC1FE0A36E5AA26E5AA36EC8FCA214
-06A35CA25CA2123C007E5BB4FC5CA25CEAFE01387C0380D87007C9FCEA3C1EEA0FFCEA03
-F02E3F7EAA33>121 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fm ecbx1200 12 47
-/Fm 47 123 df<0118140C017C143E01FC147E48485C4848495A495C4848495A4848495A
-001F140F90C75B003E4AC7FCA2003C141E007C143E0078143CA200F8147CA2481478D8F1
-F014F8D8F7FCEB7BFEB46CEB7FFF6D1580028014C0A36C80A36C806C496C13806C486D13
-006C486D5AD801F0EB00F82A2283C427>16 D<D807C0EB03E0D81FF0EB0FF8486C497E48
-6C497E486C497E6D1580A3028014C0A36C806C80D81FF7EB0FFBD807C7EB03E3D80007EB
-0003010F1407A291C71380A249140F011E1500013E5CA249143E01FC147E49147C48485C
-4848495A000714034848495A4848495A90C75B000C0206C7FC2A2281C427>I<ED0FFF4A
-B512C0020F14F0027F80903A01FFF803FC499038C000FE010FEB00034948497E49485B5C
-495A4C138001FF6E13005CA3705AEE01F893C8FCA74BB51280B9FCA5C69038E00003B3B0
-007FD9FFC1B6FCA538467EC53E>28 D<EA07C0EA1FF0EA3FF8EA7FFCEAFFFEA7EA7FFCEA
-3FF8EA1FF0EA07C00F0F788E1F>46 D<EC3FF849B5FC010F14E0013F14F890397FF01FFC
-9039FFC007FE4890380001FF48486D1380000716C049147F000F16E049143F001F16F0A2
-003F16F8A249141F007F16FCA600FF16FEB3A3007F16FCA56C6CEC3FF8A3001F16F0A200
-0F16E06D147F000716C06D14FF6C6C4913806C6D4813006C6D485A90397FF01FFC6DB55A
-010F14E0010314809026003FF8C7FC2F427CC038>48 D<EC03C01407141F147FEB03FF13
-3FB6FCA413C3EA0003B3B3ADB712FCA5264177C038>I<ECFFE0010F13FE013F6D7E90B6
-12E0000315F82607FC0313FE3A0FE0007FFFD81F806D138048C7000F13C0488001C015E0
-01F07F00FF6E13F07F17F881A46C5A6C5A6C5AC9FC17F05DA217E05D17C04B13804B1300
-A2ED1FFC4B5A5E4B5A4B5A4A90C7FC4A5A4A5AEC0FF04A5AEC3F804AC7127814FE495A49
-4814F8D907E014F0495A495A49C8FC017C140149140348B7FC4816E05A5A5A5A5AB8FC17
-C0A42D417BC038>I<ECFFF0010713FF011F14C0017F14F049C66C7ED803F8EB3FFED807
-E06D7E81D80FF86D138013FE001F16C07FA66C5A6C4815806C485BC814005D5E4B5A4B5A
-4B5A4A5B020F1380902607FFFEC7FC15F815FF16C090C713F0ED3FFCED0FFEEEFF80816F
-13C017E0A26F13F0A217F8A3EA0FC0EA3FF0487EA2487EA217F0A25D17E06C5A494913C0
-5BD83F80491380D81FF0491300D80FFEEBFFFE6CB612F800015D6C6C14C0011F49C7FC01
-0113E02D427BC038>I<163FA25E5E5D5DA25D5D5D5DA25D92B5FCEC01F7EC03E7140715
-C7EC0F87EC1F07143E147E147C14F8EB01F0EB03E0130714C0EB0F80EB1F00133E5BA25B
-485A485A485A120F5B48C7FC123E5A12FCB91280A5C8000F90C7FCAC027FB61280A53141
-7DC038>I<0007150301E0143F01FFEB07FF91B6FC5E5E5E5E5E16804BC7FC5D15E092C8
-FC01C0C9FCAAEC3FF001C1B5FC01C714C001DF14F09039FFE03FFC9138000FFE01FC6D7E
-01F06D13804915C0497F6C4815E0C8FC6F13F0A317F8A4EA0F80EA3FE0487E12FF7FA317
-F05B5D6C4815E05B007EC74813C0123E003F4A1380D81FC0491300D80FF0495AD807FEEB
-FFFC6CB612F0C65D013F1480010F01FCC7FC010113C02D427BC038>I<4AB47E021F13F0
-027F13FC49B6FC01079038807F8090390FFC001FD93FF014C04948137F4948EBFFE04849
-5A5A1400485A120FA248486D13C0EE7F80EE1E00003F92C7FCA25B127FA2EC07FC91381F
-FF8000FF017F13E091B512F89039F9F01FFC9039FBC007FE9039FF8003FF17804A6C13C0
-5B6F13E0A24915F0A317F85BA4127FA5123FA217F07F121FA2000F4A13E0A26C6C15C06D
-4913806C018014006C6D485A6C9038E01FFC6DB55A011F5C010714C0010191C7FC903800
-3FF02D427BC038>I<121E121F13FC90B712FEA45A17FC17F817F017E017C0A248168000
-7EC8EA3F00007C157E5E00785D15014B5A00F84A5A484A5A5E151FC848C7FC157E5DA24A
-5A14035D14074A5AA2141F5D143FA2147F5D14FFA25BA35B92C8FCA35BA55BAA6D5A6D5A
-6D5A2F447AC238>I<EA07C0EA1FF0EA3FF8EA7FFCEAFFFEA7EA7FFCEA3FF8EA1FF0EA07
-C0C7FCAEEA07C0EA1FF0EA3FF8EA7FFCEAFFFEA7EA7FFCEA3FF8EA1FF0EA07C00F2C78AB
-1F>58 D<1A60F101F01907191FF17FC0953801FF00F007FCF01FF0F07FC04D48C7FCEF07
-FCEF3FF0EFFFC0040390C8FCEE0FFCEE3FE0EEFF80DB03FEC9FCED0FF8ED3FE0EDFF80DA
-07FECAFCEC1FF8EC7FE0903801FF80D907FCCBFCEB1FF0EB7FC04848CCFCEA07FCEA1FF0
-EA7FC048CDFCA2EA7FC0EA1FF0EA07FCEA01FF38007FC0EB1FF0EB07FC903801FF809038
-007FE0EC1FF8EC07FE913800FF80ED3FE0ED0FF8ED03FE923800FF80EE3FE0EE0FFCEE03
-FF040013C0EF3FF0EF07FCEF01FF9438007FC0F01FF0F007FCF001FF9538007FC0F11FF0
-19071901F10060444277B957>60 D<126012F812FE6C7EEA3FE0EA0FF8EA03FEC66C7EEB
-3FE0EB0FF8EB03FE903800FFC0EC3FF0EC0FFCEC03FF9138007FC0ED1FF0ED07FCED01FF
-9238007FC0EE1FF0EE07FE933801FF809338007FE0EF1FF8EF03FE943800FF80F03FE0F0
-0FF8F003FE953800FF80F13FE0F10FF0A2F13FE0F1FF80953803FE00F00FF8F03FE0F0FF
-80DD03FEC7FCEF1FF8EF7FE0933801FF80DC07FEC8FCEE1FF0EE7FC04B48C9FCED07FCED
-1FF0ED7FC0DA03FFCAFCEC0FFCEC3FF0ECFFC0D903FECBFCEB0FF8EB3FE0EBFF80D803FE
-CCFCEA0FF8EA3FE0EAFF8048CDFC12F81260444277B957>62 D<923803FFF0037FEBFF80
-0203B612F0020F15FC913A3FFC000FFFDAFFC0010013C0D903FEC8EA1FF0D907F0ED03F8
-D91FC0ED00FE4948167F017ECAEA1F8049717E4848717E49DAFF8013034848010F01F06D
-7E4848013F01FC6D7E92B6FC4848489026C07F80137C49489026001FC0133C484948D907
-E0133E001E49486D6C131E003E49480101141F023F913800FFE0003C4A82007C017F1880
-007819074A5AA300F81AC04848491603AB6C6C7F12781B801A076E7E127C003C133F003E
-6E1700021F4A5C001E6D6C5B001F6D6C49EBF01E6C6D6C011F143E6D6CD9C07F6D5A6C6C
-6C90B5383FFFF8033FD9FC0F5B6C6C010FD9F0035B6C6C0100903980007F806D91CBFC6C
-7E137E6D7E6D6CEF7FC0D907F0EE03FFD903FE043F1300902600FFC0913803FFF8DA3FFC
-49B512C0020FB748C7FC020316E0DA007F02FCC8FC030349C9FC4A477AC557>64
-D<EE1F80A24C7EA24C7EA34C7EA24B7FA34B7FA24B7FA34B7F169F031F80161F82033F80
-ED3E07037E80157C8203FC804B7E02018115F0820203814B137F0207815D173F020F814B
-7F021F8292C77EA24A82023E80027E82027FB7FCA291B87EA2498302F0C8FCA20103834A
-157F0107834A153FA249488284011F8491C97E4984133E017E82B6020FB612F0A54C457C
-C455>I<B9FC18F018FE727E19E026003FFCC700077F05017F716C7E727E727EA2721380
-A37213C0A74E1380A24E1300A24E5A4E5A4E5A4D5B05075B94B5128091B700FCC7FC18F0
-18FF19E002FCC7000113F8716C7EF01FFE727E7213801AC07213E0A27213F0A31AF8A71A
-F0A2601AE0604E13C0604E138095B5120005075BBA12F86119C04EC7FC18E045447CC350
->I<DCFFF01470031F01FF14F04AB6EAE0010207EDF803023FEDFE0791B539E001FF0F49
-49C7EA3F9F010701F0EC0FFF4901C0804990C87E4948814948814948167F4849163F4849
-161F5A4A160F485B19074890CAFC19035A5BA2007F1801A34994C7FC12FFAE127F7F1AF0
-A2123FA27F6C18011AE06C7F19036C6D17C06E16077E6C6DEE0F806C6DEE1F006D6C5E6D
-6C167E6D6C6C5D6D6D4A5A6D01F0EC07F0010101FEEC1FE06D903AFFF001FF80023F90B6
-C7FC020715FC020115F0DA001F1480030001F8C8FC44467AC451>I<B9FC18F018FE727E
-19E026003FFEC7001F13F805017F9438003FFF060F7F727F727F727F84737E737EA2737E
-A2737EA21B80A2851BC0A51BE0AD1BC0A51B8061A21B006162193F624F5A19FF624E5B06
-075B4E5B063F90C7FC4DB45A050F13F8BA5A19C04EC8FC18F095C9FC4B447CC356>I<B7
-12E0A5D8001F90C7FCB3B3B3A4B712E0A523447DC32A>73 D<B500FE067FB512806E95B6
-FCA26F5EA2D8003F50C7FC013D6DEE03DFA2013C6DEE079FA26E6CEE0F1FA26E6C161EA2
-6E6C163CA36E6C1678A26E6C16F0A26E6DEC01E0A26E6DEC03C0A36E6DEC0780A26F6CEC
-0F00A26F6C141EA26F6C5CA36F6C5CA26F6C5CA26F6D485AA26F6D485AA26F6D485AA370
-6C48C7FCA293383FF81EA2706C5AA2706C5AA3706C5AA2705BA2705BA2705BA2B6057FB6
-128071C7FCA2173E171C61447CC36A>77 D<923807FFC092B512FE0207ECFFC0021F15F0
-91267FFE0013FC902601FFF0EB1FFF01070180010313C04990C76C7FD91FFC6E6C7E4948
-6F7E49486F7E01FF8348496F7E48496F1380A248496F13C0A24890C96C13E0A24819F049
-82003F19F8A3007F19FC49177FA400FF19FEAD007F19FC6D17FFA3003F19F8A26D5E6C19
-F0A26E5D6C19E0A26C6D4B13C06C19806E5D6C6D4B13006C6D4B5A6D6C4B5A6D6C4B5A6D
-6C4A5B6D01C001075B6D01F0011F5B010101FE90B5C7FC6D90B65A023F15F8020715C002
-004AC8FC030713C047467AC454>79 D<DAFFE0131C010701FE133C013F9038FF807C90B6
-EAE0FC4815F9489038801FFF3907FC00014848EB007F4848143F4848140F491407007F15
-035B1601160012FF177CA27FA26D153C7F7F6D92C7FC6C7EEBFFE014FE6CEBFFF015FF6C
-15E016FC6C816C6F7E6C826C826C6C81011F810107811300020F80140003077FED007F82
-040F1380828212F082A282A27EA218007EA26C5D6C5E6D14036D5D6D140701F84A5A01FF
-EC3FF002F8EBFFE0486CB65AD8FC1F92C7FCD8F80714FC48C614F0480107138031467AC4
-3E>83 D<007FBA12E0BB12F0A46C19E04406776757>95 D<903801FFE0011F13FE017F6D
-7E48B612E03A03FE007FF84848EB1FFC6D6D7E486C6D7EA26F7FA36F7F6C5A6C5AEA00F0
-90C7FCA40203B5FC91B6FC1307013F13F19038FFFC01000313E0481380381FFE00485A5B
-127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83FFE013EEBFFC03A1FFF80FC7F0007EBFFF8
-6CECE01FC66CEB8007D90FFCC9FC322F7DAD36>97 D<EB7FC0B5FCA512037EB1ED0FF892
-B57E02C314E002CF14F89139DFC03FFC9139FF000FFE02FCEB03FF4A6D13804A15C04A6D
-13E05CEF7FF0A218F8173FA318FCAC18F8A2177F18F0A3EFFFE06E15C06E5B6E49138002
-7C491300496C495A903AFC1FC07FFC496CB512F0D9F00314C049C691C7FCC8EA1FF03646
-7DC43E>I<EC3FFC49B512C0010F14F0013F14FC90397FF003FE9039FFC001FF0003495A
-48494813805B120F485AA2485A6F1300007F6E5AED00784991C7FCA212FFAC6C7EA3123F
-6DEC03C0A26C6C1407000F16806D140F6C6DEB1F006C6D133E6C01F05B3A007FFC03F86D
-B55A010F14C0010391C7FC9038003FF82A2F7CAD32>I<EE03FEED07FFA5ED001F160FB1
-EC3FE0903803FFFC010FEBFF8F013F14CF9039FFF807FF48EBC00148903880007F4890C7
-123F4848141F49140F121F485AA3127F5BA212FFAC127FA37F123FA26C6C141FA26C6C14
-3F0007157F6C6C91B5FC6CD9C00314FC6C9038F01FEF6DB5128F011FEBFE0F010713F890
-26007FC0EBF80036467CC43E>I<EC3FF80103B57E010F14E0013F8090397FF83FF89039
-FFC007FC48496C7E48496C7E48486D1380485A001FED7FC05B003FED3FE0A2127F5B17F0
-161F12FFA290B7FCA401F0C9FCA5127FA27FA2123F17F06C7E16016C6C15E06C6C14036C
-6DEB07C06C6DEB0F806C01F0EB3F0090397FFE01FE011FB55A010714F0010114C0902600
-1FFEC7FC2C2F7DAD33>I<EDFF80020F13E0027F13F049B512F849EB8FFC90390FFE0FFE
-90381FFC1F14F8133FEB7FF0A2ED0FFCEBFFE0ED03F0ED00C01600ABB612F8A5C601E0C7
-FCB3B0007FEBFFE0A527467DC522>I<DAFFE0137E010F9039FE03FF80013FEBFF8F90B8
-12C048D9C07F133F489038001FF84848EB0FFC4848903907FE1F80001F9238FF0F00496D
-90C7FCA2003F82A8001F93C7FCA26D5B000F5D6C6C495A6C6C495A6C9038C07FF04890B5
-5A1680D8078F49C8FC018013E0000F90CAFCA47F7F7F90B612C016FC6CEDFF8017E06C82
-6C16FC7E000382000F82D81FF0C77ED83FC014074848020113808248C9FC177FA46D15FF
-007F17006D5C6C6C4A5A6C6C4A5AD80FFEEC3FF83B07FFC001FFF0000190B612C06C6C92
-C7FC010F14F8D9007F90C8FC32427DAC38>I<EB7FC0B5FCA512037EB1ED07FE92383FFF
-8092B512E002C114F89139C7F03FFC9138CF801F9139DF000FFE14DE14FC4A6D7E5CA25C
-A35CB3A7B60083B512FEA537457CC43E>I<137C48B4FC4813804813C0A24813E0A56C13
-C0A26C13806C1300EA007C90C7FCAAEB7FC0EA7FFFA512037EB3AFB6FCA518467CC520>
-I<EB7FC0B5FCA512037EB3B3B3A3B61280A519457CC420>108 D<90277F8007FEEC0FFC
-B590263FFFC090387FFF8092B5D8F001B512E002816E4880913D87F01FFC0FE03FF8913D
-8FC00FFE1F801FFC0003D99F009026FF3E007F6C019E6D013C130F02BC5D02F86D496D7E
-A24A5D4A5DA34A5DB3A7B60081B60003B512FEA5572D7CAC5E>I<90397F8007FEB59038
-3FFF8092B512E0028114F8913987F03FFC91388F801F000390399F000FFE6C139E14BC02
-F86D7E5CA25CA35CB3A7B60083B512FEA5372D7CAC3E>I<EC1FFC49B512C0010714F001
-1F14FC90397FF80FFF9026FFC0017F48496C7F4848C7EA3FE000078248486E7E49140F00
-1F82A2003F82491407007F82A400FF1780AA007F1700A46C6C4A5AA2001F5E6D141F000F
-5E6C6C4A5AA26C6C6CEBFFE06C6D485B27007FF80F90C7FC6DB55A010F14F8010114C090
-26001FFCC8FC312F7DAD38>I<90397FC00FF8B590B57E02C314E002CF14F89139DFC03F
-FC9139FF001FFE000301FCEB07FF6C496D13804A15C04A6D13E05C7013F0A2EF7FF8A4EF
-3FFCACEF7FF8A318F017FFA24C13E06E15C06E5B6E4913806E4913006E495A9139DFC07F
-FC02CFB512F002C314C002C091C7FCED1FF092C9FCADB67EA536407DAC3E>I<DA3FE013
-1E902603FFFC133E010F01FF137E013F1480903AFFF80FE0FE489038E003F148EBC00148
-90388000FB4890C7127F49143F001F151F485A160F5B127FA3485AAC6C7EA46C7EA26C6C
-141F163F6C6C147F6C15FF6C6D5A6C9038E003EF6C9038F01FCF6DB5128F011FEBFE0F01
-0313F89038007FC091C7FCAD0307B512FCA536407CAC3B>I<90387F807FB53881FFE002
-8313F0028F13F8ED8FFC91389F1FFE000313BE6C13BC14F8A214F0ED0FFC9138E007F8ED
-01E092C7FCA35CB3A5B612E0A5272D7DAC2E>I<90391FFC038090B51287000314FF120F
-381FF003383FC00049133F48C7121F127E00FE140FA215077EA27F01E090C7FC13FE387F
-FFF014FF6C14C015F06C14FC6C800003806C15806C7E010F14C0EB003F020313E0140000
-F0143FA26C141F150FA27EA26C15C06C141FA26DEB3F8001E0EB7F009038F803FE90B55A
-00FC5CD8F03F13E026E007FEC7FC232F7CAD2C>I<EB01E0A51303A41307A2130FA2131F
-A2133F137F13FF1203000F90B51280B7FCA4C601E0C7FCB3A3ED01E0A9150302F013C013
-7F150790393FF80F8090391FFC1F006DB5FC6D13FC01015B9038003FE023407EBE2C>I<
-D97FC049B4FCB50103B5FCA50003EC000F6C81B3A85EA25EA25E7E6E491380017FD901F7
-13FE9138F807E76DB512C7010F1407010313FE9026007FF0EBFC00372E7CAC3E>I<B690
-3803FFFCA5000101E09038003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303
-010F5D6E13076D5DED800F6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8
-F8023F5B15FD021F5B15FF6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578362C7EAB3B>
-I<B500FE90383FFFF0A5C601F0903803E0006D6C495A6D6C495A011F4AC7FC6E5B6D6C13
-7E6DEB807C6D6D5A6DEBC1F0EDE3E06DEBF7C06EB45A806E90C8FC5D6E7E6E7F6E7FA24A
-7F4A7F8291381F3FFCEC3E1F027C7F4A6C7E49486C7F01036D7F49487E02C08049486C7F
-49C76C7E013E6E7E017E141FB500E090B512FCA5362C7EAB3B>120
-D<001FB71280A49026FC001F130001E0495A5B49495A90C7485A48495B123E4A5B4A5B00
-3C495BA24A90C7FC4A5A4A5AC7FC4A5A495B495BA2495B499038800780491300A2495A49
-48130F49481400A2485B48495B485BA248495B4890C75A48485C15034848EB1FFEB7FCA4
-292C7DAB32>122 D E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fn ecrm1728 17.28 8
-/Fn 8 117 df<B912F018FF19E019F8C601FCC8EA7FFED93FF892380FFF80011F04017F
-9538007FF0F11FF8737EF103FE737E737F747E747E747E1A0F87747E1A0387747EA27413
-80A2F37FC0A21CE01B3FA21CF0A21B1F1CF8A31CFCA21B0FA41CFEAF1CFCA51B1F1CF8A4
-F33FF0A21CE0A21B7F1CC01BFF1C80A2501300A2505A505AA2505A505A505A505A1AFF4F
-5B4F90C7FCF107FCF11FF8F17FF0953801FFC0013F04075BD9FFFCDB7FFEC8FCBA12F819
-E096C9FC18F0576278E167>68 D<BB12FCA4C601FCC8120FD93FF89238007FFE011F171F
-190719031900A21A7E1A3EA21A1EA21A1F86A486A6F20380A318E0A297C7FCA61701A417
-031707170F171F17FF91B7FCA402F8C7FC171F170F170717031701A41700A895C9FCB3A5
-80133F90B57EB712E0A4496278E158>70 D<EC3FE0903803FFFE010F6D7E90393FC03FE0
-90397C000FF801F0EB03FC48486D7E48486D7E48486E7E48C86C7E7F01F06E7E487E6D6E
-7EA3707EA36C5AEA03E0C9FCA6167FED7FFF020FB5FC91387FF807903801FF80903807FC
-00EB1FF0EB7FC0495AD803FEC7FC485A120F5B485A485AA24848EE01C0A312FF5BA2160F
-A3161F6D141B007F153B16736D17806C6C9138E1FC03001FEC03C16C6C903A0780FE0700
-D807FE49486C5A2701FF807CEB7FFE6C6CB4486D5A011F01E06D5A010390C7EA07E03A41
-79BF43>97 D<ED1FE0EDFFF8020313FE91380FF03F91391FC01F8091383F807F91397F00
-FFC014FE1301495A5C0107EC7F80A24948EB1E0093C7FCA2495AB3A5B712E0A426001FE0
-C8FCB3B3B0497EEB7FFC003FB512FEA42A657DE429>102 D<1378EA01FE487E487FA66C
-90C7FC6C5AEA007890C8FCB3A2EB0780EA0FFFB5FCA41203C6FCA2137FB3B3AC497E487F
-B61280A4195F7BDE25>105 D<010FEB07F8D80FFFEB1FFEB590387FFF809238F81FC091
-3801E03F913903C07FE00003EB0780C6EB0F00140E6D5A0218EB3FC00238EB1F800230EB
-0600027090C7FCA2146014E0A25CA55CB3B0497E4813F0B612F8A42B3F7BBE34>114
-D<9138FFC003010FEBF807017FEBFE0F3A01FF003F9FD803F0EB07DF48486DB4FCD80F80
-1300001F8148C8FC003E81007E81127C00FC81A4827EA27E7F6C7E6D91C7FC13F8EA3FFE
-381FFFE06C13FF15F0000314FE6C6E7E6C6C14E0011F14F801078001008002077FDA003F
-13801507030113C0ED007F00E0ED3FE0161F17F06C150F1607A36C1503A37EA26C16E016
-077E17C06D140F6D15806D141FD8FDF0EC3F00D8F8F8147E017C495A3AF01F801FF06DB5
-12C0D8E00391C7FC39C0007FF02C417CBF35>I<1470A714F0A51301A31303A21307A213
-0FA2131F133F137F13FF1203000F90B6FCB8FCA326000FF0C8FCB3AEEE01C0AE6D6CEB03
-80A316076D6C14005E6D6C130E6D6C131E6E6C5A91383FE0F86EB45A020713C0020090C7
-FC2A597ED734>I E
-%EndDVIPSBitmapFont
-%DVIPSBitmapFont: Fo ecbx1728 17.28 18
-/Fo 18 117 df<BB7E1AFCF2FFC01BF01BFED8000191C8001F6D7E070014E0081F7F0807
-13FC08017F747F093F7F757F757F757F757F757F757FA2767E1E80881EC0881EE0881EF0
-A2881EF8A31EFC88A31EFEA61EFFB01EFEA61EFCA2641EF8A31EF064A21EE0641EC0641E
-80521300A2525A515B515BA2515B515B093F5B515B504848C7FC08075B081F5B97B512E0
-070F1480BC48C8FC1BF81BC008FCC9FC1A8068627BE177>68 D<942603FFF8151C94B66C
-143C040F03F0147C047F03FC14FC0303B81301030FDAC00113C0033F01F8C7381FF00392
-B500C0913807F807020349C83801FE0F020F01F89238007F1F4A01E0EE3FBF4A49EE0FFF
-91B5CA7E494983494983494983495B4949187F4B183F491A1F495B90B5CC120FA2484919
-075A4A19035A4A19015AA24A19005AA348491A7CA35A9AC8FCA35CA2B5FCB07EA26E043F
-B81280A47E96C7000701FCC7FCA26C7FA37E80A27E807E807E6C7FA26D7F6D7F7F816D7F
-6D6D5F6D7F6D6D5F6D6D7E023F6D5E6E01F05E6E6DEEFE7F020301FF923801FC3F020002
-C0913807F80F033F01FC91381FF007030F903BFFE001FFC001030391B6EA8000DB007F4B
-C7123C040F03F8140C040003C091C8FC050301F8CBFC696677E37A>71
-D<BA12E0F1FF801AF81AFF1BC0D8000191C7000114F0DE000F13FC070313FF070080083F
-7F747F747F747F747FA2747F88A28986A389A865A35091C8FCA26462646462505B505B50
-138097B5C9FC070313FC070F5B4EB512C093B8CAFC1AF81AC01AF893C7000713FE06006D
-7E073F7F7313F007077F737F87737F85888688A2747FAA88A91F707614F8A286A2746D13
-011FF086746D13037614E0B800FE6EED07C0746CEBC00F759038F07F80090F90B5120009
-035CCF6C13F80A0313E06D647BE173>82 D<001FBD12F0A59126F8000191C7123F4801C0
-060713F849C71700491A7F01F01A1F491A0F491A07A2491A03A290C81801A2007EF300FC
-A4007C1C7CA7481C3EA5C91900B3B3B3A5023FB912F8A55F617AE06C>84
-D<913803FFF0027F13FF0103B612E0010F15F890263FFC0013FED97FC090381FFF8049C7
-6C7F4801C06D7F486D6D7F6E6D7F48836E7F84177F84A36C496E7FA26C5B6C5B013FC8FC
-90C9FCA75F0307B6FC4AB7FC141F91B5EAF03F0103EBFE00010F13F0013F1380D9FFFEC7
-FC485B485B485B485B485B485BA24890C8FC1A7CA2485AA35FA394B5FC7F6C5D6EEB03DF
-6CDB07CFEBC0F86C6DEB0F8F6C6DD91F07EBF3F06C01F8017E14FF6C9027FE01FC0314E0
-C690B5D8F00114C0013F9126C0007F1380010791C7383FFE009026003FF8EC07F846437B
-C14D>97 D<903807FF80B6FCA5C6FC7F7FB3A9933801FFE0041F13FE047FEBFFC00381B6
-12F0922687FC0113FC923A9FE0003FFEDBBF8090380FFF8003FEC76C7F4B6E7F4B6E7F4B
-6E7F4B824B157F4B82737EA21B80851BC0A31BE085A41BF0AE1BE0A44F13C0A31B80A24F
-1300A262197F6F5E6F4B5A4E5B6F4A5BDAFCF84A5BDAF87E4A5B4A6C4A90C7FC9126E01F
-C0EB7FFC913BC00FF803FFF8DA8003B612E091C71580013E023F01FCC8FC90C800031380
-4C657CE356>I<ED1FFF4AB512F8020F14FF027F15C0902701FFF80013F04901E0EB0FF8
-010F0180EB03FC4990C7EA0FFE49484A7E49485C4948168048495C5A5C5A485BA2487013
-005C48705A715AEF03F04893C8FC91CBFCA4B5FCAE7EA280A27EA36C7FF003E07E6E1507
-6C18C06E150F6C18806C6D151F6C6DED3F006D6C157E6D6C15FE6D6D495A6D6D495A6D01
-F0EB0FE0010101FEEB7FC06D6CB6C7FC021F14FC020314E09126001FFEC8FC3B437BC145
->I<ED3FFE0203B512E0021F14FC027F14FF902701FFF80F13C00107D9C0037F4990C77F
-49486E7E49486E7E49486E7E49486E7E5A48496E13805A4A16C0488219E0485B834818F0
-A34890C8FCA27113F8A3B5FCA391B8FCA491CBFCA67EA4807EA27E19F8806C17016C18F0
-806C17036C6DED07E06E16C06C170F6D6CED1F806D6CED3F006D6C6C14FE01076DEB03FC
-6D01F8EB0FF8010001FFEB7FE0023F90B51280020F4AC7FC020114F8DA000F13803D437C
-C146>101 D<EEFFE0031F13FC92B6FC02031580020F9038E03FC04A903800FFE091267F
-FE0113F04A485A49494813F84913F04913E0A25B15C05B7013F04913807013E09338007F
-80EF1E0094C7FCB1B8FCA5D8003F0180C8FCB3B3B2B712F8A535657CE42F>I<F13F8091
-2601FFF0903801FFE0021F01FF010713F091B6D8E01F13F801039238F87FCF010F903BC0
-7FFEFC0FFC903B1FFE000FFFF0D97FFC6DEBE01F49486D140F48496D13F01AF848496DEB
-F807489438FC01E096C7FC48496E7EA44883A96C5FA46C6D4A5AA26C5F6C6D495BA26C6D
-495B6D6C495B6D6C4990C8FC903A7FFFC07FFE017B90B512F801F015E0021F91C9FC0001
-010113F049CCFC1203A27FA37FA27F7F6D7E91B612FCEFFFE06C17FCF0FF806C18E0856D
-17FC6D836D837F017F188048BA12C000070180C712074848C96C13E04848160F48481603
-4982007F19F084485A197FA56D17FF007F19E0A26D5E6C6C4C13C0001F19806D5E6C6C4C
-1300000301C0ED3FFC6C01F0EDFFF826007FFC020313E090261FFFE0017F1380010790B6
-48C7FC010116F8D9001F1580DA007F01E0C8FC46607CC14D>I<EB0FE0EB3FF8497E497E
-487FA24880A76C91C7FCA26C5B6D5A6D5AEB0FE090C9FCB1903807FF80007FB5FCA5C6FC
-7F7FB3B3B0B712C0A522657CE42A>105 D<903807FF80B6FCA5C6FC7F7FB3B3B3B3AFB7
-12E0A523647CE32A>108 D<D90FFFEC7FF8B60103B5FC040F14E0043F80DC7F0113FC92
-2601F8007FC6DA03E06D7E6D49487F6D49488193C77E031E825D153803788003708215F0
-5DA35DA35DB3B3A2B7D8E03FB612F8A54D417BC056>110 D<92381FFF804AB512F8020F
-14FF023F15C09126FFFC0313F001039039E0007FFC490180EB1FFED91FFEC73807FF8049
-486E7F49486E7F49486E7F48496F7EA248496F7E4884A248496F7EA2481980A24819C091
-C97EA24819E0A5B518F0AD6C19E0A46C6D4B13C0A36C1980A26C6D4B1300A26C606E157F
-6C606C6D4B5A6C606D6C4A5B6D6C4A5B6D6C4A5B6D6C6C011F90C7FC010301E0EB7FFC6D
-9039FC03FFF86D6CB612E0020F92C8FC020114F8DA001F138044437CC14D>I<903B07FF
-8001FFE0B6011F13FE047FEBFFC00381B612F0922687FC0313FC923A9FE0007FFEC6DABF
-806D6C7E6D01FEC7000F7F6D496E7F4B824B6E7F4B6E7F4B804B82737EA21B80851BC0A2
-851BE0A4851BF0AE4F13E0A41BC061A21B80A24F1300A24F5AA26F4A5B6F4A5B626F4A5B
-6F4A5B03FE4A5B03BF027F90C7FCDB9FC0EBFFFC92268FF8075B0383B612E00380158004
-3F01FCC8FC0403138093CBFCB3A4B712E0A54C5D7CC056>I<D90FFFEB07F8B6EB3FFF4C
-13804BB512E0923903F83FF0923907E07FF8C691380F80FF6D020113FC6D131E153E153C
-1578A21570DBF00013F8EF7FF04BEB3FE0EF0F8094C7FC5DA65DB3B1B712F8A536417DC0
-3E>114 D<DA7FFC131C0107B5EAC03C011FECF0FC90B612FD489038C003FFD807FEC712
-7FD80FF8143F49140F4848140748481403A248481401A2160012FFA26D157CA27F7F7F6D
-92C7FCEBFF806C13F0ECFFC015FE6CECFFC016F86C15FE6C6F7E6C826C826C826C82013F
-81010F81010181EB003F02011580EC000F1500041F13C000F88182826C8182A26C167FA3
-7E18807F17FF6D16007F6D4A5A7F6D4A5A6DEC0FF86D6C495A3BFE1FF001FFE0486CB612
-80D8F8034AC7FC48C614F048010F90C8FC32437BC13D>I<EC07C0A6140FA5141FA3143F
-A2147FA214FF5BA25B5B5B5B137F48B5FC000F91B512F8B8FCA4D8001F01C0C7FCB3B017
-1FAD6D153E81A26D157C816D15F86D7F6D9038FC01F091397FFF07E06EEBFFC0020F1480
-0203EBFE009138003FF8305C7DDA3C>I E
-%EndDVIPSBitmapFont
-end
-%%EndProlog
-%%BeginSetup
-%%Feature: *Resolution 600dpi
-TeXDict begin
-%%PaperSize: A4
-
-%%EndSetup
-%%Page: 1 1
-1 0 bop 290 639 a Fo(Genealogical)56 b(Represen)l(tation)e(of)f(T)-13
-b(rees)52 b(in)g(Databases)1686 822 y Fn(First)46 b(Draft)1247
-1063 y Fm(Miguel)36 b(Sofer)i(<mig@utdt.edu>)1359 1179
-y Fl(Univ)m(ersidad)33 b(T)-8 b(orcuato)33 b(Di)f(T)-8
-b(ella)1728 1295 y(Buenos)33 b(Aires)1797 1411 y(Argen)m(tina)1746
-1606 y(Ma)m(y)h(6,)e(2000)1839 1905 y Fk(Abstract)441
-2035 y Fj(blah)25 b(blah)h(.)13 b(.)g(.)118 2310 y Fi(1)131
-b(In)l(tro)t(duction)118 2491 y Fh(T)-7 b(rees)28 b(are)h(a)g(v)n(ery)f
-(frequen)n(t)h(data)f(structure.)41 b(They)30 b(are)e(the)h(natural)g
-(represen)n(tation)e(for)i(instance)g(for)f(organiza-)118
-2591 y(tional)f(c)n(harts,)g(threaded)g(discussion)g(groups,)f(some)h
-(bills)g(of)h(materials,)e(.)14 b(.)g(.)243 2691 y(A)n(t)28
-b(least)f(t)n(w)n(o)f(alternativ)n(e)h(represen)n(tations)e(for)i
-(trees)g(in)h(RDBMs)g(are)e(kno)n(wn)h(and)h(used:)220
-2857 y(1.)41 b Fg(P)m(oin)m(ters:)k Fh(a)31 b(\034eld)h(in)h(the)f(c)n
-(hild)g(record)e(references)h(the)h(paren)n(t)f(no)r(de.)50
-b(This)32 b(seems)g(to)f(b)r(e)i(the)f(canonical)326
-2956 y(represen)n(tation.)38 b(Some)29 b(DB)g(engines)f(pro)n(vide)g
-(sp)r(ecial)g(SQL)g(extensions)g(to)h(simplify)g(tree)g(searc)n(hes;)e
-(Oracle)326 3056 y(tree)d(extensions)g(are)g(an)h(example)f(\(see)h
-(for)f(instance)g([1]\);)i(DB2's)f(WITH)g(can)f(b)r(e)i(used)e(for)h
-(this)g(purp)r(ose)f(to)r(o)326 3156 y(\(see)j([3],)g(pp)h(139-162\).)
-220 3322 y(2.)41 b Fg(Nested)35 b(Sets:)43 b Fh(t)n(w)n(o)30
-b(n)n(umeric)h(\034elds)g(in)g(ev)n(ery)f(no)r(de)h(record)f(co)r(de)h
-(the)g(tree)g(structure.)47 b(I)31 b(can't)g(pro)n(vide)f(a)326
-3421 y(b)r(etter)e(or)e(briefer)h(description)g(of)h(this)g(metho)r(d)g
-(than)f(the)h(four)f(articles)g([2].)118 3587 y(These)g(t)n(w)n(o)g
-(metho)r(ds)h(o\033er)f(di\033eren)n(t)h(adv)-5 b(an)n(tages)25
-b(and)j(disadv)-5 b(an)n(tages:)243 3753 y Ff(\017)41
-b Fh(P)n(oin)n(ters)30 b(are)g(extremely)g(e\036cien)n(t)h(for)f(no)r
-(de)h(insertion)f(and/or)g(deletion,)h(but)h(require)e(recursiv)n(e)f
-(table)i(ac-)326 3853 y(cesses)e(to)h(searc)n(h)f(the)h(tree)g(\(I)h
-(do)f(not)g(kno)n(w)f(the)i(implemen)n(tation)f(details)g(of)g(the)h
-(Oracle)e(tree)g(extensions,)326 3953 y(whic)n(h)e(as)g(far)g(as)g(I)g
-(kno)n(w)g(ma)n(y)g(solv)n(e)f(this)i(problem)f(in)n(ternally;)g(they)g
-(de\034nitely)h(solv)n(e)f(it)g(for)g(the)h(end)g(user\).)243
-4119 y Ff(\017)41 b Fh(Nested)30 b(sets)g(are)f(v)n(ery)f(e\036cien)n
-(t)i(for)g(tree)f(searc)n(hes,)g(but)i(are)e(rather)f(exp)r(ensiv)n(e)i
-(for)f(no)r(de)h(insertion)f(and/or)326 4218 y(deletion:)37
-b(they)27 b(require)g(up)r(dating)g(p)r(oten)n(tially)h(man)n(y)f(no)r
-(des.)243 4384 y(W)-7 b(e)30 b(prop)r(ose)f(here)h(a)g(di\033eren)n(t)h
-(represen)n(tation,)e(based)g(on)i(no)r(de)f(iden)n(ti\034ers)g(whic)n
-(h)g(are)f(\020genealogical)f(iden)n(ti-)118 4484 y(\034ers\021:)44
-b(they)32 b(con)n(tain)f(the)h(complete)f(genealogy)f(of)h(the)h(no)r
-(de,)h(i.e.,)g(the)f(list)g(of)g(ancestors)d(up)j(to)g(the)g(ro)r(ot)f
-(of)g(the)118 4584 y(tree.)243 4683 y(This)j(allo)n(ws)f(to)i(replace)e
-(man)n(y)h(searc)n(hes)f(in)h(database)g(tables)g(with)h(string)f(op)r
-(erations)f(on)h(the)h(index.)58 b(The)118 4783 y(result,)24
-b(as)f(explained)h(in)g(Section)g(3)f(is)h(that)g(tree)f(searc)n(hes)f
-(pro)r(ceed)h(at)h(\020nested)f(sets\021)30 b(sp)r(eed,)25
-b(while)f(no)r(de)g(insertions)118 4882 y(and)k(deletions)f(are)f(as)h
-(fast)h(as)f(with)h(p)r(oin)n(ters.)243 4982 y(The)i(ob)n(vious)f(do)n
-(wnside)h(of)h(the)g(metho)r(d)g(is)f(that)h(the)g(primary)f(k)n(ey)f
-(in)i(the)g(tree)f(needs)h(to)f(b)r(e)h(a)g(v)-5 b(ariable)29
-b(size)118 5082 y(text)j(\034eld,)h(and)f(that)g(the)g(iden)n
-(ti\034ers)f(ma)n(y)g(b)r(e)i(extremelly)e(long)g(for)g(deep)h(trees.)
-49 b(W)-7 b(e)32 b(will)g(pro)n(vide)e(estimates)i(of)118
-5181 y(the)c(size)f(required)g(as)g(a)g(function)h(of)g(the)f
-(magnitude)h(of)f(the)h(tree.)1987 5653 y(1)p eop
-%%Page: 2 2
-2 1 bop 118 291 a Fi(2)131 b(Genealogical)45 b(iden)l(ti\034ers)g(for)f
-(trees)118 489 y Fm(2.1)112 b(De\034nition)118 642 y
-Fh(W)-7 b(e)28 b(de\034ne)g Fe(gene)l(alo)l(gic)l(al)k(identi\034ers)j
-Fh(recursiv)n(ely)25 b(as)i(follo)n(ws:)326 808 y Fg(De\034nition:)59
-b Fe(The)42 b(gene)l(alo)l(gic)l(al)h(identi\034er)f(\(gID\))e(of)i(a)f
-(no)l(de)h(is)f(obtaine)l(d)h(by)g(app)l(ending)g(a)f(child)326
-908 y(identi\034er)30 b(to)g(the)g(gene)l(alo)l(gic)l(al)h
-(identi\034er)g(of)f(the)g(p)l(ar)l(ent)f(no)l(de.)243
-1074 y Fh(Remark)40 b(that)h(genealogical)e(iden)n(ti\034ers)i(are)f
-(rather)g(w)n(ell)h(kno)n(wn)f(and)h(used;)48 b(common)41
-b(examples)f(are)g(the)118 1174 y(\020path+\034le-name\021)33
-b(in)28 b(a)f(computer)g(\034le)h(system)f(and)h(the)f(URLs)h(within)g
-(a)f(WWW.)243 1273 y(The)d(name)g(\020genealogical)e(iden)n
-(ti\034er\021)30 b(is)24 b(suggested)g(b)n(y)g(the)g(fact)h(that)f(the)
-h(v)-5 b(alue)24 b(of)g(the)h(iden)n(ti\034er)f(con)n(tains)f(the)118
-1373 y(complete)30 b(genealogy)d(of)j(the)g(no)r(de:)41
-b(it)30 b(con)n(tains)e(as)h(a)h(substring)f(the)h(gID)f(of)h(its)g
-(father,)g(whic)n(h)f(in)h(turn)g(con)n(tains)118 1472
-y(as)d(a)g(substring)g(the)h(gID)g(of)f(the)h(grandfather,)e(.)14
-b(.)g(.)243 1572 y(The)27 b(ro)r(ot)g(no)r(de)h(of)f(the)h(tree)f(has)g
-(a)h(gID)f(with)h(v)-5 b(alue)28 b(\021)34 b(\(the)28
-b(empt)n(y)g(string\),)f(as)g(it)h(has)f(no)g(paren)n(t.)118
-1804 y Fm(2.2)112 b(Child)36 b(iden)m(ti\034ers)118 1958
-y Fh(The)26 b(ob)n(vious)e(c)n(hild)i(iden)n(ti\034er)g(is)f(a)h
-(zero-based)d(coun)n(ter:)35 b(iden)n(tify)26 b(the)h(c)n(hild)e(b)n(y)
-h(the)g(n)n(um)n(b)r(er)f(of)h(older)f(brethren)g(it)118
-2057 y(has.)243 2157 y(W)-7 b(e)25 b(could)f(represen)n(t)g(the)h(coun)
-n(ter)f(in)h(base)f(10;)h(this)g(ho)n(w)n(ev)n(er)e(is)i(extremely)f(w)
-n(asteful)g(of)h(resources.)34 b(It)25 b(is)g(m)n(uc)n(h)118
-2257 y(b)r(etter)33 b(to)f(represen)n(t)f(the)h(coun)n(ter)g(in)g(as)g
-(large)e(a)i(base)g(as)f(p)r(ossible:)46 b(in)n(terpret)32
-b(as)f(n)n(um)n(b)r(ers)h(a)g(set)g(of)g(c)n(haracters)118
-2356 y(larger)26 b(than)h({0,1,.)14 b(.)g(.)g(9}.)243
-2456 y(As)26 b(tree)f(op)r(erations)f(will)i(in)n(v)n(olv)n(e)f(string)
-g(op)r(erations)f(on)i(the)g(indices,)g(in)g(order)f(to)g(a)n(v)n(oid)g
-(a)g(\020quoting)g(hell\021)33 b(it)26 b(is)118 2555
-y(desirable)d(to)h(a)n(v)n(oid)e(using)h(an)n(y)g(c)n(haracter)f(with)i
-(a)g(sp)r(ecial)f(meaning)h(in)g(LIKE)g(expressions)e(or)g(regular)g
-(expressions;)118 2655 y(i.e.,)28 b(w)n(e)f(will)h(not)f(use)h(an)n(y)f
-(of)g(the)h(sym)n(b)r(ols)70 b Fd(.)44 b(*)f(^)g(\\)g([)g(])g({)h(})f
-(\()g(\))g(<)g(>)71 b Fh(?)37 b(|)28 b(&)f($)243 2755
-y(W)-7 b(e)28 b(prop)r(ose)e(to)h(reserv)n(e)f(also)g(/)i(as)f(a)g
-(separator)e(\(see)i(\020V)-7 b(ariable)27 b(Sized)g(gID\021)34
-b(b)r(elo)n(w\).)243 2854 y(If)g(w)n(e)f(limit)i(ourselv)n(es)d(to)i
-(ascii)f(c)n(haracters,)g(and)h(a)n(v)n(oid)e(to)i(b)r(e)g(safe)f(a)h
-(lot)g(of)g(other)f(c)n(haracters,)g(w)n(e)g(can)h(use)118
-2954 y(n)n(um)n(b)r(ers)27 b(in)h(base)f(64)g(b)n(y)g(represen)n(ting)
-243 3120 y Ff(\017)41 b Fh(0-9)26 b(with)i('0'-'9')f(\(dec)g(ascii)g
-(co)r(de)h(48-57\))243 3286 y Ff(\017)41 b Fh(10)26 b(with)i(':')37
-b(\(dec)28 b(ascii)f(co)r(de)h(58\))243 3452 y Ff(\017)41
-b Fh(11)26 b(with)i(';')g(\(dec)g(ascii)f(co)r(de)g(59\))243
-3618 y Ff(\017)41 b Fh(12-37)25 b(with)j('A'-'Z')g(\(dec)f(ascii)g(co)r
-(de)h(65-90\))243 3784 y Ff(\017)41 b Fh(38-63)25 b(with)j('a'-'z')f
-(\(dec)h(ascii)f(co)r(de)g(97-122\))118 3950 y(By)g(using)g(base)f(64,)
-h(up)g(to)h(4096)d(c)n(hildren)i(can)f(b)r(e)i(represen)n(ted)e(using)h
-(t)n(w)n(o)f(suc)n(h)h(digits,)g(up)h(to)f(262144)d(with)k(three)118
-4050 y(digits,)g(and)f(up)h(to)f(16777216)d(with)k(four)f(digits.)243
-4149 y(If)37 b(the)g(RDBMs)g(supp)r(orts)f(in)n(ternational)g(c)n
-(haracters,)h(it)g(is)g(p)r(ossible)f(to)h(further)f(increase)g(the)h
-(base;)k(as)36 b(an)118 4249 y(example,)30 b(b)n(y)f(using)g(the)h(95)f
-(additional)g(c)n(haracters)e(of)i(the)h(latin-1)f(c)n(haracter)e(set,)
-k(w)n(e)e(could)g(co)r(de)g(n)n(um)n(b)r(ers)g(in)h(a)118
-4349 y(base)f(up)g(to)g(160)f(\025)g(remark)g(that)h(ev)n(ery)f(single)
-h(digit)g(is)g(still)h(one)e(b)n(yte)h(in)h(this)f(represen)n(tation.)
-40 b(This)29 b(means)f(that)118 4448 y(w)n(e)f(expand)h(the)f(sym)n(b)r
-(ols)g(ab)r(o)n(v)n(e)f(b)n(y)i(represen)n(ting)243 4614
-y Ff(\017)41 b Fh(64-159)25 b(with)j(dec)f(latin1)g(co)r(de)h(160-255)
-243 4780 y(In)23 b(base)g(160,)g(up)g(to)h(25600)d(c)n(hildren)i(can)f
-(b)r(e)i(represen)n(ted)e(using)h(t)n(w)n(o)g(digits,)h(up)g(to)f
-(4096000)d(with)k(three)f(digits,)118 4880 y(and)28 b(up)f(to)h
-(6.5E+08)e(with)i(four)f(digits.)243 4980 y(Remark)g(that)h(base)f(con)
-n(v)n(ersions)f(only)h(need)i(to)e(b)r(e)i(p)r(erformed)e(at)h
-(insertion)g(time,)g(when)h(the)f(index)g(of)g(a)g(new)118
-5079 y(no)r(de)g(is)f(computed.)37 b(They)28 b(will)f(therefore)g(only)
-g(ha)n(v)n(e)f(an)i(impact)f(on)h(insertion)f(timings.)1987
-5653 y(2)p eop
-%%Page: 3 3
-3 2 bop 118 291 a Fm(2.3)112 b(Coun)m(ters:)50 b(\020delimited\021)44
-b(vs.)51 b(\020\034xed)38 b(size\021)118 444 y Fh(The)33
-b(standard)g(represen)n(tation)e(of)i(gID)h(uses)e(a)h(v)-5
-b(ariable)32 b(size)h(c)n(hild)h(iden)n(ti\034er,)g(and)f(delimiters)g
-(to)h(separate)d(the)118 543 y(gID)f(of)g(the)h(c)n(hild)f(no)r(de)g
-(from)f(the)i(gID)f(of)g(its)g(paren)n(t.)43 b(F)-7 b(or)30
-b(example,)g(w)n(e)g(can)f(represen)n(t)g(the)i(\034fth)g(c)n(hild)f
-(of)g(no)r(de)118 643 y('/23/27/1')24 b(as)j('/23/27/1/4'.)32
-b(Let)c(us)f(call)g(this)h(a)f Fg(vgID)h Fh(represen)n(tation)e(\(V)-7
-b(ariable)27 b(Size)h(Genealogical)d(ID\).)243 743 y(This)30
-b(represen)n(tation)f(allo)n(ws)f(for)i(an)n(y)g(n)n(um)n(b)r(er)g(of)g
-(c)n(hildren)g(of)h(a)f(no)r(de,)h(sub)5 b(ject)30 b(only)g(to)g(the)h
-(limitations)f(the)118 842 y(RDBMS)e(ma)n(y)f(ha)n(v)n(e)f(as)h(to)h
-(the)g(length)f(of)h(a)f(v)-5 b(ariable)27 b(sized)g(string.)243
-942 y(Alternativ)n(ely)-7 b(,)24 b(w)n(e)f(could)h(c)n(ho)r(ose)f(to)h
-(limit)g(from)g(the)g(outset)g(the)g(quan)n(tit)n(y)g(of)f(c)n(hildren)
-h(that)g(a)g(no)r(de)g(ma)n(y)f(ha)n(v)n(e;)118 1042
-y(this)28 b(limit)g(w)n(ould)f(dep)r(end)i(of)e(course)f(on)i(the)g
-(application.)36 b(Let)27 b(us)h(call)f(this)h(a)f Fg(fgID)h
-Fh(represen)n(tation.)243 1141 y(F)-7 b(or)25 b(example,)h(if)g(no)g
-(no)r(de)f(is)h(allo)n(w)n(ed)f(to)g(ha)n(v)n(e)g(more)g(than)h(25600)d
-(c)n(hildren,)j(w)n(e)g(could)f(represen)n(t)g(the)h(coun)n(ters)118
-1241 y(alw)n(a)n(ys)36 b(with)i(2)f(digits.)67 b(The)38
-b(no)r(de)f(whic)n(h)h(w)n(as)f(previously)f('/23/27/1/4')d(is)k(no)n
-(w)g('23270104'.)64 b(If)38 b(w)n(e)f(require)118 1340
-y(a)g(three)g(digit)h(represen)n(tation)d(of)i(no)r(des)g(\(up)h(to)f
-(ab)r(out)h(4)f(million)g(c)n(hildren\),)j(then)d(it)h(will)g(b)r(e)f
-(represen)n(ted)f(as)118 1440 y('023027001004'.)118 1672
-y Fm(2.4)112 b(Ordering)37 b(of)h(no)s(des)118 1825 y
-Fh(F)-7 b(or)35 b(some)g(applications)g(it)h(is)f(necessary)f(to)i
-(obtain)f(subtrees)g(ordered)f(according)g(to)i(some)f(sp)r(ecial)g
-(rules.)60 b(F)-7 b(or)118 1925 y(instance:)220 2090
-y(1.)41 b(the)34 b(complete)g(subtree)f(starting)g(at)h(a)f(no)r(de)h
-(is)g(listed)g(immediately)g(after)f(the)i(no)r(de)f(in)g(question)f
-(\(\020depth)326 2189 y(\034rst\021\))220 2354 y(2.)41
-b(no)r(des)27 b(with)h(a)f(common)g(paren)n(t)g(are)g(listed)g(c)n
-(hronologically)243 2519 y(F)-7 b(or)39 b(instance,)k(the)d(displa)n(y)
-f(of)h(an)f(organization)f(c)n(hart)h(is)g(usually)h(required)e(to)i
-(satisfy)g(at)f(least)h(the)g(\034rst)118 2619 y(condition.)h(In)29
-b(a)g(threaded)f(discussion)h(group)e(one)i(wishes)g(to)f(satisfy)h(b)r
-(oth)h(conditions)e(to)h(displa)n(y)f(the)h(messages)118
-2718 y(in)20 b(a)g(thread)g(\025)f(the)i(threads)e(themselv)n(es)h
-(\(i.e.,)i(c)n(hildren)e(of)g(the)g(ro)r(ot)f(no)r(de\))i(are)e
-(usually)g(listed)i(in)f(in)n(v)n(erse)f(c)n(hronolical)118
-2818 y(order.)243 2917 y(T)-7 b(o)35 b(mak)n(e)f(a)h(particular)f
-(ordering)g(e\036cien)n(t,)j(it)f(w)n(ould)f(b)r(e)h(a)f(nice)g
-(feature)g(if)h(it)g(could)f(b)r(e)h(made)f(to)g(coincide)118
-3017 y(with)28 b(a)f(lexicographic)f(ordering)f(of)j(the)g(indices)f
-(\025i.e.,)g(as)g(pro)r(duced)g(b)n(y)h(an)f(\020ORDER)h(BY)f(id)h
-(ASC\021)35 b(in)27 b(SQL.)h(The)118 3117 y(lexicographic)d(ordering)h
-(of)h(fgID)h(satis\034es)e(b)r(oth)i(conditions.)36 b(The)27
-b(lexicographic)f(ordering)f(of)i(vgID)g(as)g(describ)r(ed)118
-3216 y(ab)r(o)n(v)n(e)34 b(satis\034es)g(the)h(\034rst)g(requisite)f
-(if)i(the)f(separator)d(has)j(the)g(minimal)g(binary)g(represen)n
-(tation)e(of)i(all)f(allo)n(w)n(ed)118 3316 y(sym)n(b)r(ols)c(in)h(an)f
-(index)h(\025)f(this)h(is)g(wh)n(y)f(w)n(e)g(reserv)n(ed)f(/)h(for)g
-(the)i(separator.)43 b(But)31 b(the)g(second)f(prop)r(ert)n(y)g(is)g
-(missing:)118 3416 y(for)d(instance,)g(the)h(index)g('/1/10')d(is)j
-(lexicographically)d(b)r(efore)i('/1/2'.)243 3515 y(If)c(the)h(second)e
-(prop)r(ert)n(y)g(is)i(also)e(required)g(for)h(vgID,)g(w)n(e)f(can)h
-(sp)r(ecify)h(the)f(c)n(hild)h(iden)n(ti\034ers)e(with)i(coun)n(ters)e
-(built)118 3615 y(in)28 b(the)g(follo)n(wing)e(w)n(a)n(y:)36
-b(represen)n(t)26 b(a)h(n)n(um)n(b)r(er)h(b)n(y)f(a)g(string)g(of)g
-(digits,)h(where)243 3779 y Ff(\017)41 b Fh(the)25 b(\034rst)g(digit)h
-Fc(D)896 3791 y Fb(0)958 3779 y Fh(represen)n(ts)e(the)i(length)f(in)h
-(digits)f(of)g(the)h(decimal)f(expansion)f(of)i(the)f(n)n(um)n(b)r(er,)
-h(min)n(us)f(one)243 3945 y Ff(\017)41 b Fh(the)28 b(follo)n(wing)e
-Fa(\()p Fc(D)920 3957 y Fb(0)976 3945 y Fa(+)18 b(1\))27
-b Fh(digits)h(are)e(the)i(decimal)g(expansion)e(of)i(the)g(n)n(um)n(b)r
-(er)118 4109 y(Let)g(us)f(call)h(these)f(iden)n(ti\034ers)g
-Fg(m-vgID)p Fh(,)g(\020m\021)34 b(for)27 b(mo)r(di\034ed.)243
-4209 y(As)e(an)f(example,)h(the)g(no)r(de)g(whic)n(h)g(w)n(as)f
-(previously)f(represen)n(ted)h(b)n(y)g(/15/3/182)d(will,)k(after)g
-(this)g(mo)r(di\034cation,)118 4309 y(ha)n(v)n(e)h(the)i(index)g
-(/115/03/2182.)243 4408 y(The)37 b(lexicographic)f(ordering)g(of)i
-(m-vgID)f(is)h(the)g(desired)f(ordering)f(of)h(the)h(tree)g(no)r(des.)
-67 b(The)38 b(cost)f(of)g(this)118 4508 y(prop)r(ert)n(y)31
-b(is)i(that)f(\(a\))h(the)g(ID)f(are)g(no)n(w)g(longer,)g(\(b\))h(no)f
-(no)r(de)g(can)g(ha)n(v)n(e)g(more)f(than)i Fa(160)3106
-4478 y Fb(160)3240 4508 y Fh(c)n(hildren)f(\(actually)-7
-b(,)118 4607 y(this)32 b(is)g(a)f(non-issue\),)h(and)f(\(c\))h(the)g
-(index)g(structure)f(is)h(redundan)n(t,)g(some)f(formally)f(correct)h
-(indices)g(are)g(in)n(v)-5 b(alid)118 4707 y(\025e.g.,)24
-b(/316/013/11.)30 b(The)24 b(third)g(issue)g(can)g(b)r(e)g(addressed)f
-(b)n(y)g(k)n(eeping)g(a)h(strict)g(con)n(trol)e(on)i(the)g(generation)f
-(of)h(new)118 4807 y(indices)k(to)f(insure)g(that)h(all)f(indices)h
-(are)e(formally)h(correct.)243 4906 y(The)32 b(issue)f(of)h(the)g(rev)n
-(erse)e(c)n(hronological)f(indexing)j(of)f(threads)h(in)g(threaded)f
-(discussion)g(groups)g(can)g(b)r(e)h(ad-)118 5006 y(dressed)d(easily)f
-(enough)h(in)h(fgID:)f(coun)n(t)g(\020do)n(wn\021)36
-b(instead)29 b(of)g(\020up\021)36 b(the)30 b(c)n(hildren)f(of)g(the)h
-(ro)r(ot)e(no)r(de)i(\025)f(this)h(implies)118 5106 y(only)e(an)g
-(inconsequen)n(tial)f(mo)r(di\034cation)h(of)g(the)g(no)r(de)h
-(insertion)e(routine,)h(as)g(sho)n(wn)f(b)r(elo)n(w.)38
-b(The)29 b(problem)e(is)h(less)118 5205 y(trivial)i(with)g(vgID;)h(in)f
-(this)h(case,)f(ma)n(yb)r(e)f(a)h(thread)g(iden)n(ti\034er)g(should)g
-(b)r(e)h(k)n(ept)f(in)g(a)g(di\033eren)n(t)g(\034eld)h(-)f(i.e.,)h
-(repre-)118 5305 y(sen)n(ting)h(the)h(structure)f(as)g(a)h(forest)f
-(rather)f(than)i(a)f(tree,)i(where)e(the)h(thread_id)f(\034eld)h
-(selects)f(the)h(\020tree\021)38 b(in)33 b(the)118 5404
-y(forest.)1987 5653 y(3)p eop
-%%Page: 4 4
-4 3 bop 118 291 a Fi(3)131 b(T)-11 b(ree)45 b(op)t(erations)e(using)h
-(genealogical)g(indices)118 472 y Fh(In)32 b(this)f(section)g(w)n(e)g
-(sho)n(w)g(ho)n(w)g(to)g(implemen)n(t)h(v)-5 b(arious)30
-b(tree)h(op)r(erations)f(using)h(gID)g(as)g(the)h(primary)e(k)n(ey)h
-(in)g(the)118 572 y(no)r(de)d(table.)243 672 y(Some)h(implemen)n
-(tation)h(issues)g(are)f(relev)-5 b(an)n(t)29 b(here,)h(esp)r(ecially)f
-(concerning)g(the)h(utilisation)g(of)g(indices)g(b)n(y)f(the)118
-771 y(DB)f(engine.)243 871 y(W)-7 b(e)28 b(discuss)f(a)g(tree)g
-(represen)n(ted)f(in)i(a)f(table)h(of)f(the)h(form)326
-1034 y Fd(CREATE)41 b(TABLE)g(tree)h(\()456 1134 y(gid)304
-b(text)42 b(PRIMARY)f(KEY,)456 1234 y(nchildren)f(integer)h(DEFAULT)f
-(0,)456 1333 y(\\ldots)h(the)i(actual)e(node)h(data)326
-1433 y(\);)118 1597 y Fh(The)26 b(\034eld)g(\020nc)n(hildren\021)32
-b(is)26 b(a)f(coun)n(ter)g(for)g(the)i(n)n(um)n(b)r(er)e(of)h(c)n
-(hildren)f(that)h(the)h(no)r(de)f(has)f Fe(ever)35 b
-Fh(had;)27 b(w)n(e)e(assume)g(here)118 1696 y(it)j(is)g(not)f(up)r
-(dated)h(when)g(no)r(des)f(or)g(subtrees)g(are)f(deleted.)243
-1796 y(Section)h(4)g(pro)n(vides)f(a)i(complete)f(implemen)n(tation)h
-(of)f(these)h(op)r(erations)e(for)h(fgID)h(in)g(P)n(ostgreSQL.)118
-2028 y Fm(3.1)112 b(Computing)37 b(the)g(lev)m(el)f(of)h(a)h(no)s(de)
-118 2181 y Fg(Cost:)f Fe(string)30 b(op)l(er)l(ations)g(\(no)g(table)g
-(ac)l(c)l(ess\))243 2280 y Fh(This)d(is)h(a)f(pure)g(string)g(op)r
-(eration,)f(no)i(table)f(access)g(is)g(required.)243
-2460 y Ff(\017)41 b Fg(vgID:)27 b Fh(coun)n(t)h(the)g(n)n(um)n(b)r(er)f
-(of)g(separators)e(\('/'\))j(in)g(the)g(PK)243 2625 y
-Ff(\017)41 b Fg(fgID:)27 b Fh(coun)n(t)g(the)h(n)n(um)n(b)r(er)g(of)f
-(c)n(haracters)e(in)j(the)g(PK,)g(divide)g(b)n(y)f(the)h(\034xed)f
-(size)h(of)f(the)h(coun)n(ters.)118 2857 y Fm(3.2)112
-b(Selecting)36 b(or)h(deleting)f(a)i(subtree)118 3010
-y Fg(Cost:)f Fe(index)30 b(sc)l(an)g(of)g(the)g(tr)l(e)l(e)243
-3173 y Ff(\017)41 b Fg(vgID:)27 b Fh(The)h(subtree)f(ro)r(oted)g(at)g
-(/26/5/7)e(is)i(selected)g(b)n(y)508 3338 y Fd(...)43
-b(WHERE)e(id)i(LIKE)f('/26/5/7\045')d(AND)j(id)h(<)g('/26/5/70')243
-3503 y Ff(\017)e Fg(m-vgID:)26 b Fh(The)h(subtree)h(ro)r(oted)e(at)i
-(/126/05/07)22 b(is)28 b(selected)f(b)n(y)508 3668 y
-Fd(...)43 b(WHERE)e(id)i(LIKE)f('/126/06/07\045')243
-3833 y Ff(\017)f Fg(fgID:)27 b Fh(The)h(subtree)f(ro)r(oted)g(at)g
-(260507)e(is)i(selected)h(b)n(y)508 3997 y Fd(...)43
-b(WHERE)e(id)i(LIKE)f('260507\045')118 4229 y Fm(3.3)112
-b(Selecting)36 b(the)h(direct)f(c)m(hildren)g(of)i(a)g(no)s(de)118
-4382 y Fg(Cost:)f Fe(index)30 b(sc)l(an)g(of)g(the)g(tr)l(e)l(e)243
-4562 y Ff(\017)41 b Fg(vgID:)27 b Fh(The)h(direct)f(c)n(hildren)g(of)h
-(/26/5/7)c(are)j(selected)g(b)n(y)508 4727 y Fd(...)43
-b(WHERE)e(id)i(LIKE)f('/26/5/7/\045')d(AND)j(id)h(NOT)f(LIKE)g
-('26/5/7/\045/\045')243 4892 y Ff(\017)f Fg(m-vgID:)26
-b Fh(The)h(direct)h(c)n(hildren)f(of)g(/26/5/7)e(are)h(selected)i(b)n
-(y)508 5056 y Fd(...)43 b(WHERE)e(id)i(LIKE)f('/126/06/07/\045')37
-b(AND)43 b(id)f(NOT)h(LIKE)f('/126/05/07/\045/\045)o(')243
-5221 y Ff(\017)f Fg(fgID:)27 b Fh(The)h(direct)f(c)n(hildren)g(of)h
-(260507)c(are)j(selected)g(b)n(y)508 5386 y Fd(...)43
-b(WHERE)e(id)i(LIKE)f('260507\045')d(AND)k(char_length\(id\))37
-b(=)43 b(\(char_length\('26)o(05)o(07')o(\)+)o(2\))1987
-5653 y Fh(4)p eop
-%%Page: 5 5
-5 4 bop 118 291 a Fm(3.4)112 b(Inserting)37 b(a)h(no)s(de)g(or)f(a)h
-(subtree)118 444 y Fg(Cost:)f Fe(index)30 b(sc)l(an)g(of)g(the)g(tr)l
-(e)l(e)f(+)h(string)f(and)h(math)g(op)l(er)l(ations)243
-543 y Fh(Insertion)f(is)g(a)h(pro)r(cedural)e(op)r(eration.)42
-b(As)30 b(eac)n(h)f(RDBMS)h(has)f(a)h(di\033eren)n(t)f(w)n(a)n(y)g(of)g
-(de\034ning)h(pro)r(cedures,)f(w)n(e)118 643 y(will)f(just)g(describ)r
-(e)f(here)g(the)h(necessary)e(steps.)37 b(Examples)27
-b(for)g(P)n(ostgreSQL)f(are)h(pro)n(vided)f(in)i(4.)243
-743 y(In)22 b(order)f(to)h(insert)g(a)g(new)g(c)n(hild)h(of)f
-(\020daddy\021)28 b(\(either)23 b(one)f(of)g(/26/5/7,)e(/126/05/07)d
-(or)22 b(260507)d(in)k(the)f(examples)118 842 y(ab)r(o)n(v)n(e\))27
-b(y)n(ou)f(ha)n(v)n(e)h(to)220 1008 y(1.)41 b(add)27
-b(one)g(to)h(the)g(n)n(um)n(b)r(er)f(of)g(c)n(hildren)h(of)f
-(\020daddy\021)508 1174 y Fd(UPDATE)41 b(tree)h(SET)h(nchildren)c(=)k
-(\(nchildren)d(+)j(1\))g(WHERE)e(ID)i(=)g(``daddy'';)220
-1340 y Fh(2.)e(enco)r(de)27 b(the)h(n)n(um)n(b)r(er)f(of)g(c)n(hildren)
-g(of)h(\020daddy\021)33 b(in)28 b(base)f(160,)f(bring)h(it)h(to)f(the)h
-(correct)e(format)h(dep)r(ending)h(on)326 1440 y(the)c(v)-5
-b(arian)n(t)23 b(of)h(gID)g(\(pad)g(with)h(0)e(or)g(not,)i(prep)r(end)f
-(a)g(digit)g(coun)n(ter)f(or)g(not,)i(prep)r(end)f(/)g(or)f(not,)i
-(coun)n(t)e(do)n(wn)326 1540 y(or)j(up,)i(.)14 b(.)g(.)g(\))37
-b(and)28 b(app)r(end)f(it)h(to)g(daddy's)f(gID)g(to)h(obtain)f(the)h
-(new)g(no)r(de's)f(gID.)220 1706 y(3.)41 b(insert)27
-b(the)h(new)f(no)r(de)243 1872 y(When)35 b(inserting)g(a)f(subtree,)j
-(the)e(index)g(of)g(the)h(ro)r(ot)e(of)h(the)g(subtree)g(has)f(to)h(b)r
-(e)h(computed)f(as)f(ab)r(o)n(v)n(e,)i(and)118 1971 y(prep)r(ended)28
-b(to)f(the)h(index)g(of)f(eac)n(h)g(no)r(de)h(of)f(the)h(subtree)f(b)r
-(efore)h(insertion.)243 2071 y(Remark)e(that)i(only)f(the)h(paren)n(t)f
-(no)r(de)h(has)f(to)g(b)r(e)h(up)r(dated)g(on)f(insertion.)118
-2303 y Fm(3.5)112 b(Selecting)36 b(the)h(ancestors)h(of)g(a)g(no)s(de)
-118 2457 y Fg(Cost:)f Fe(index)30 b(sc)l(an)g(of)g(the)g(tr)l(e)l(e)243
-2556 y Fh(Y)-7 b(ou)27 b(can)g(sp)r(ecify)h(all)g(ancestors)d(of)j(a)f
-(no)r(de)h(in)f(a)h(single)f(SQL)g(statemen)n(t;)g(for)g(instance)h
-(for)f(vgID)326 2722 y Fd(...)42 b(WHERE)f('/25/6/7')f(LIKE)i(\(id)g
-(||)h('/\045'\))f(AND)g(id)h(<)g('/25/6/7')118 2888 y
-Fh(The)31 b(second)e(part)h(of)h(the)g(clause,)f(while)h(logically)e
-(redundan)n(t,)h(is)h(a)f(\020hin)n(t\021)37 b(to)30
-b(the)h(optimizer.)45 b(A)n(t)31 b(least)f(in)g(P)n(ost-)118
-2988 y(greSQL,)c(without)i(it)g(the)g(optimizer)f(will)h(c)n(ho)r(ose)e
-(a)i(sequen)n(tial)e(scan)h(of)h(the)g(table)f(and)h(disregard)d(the)j
-(index.)118 3220 y Fm(3.6)112 b(Selecting)36 b(all)g(lea)m(v)m(es)118
-3374 y Fg(Cost:)h Fe(sc)l(an)30 b(of)g(the)g(tr)l(e)l(e)243
-3473 y Fh(A)e(leaf)f(is)g(a)h(no)r(de)f(without)h(descendan)n(ts:)36
-b(it)28 b(has)f(0)g(c)n(hildren.)37 b(Hence)326 3639
-y Fd(...)42 b(WHERE)f(nchildren)f(=)j(0)118 3805 y Fh(If)28
-b(this)g(t)n(yp)r(e)g(of)f(query)g(is)h(often)f(necessary)-7
-b(,)26 b(y)n(ou)h(ma)n(y)g(b)r(e)h(w)n(ell)f(advised)g(to)g(k)n(eep)g
-(an)h(index)f(on)h(tree\(nc)n(hildren\).)118 4038 y Fm(3.7)112
-b(Determining)35 b(if)i(A)g(is)g(a)h(descendan)m(t)g(of)g(B)118
-4191 y Fg(Cost:)f Fe(string)30 b(op)l(er)l(ations,)h(no)f(table)g(ac)l
-(c)l(ess)243 4291 y Fh(This)d(is)h(a)f(pure)g(string)g(op)r(eration)f
-(on)i(the)g(indices,)f(no)g(table)h(access)e(is)i(necessary)-7
-b(.)118 4565 y Fi(4)131 b(Putting)45 b(it)f(all)h(together:)57
-b(a)44 b(P)l(ostgreSQL)f(implemen)l(tation)118 4747 y
-Fh(h)n(ttp://www.p)r(ostgresql.org/mhonarc/pgsq)o(l-sql/)o(20)o(00)o
-(-0)o(4/)o(msg0)o(02)o(67)o(.h)n(tml)243 4847 y(W)-7
-b(e)30 b(describ)r(e)g(here)g(a)g(small)f(pac)n(k)-5
-b(age)29 b(that)i(can)e(b)r(e)i(used)f(for)g(implemen)n(ting)g(gID)g
-(on)g(P)n(ostgreSQL.)f(It)i(can)e(b)r(e)118 4946 y(found)f(at)f(<h)n
-(ttp://...>)243 5046 y(The)21 b(pac)n(k)-5 b(age)21 b(uses)g(the)h(pro)
-r(cedural)e(language)h(PL/PGsql.)35 b(A)22 b(b)r(etter)g(implemen)n
-(tation)g(w)n(ould)f(probably)g(de\034ne)118 5145 y(the)28
-b(gID)g(as)f(new)g(P)n(ostgres)f(t)n(yp)r(es,)i(and)f(co)r(de)g(all)h
-(this)g(in)f(C.)243 5245 y(The)g(\034les)h(should)f(b)r(e)h(loaded)f
-(in)h(alphab)r(etical)f(order.)1987 5653 y(5)p eop
-%%Page: 6 6
-6 5 bop 118 291 a Fm(4.1)112 b(tree0_enco)s(ding.sql)118
-444 y Fh(This)28 b(\034le)f(de\034nes)h(and)f(p)r(opulates)h(the)f
-(table)h(_b160_digits)d(of)j(\020digits\021)33 b(in)28
-b(base)f(160,)326 604 y Fd(CREATE)41 b(TABLE)g(\\_b160\\_digits)d
-(\(deci)j(integer,)f(code)i(char\);)118 764 y Fh(and)28
-b(the)f(t)n(w)n(o)g(functions)326 924 y Fd(CREATE)41
-b(FUNCTION)f(\\_b160\\_encode\(i)o(nt)o(eg)o(er\))d(RETURNS)j(string)
-413 1024 y(AS)j('....')e(LANGUAGE)f('plpgsql';)326 1124
-y(CREATE)h(FUNCTION)f(\\_b160\\_encode\(i)o(nt)o(eg)o(er,)o(in)o(te)o
-(ger)o(\))d(RETURNS)k(string)413 1223 y(AS)i('....')e(LANGUAGE)f
-('plpgsql';)118 1384 y Fh(The)22 b(\034rst)h(function)f(returns)g(a)g
-(v)-5 b(ariable)21 b(size)h(enco)r(ding;)i(the)f(second)e(a)h(\034xed)h
-(size)f(enco)r(ding)g(\(the)h(second)e(parameter)118
-1483 y(is)g(the)h(size\),)g(and)f(raises)e(an)i(exception)g(if)h(the)f
-(n)n(um)n(b)r(er)g(is)g(to)r(o)g(large)e(to)i(b)r(e)h(represen)n(ted)e
-(with)h(the)h(requested)e(n)n(um)n(b)r(er)118 1583 y(of)28
-b(digits.)118 1814 y Fm(4.2)112 b(tree1_de\034ne.sql)118
-1967 y Fh(This)28 b(\034le)f(pro)n(vides)f(a)i(function)326
-2127 y Fd(CREATE)41 b(FUNCTION)f(_tree_create\(tex)o(t,)o(in)o(teg)o
-(er)o(,t)o(ext)o(,t)o(ex)o(t\))d(RETURNS)k(bpchar)413
-2227 y(AS)i('....')e(LANGUAGE)f('plpgsql';)118 2387 y
-Fh(that)e(creates)f(a)h(tree)f(infrastructure)g(of)h(either)g(fgID)g
-(or)f(vgID.)h(Assuming)f(y)n(ou)g(ha)n(v)n(e)g(a)h(table)f(\020m)n
-(ytable\021)44 b(with)118 2487 y(primary)26 b(k)n(ey)h(\020m)n
-(yid\021,)g(then)h(calling)326 2647 y Fd(SELECT)41 b(_tree_create\('m)o
-(yt)o(ree)o(',)o(2,')o(my)o(ta)o(ble)o(',)o('m)o(yid)o('\))o(;)118
-2807 y Fh(will)28 b(cause:)220 2967 y(1.)41 b(the)28
-b(creation)e(of)i(a)f(table)508 3131 y Fd(CREATE)41 b(TABLE)h
-(mytree_bkg\()683 3230 y(gid)g(text)g(PRIMARY)e(KEY,)683
-3330 y(nchildren)f(int,)683 3429 y(sid)j(integer)f(REFERENCES)e
-(mytable\(myid\))508 3529 y(\);)508 3629 y(CREATE)i(UNIQUE)g(INDEX)h
-(mytree_bkg_sid)37 b(ON)43 b(mytree_bkg\(sid\);)326 3792
-y Fh(for)27 b(the)h(tree)f(structure.)220 3955 y(2.)41
-b(the)28 b(creation)e(of)i(a)f(view)508 4118 y Fd(CREATE)41
-b(VIEW)h(mytree)f(AS)639 4218 y(SELECT)g(t.gid,n.*)900
-4317 y(FROM)h(mytable)f(n,)i(mytree_bkg)c(t)900 4417
-y(WHERE)j(t.sid=n.myid;)326 4580 y Fh(with:)35 b(a)23
-b(trigger)e(on)i(UPD)n(A)-7 b(TE)25 b(that)e(blo)r(c)n(ks)g(up)r
-(dating)g(the)h(gid)f(and)g(allo)n(ws)f(up)r(dating)h(the)g(no)r(de)h
-(data,)f(a)g(rule)326 4680 y(on)k(DELETE)i(that)f(deletes)f(the)h
-(corresp)r(onding)e(en)n(try)h(b)r(oth)h(in)g(m)n(ytree_bkg)d(and)j(m)n
-(ytable,)f(and)g(a)g(trigger)326 4779 y(ON)h(INSER)-7
-b(T)30 b(that)f(raises)e(an)h(exception)g(and)g(informs)h(the)f(user)g
-(to)h(use)f(the)h(insertion)f(function)h(describ)r(ed)326
-4879 y(b)r(elo)n(w.)220 5042 y(3.)41 b(t)n(w)n(o)26 b(insertion)h
-(functions)h(that)g(compute)g(automatically)e(the)i(gID)g(of)f(the)h
-(new)g(no)r(de:)425 5205 y Ff(\017)41 b Fh(a)27 b(function)i(m)n
-(ytree_insert\(text,text,in)n(teger,text\))d(for)h(insertion)g(sim)n
-(ultaneosly)f(in)i(b)r(oth)g(tables:)508 5305 y(m)n
-(ytree_insert\('2201','hello',0,'not)15 b(m)n(uc)n(h'\))j(inserts)g(a)g
-(new)g(c)n(hild)h(of)f(2201)f(with)h(data1='hello',)h(data2=0)508
-5404 y(and)28 b(data3='not)e(m)n(uc)n(h')1987 5653 y(6)p
-eop
-%%Page: 7 7
-7 6 bop 425 291 a Ff(\017)41 b Fh(a)27 b(function)i(m)n
-(ytree_insert_no)r(de\(text,in)n(teger\))c(for)i(insertion)g(in)h(m)n
-(ytree_bkg)508 390 y(m)n(ytree_insert\('2201',25\))c(inserts)j(in)h(m)n
-(ytree_bkg)e(a)h(new)h(c)n(hild)f(of)h(2201)d(with)j(sid=25)220
-556 y(4.)41 b(a)27 b(function)h(m)n(ytree_mo)n(v)n(e\(text,text\))e
-(that)i(mo)n(v)n(es)e(subtrees:)326 656 y(m)n(ytree_mo)n(v)n
-(e\('2201','23'\))d(mo)n(v)n(es)j(the)i(subtree)f(ro)r(oted)g(at)g
-(2201)f(to)h(a)h(place)f(b)r(elo)n(w)g(23)f(\(ma)n(yb)r(e)i(2307\))220
-822 y(5.)41 b(a)c(function)g(m)n(ytree_len\(\))g(that)h(returns)e(the)i
-(length)f(of)g(the)h(enco)r(dings)f(used)g(in)h(the)f(gID)g(\(2)h
-(here;)j(0)c(if)326 922 y(v)-5 b(ariable)26 b(size\).)118
-1196 y Fi(5)131 b(Non-tree)44 b(hierarc)l(hies)118 1378
-y Fh(sequence)22 b(as)f(id,)j(table)e(with)h(\(id,g-index\))f(with)g(p)
-r(ossibly)g(man)n(y)g(g-indices)f(for)h(eac)n(h)f(id)h(\(if)h(TOO)f
-(man)n(y)-7 b(,)23 b(bad)f(mo)r(del:)118 1478 y(list)28
-b(all)f(genealogies,)f(i.e.,)h(paths)h(from)f(the)h(ro)r(ot\))118
-1752 y Fi(References)160 1934 y Fh([1])41 b(Philip)28
-b(Greenspun,)g Fe(T)-6 b(r)l(e)l(es)29 b(in)h(Or)l(acle)g(SQL)p
-Fh(,)d(in)h Fg(SQL)k(for)g(W)-8 b(eb)31 b(Nerds)289 2033
-y Fh(<h)n(ttp://photo.net/sql/trees.h)n(tml>)160 2200
-y([2])41 b(Jo)r(e)27 b(Celk)n(o,)f Fe(SQL)j(for)i(Smarties)p
-Fh(,)d(in)g Fg(DBMS)j(Online)p Fh(,)26 b(Marc)n(h)h(to)g(June)h(1996)
-289 2299 y(<h)n(ttp://www.dbmsmag.com/9603d06.h)n(tml>)289
-2399 y(<h)n(ttp://www.dbmsmag.com/9604d06.h)n(tml>)289
-2498 y(<h)n(ttp://www.dbmsmag.com/9605d06.h)n(tml>)289
-2598 y(<h)n(ttp://www.dbmsmag.com/9606d06.h)n(tml>)160
-2764 y([3])41 b(Graeme)26 b(Birc)n(hall,)h Fg(DB2)32
-b(UDB)g(V6.1)f(SQL)h(Co)s(okb)s(o)s(ok)p Fh(,)289 2864
-y(<h)n(ttp://ourw)n(orld.compuserv)n(e.com/homepag)o(es/)o(Gra)o
-(eme_Bir)o(c)n(ha)o(ll/HTM_CO)o(OK)o(.HTM>)1987 5653
-y(7)p eop
-%%Trailer
-end
-userdict /end-hook known{end-hook}if
-%%EOF
diff --git a/source4/lib/ldb/ldb_tdb/ldb_cache.c b/source4/lib/ldb/ldb_tdb/ldb_cache.c
deleted file mode 100644
index e54ceaaa98..0000000000
--- a/source4/lib/ldb/ldb_tdb/ldb_cache.c
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb tdb cache functions
- *
- * Description: cache special records in a ldb/tdb
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb_tdb.h"
-#include "ldb_private.h"
-
-#define LTDB_FLAG_CASE_INSENSITIVE (1<<0)
-#define LTDB_FLAG_INTEGER (1<<1)
-#define LTDB_FLAG_HIDDEN (1<<2)
-
-/* valid attribute flags */
-static const struct {
- const char *name;
- int value;
-} ltdb_valid_attr_flags[] = {
- { "CASE_INSENSITIVE", LTDB_FLAG_CASE_INSENSITIVE },
- { "INTEGER", LTDB_FLAG_INTEGER },
- { "HIDDEN", LTDB_FLAG_HIDDEN },
- { "NONE", 0 },
- { NULL, 0 }
-};
-
-
-/*
- de-register any special handlers for @ATTRIBUTES
-*/
-static void ltdb_attributes_unload(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- struct ldb_message *msg;
- unsigned int i;
-
- ldb = ldb_module_get_ctx(module);
-
- if (ltdb->cache->attributes == NULL) {
- /* no previously loaded attributes */
- return;
- }
-
- msg = ltdb->cache->attributes;
- for (i=0;i<msg->num_elements;i++) {
- ldb_schema_attribute_remove(ldb, msg->elements[i].name);
- }
-
- talloc_free(ltdb->cache->attributes);
- ltdb->cache->attributes = NULL;
-}
-
-/*
- add up the attrib flags for a @ATTRIBUTES element
-*/
-static int ltdb_attributes_flags(struct ldb_message_element *el, unsigned *v)
-{
- unsigned int i;
- unsigned value = 0;
- for (i=0;i<el->num_values;i++) {
- unsigned int j;
- for (j=0;ltdb_valid_attr_flags[j].name;j++) {
- if (strcmp(ltdb_valid_attr_flags[j].name,
- (char *)el->values[i].data) == 0) {
- value |= ltdb_valid_attr_flags[j].value;
- break;
- }
- }
- if (ltdb_valid_attr_flags[j].name == NULL) {
- return -1;
- }
- }
- *v = value;
- return 0;
-}
-
-/*
- register any special handlers from @ATTRIBUTES
-*/
-static int ltdb_attributes_load(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- struct ldb_message *msg = ltdb->cache->attributes;
- struct ldb_dn *dn;
- unsigned int i;
- int r;
-
- ldb = ldb_module_get_ctx(module);
-
- if (ldb->schema.attribute_handler_override) {
- /* we skip loading the @ATTRIBUTES record when a module is supplying
- its own attribute handling */
- return 0;
- }
-
- dn = ldb_dn_new(module, ldb, LTDB_ATTRIBUTES);
- if (dn == NULL) goto failed;
-
- r = ltdb_search_dn1(module, dn, msg);
- talloc_free(dn);
- if (r != LDB_SUCCESS && r != LDB_ERR_NO_SUCH_OBJECT) {
- goto failed;
- }
- if (r == LDB_ERR_NO_SUCH_OBJECT) {
- return 0;
- }
- /* mapping these flags onto ldap 'syntaxes' isn't strictly correct,
- but its close enough for now */
- for (i=0;i<msg->num_elements;i++) {
- unsigned flags;
- const char *syntax;
- const struct ldb_schema_syntax *s;
-
- if (ltdb_attributes_flags(&msg->elements[i], &flags) != 0) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid @ATTRIBUTES element for '%s'", msg->elements[i].name);
- goto failed;
- }
- switch (flags & ~LTDB_FLAG_HIDDEN) {
- case 0:
- syntax = LDB_SYNTAX_OCTET_STRING;
- break;
- case LTDB_FLAG_CASE_INSENSITIVE:
- syntax = LDB_SYNTAX_DIRECTORY_STRING;
- break;
- case LTDB_FLAG_INTEGER:
- syntax = LDB_SYNTAX_INTEGER;
- break;
- default:
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Invalid flag combination 0x%x for '%s' in @ATTRIBUTES",
- flags, msg->elements[i].name);
- goto failed;
- }
-
- s = ldb_standard_syntax_by_name(ldb, syntax);
- if (s == NULL) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Invalid attribute syntax '%s' for '%s' in @ATTRIBUTES",
- syntax, msg->elements[i].name);
- goto failed;
- }
-
- flags |= LDB_ATTR_FLAG_ALLOCATED;
- if (ldb_schema_attribute_add_with_syntax(ldb, msg->elements[i].name, flags, s) != 0) {
- goto failed;
- }
- }
-
- return 0;
-failed:
- return -1;
-}
-
-
-/*
- initialise the baseinfo record
-*/
-static int ltdb_baseinfo_init(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- struct ldb_message *msg;
- struct ldb_message_element el;
- struct ldb_val val;
- int ret;
- /* the initial sequence number must be different from the one
- set in ltdb_cache_free(). Thanks to Jon for pointing this
- out. */
- const char *initial_sequence_number = "1";
-
- ldb = ldb_module_get_ctx(module);
-
- ltdb->sequence_number = atof(initial_sequence_number);
-
- msg = ldb_msg_new(ltdb);
- if (msg == NULL) {
- goto failed;
- }
-
- msg->num_elements = 1;
- msg->elements = &el;
- msg->dn = ldb_dn_new(msg, ldb, LTDB_BASEINFO);
- if (!msg->dn) {
- goto failed;
- }
- el.name = talloc_strdup(msg, LTDB_SEQUENCE_NUMBER);
- if (!el.name) {
- goto failed;
- }
- el.values = &val;
- el.num_values = 1;
- el.flags = 0;
- val.data = (uint8_t *)talloc_strdup(msg, initial_sequence_number);
- if (!val.data) {
- goto failed;
- }
- val.length = 1;
-
- ret = ltdb_store(module, msg, TDB_INSERT);
-
- talloc_free(msg);
-
- return ret;
-
-failed:
- talloc_free(msg);
- errno = ENOMEM;
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-/*
- free any cache records
- */
-static void ltdb_cache_free(struct ldb_module *module)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
-
- ltdb->sequence_number = 0;
- talloc_free(ltdb->cache);
- ltdb->cache = NULL;
-}
-
-/*
- force a cache reload
-*/
-int ltdb_cache_reload(struct ldb_module *module)
-{
- ltdb_attributes_unload(module);
- ltdb_cache_free(module);
- return ltdb_cache_load(module);
-}
-
-/*
- load the cache records
-*/
-int ltdb_cache_load(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- struct ldb_dn *baseinfo_dn = NULL, *options_dn = NULL;
- struct ldb_dn *indexlist_dn = NULL;
- uint64_t seq;
- struct ldb_message *baseinfo = NULL, *options = NULL;
- int r;
-
- ldb = ldb_module_get_ctx(module);
-
- /* a very fast check to avoid extra database reads */
- if (ltdb->cache != NULL &&
- tdb_get_seqnum(ltdb->tdb) == ltdb->tdb_seqnum) {
- return 0;
- }
-
- if (ltdb->cache == NULL) {
- ltdb->cache = talloc_zero(ltdb, struct ltdb_cache);
- if (ltdb->cache == NULL) goto failed;
- ltdb->cache->indexlist = ldb_msg_new(ltdb->cache);
- ltdb->cache->attributes = ldb_msg_new(ltdb->cache);
- if (ltdb->cache->indexlist == NULL ||
- ltdb->cache->attributes == NULL) {
- goto failed;
- }
- }
-
- baseinfo = ldb_msg_new(ltdb->cache);
- if (baseinfo == NULL) goto failed;
-
- baseinfo_dn = ldb_dn_new(baseinfo, ldb, LTDB_BASEINFO);
- if (baseinfo_dn == NULL) goto failed;
-
- r= ltdb_search_dn1(module, baseinfo_dn, baseinfo);
- if (r != LDB_SUCCESS && r != LDB_ERR_NO_SUCH_OBJECT) {
- goto failed;
- }
-
- /* possibly initialise the baseinfo */
- if (r == LDB_ERR_NO_SUCH_OBJECT) {
- if (ltdb_baseinfo_init(module) != LDB_SUCCESS) {
- goto failed;
- }
- if (ltdb_search_dn1(module, baseinfo_dn, baseinfo) != LDB_SUCCESS) {
- goto failed;
- }
- }
-
- ltdb->tdb_seqnum = tdb_get_seqnum(ltdb->tdb);
-
- /* if the current internal sequence number is the same as the one
- in the database then assume the rest of the cache is OK */
- seq = ldb_msg_find_attr_as_uint64(baseinfo, LTDB_SEQUENCE_NUMBER, 0);
- if (seq == ltdb->sequence_number) {
- goto done;
- }
- ltdb->sequence_number = seq;
-
- /* Read an interpret database options */
- options = ldb_msg_new(ltdb->cache);
- if (options == NULL) goto failed;
-
- options_dn = ldb_dn_new(options, ldb, LTDB_OPTIONS);
- if (options_dn == NULL) goto failed;
-
- r= ltdb_search_dn1(module, options_dn, options);
- if (r != LDB_SUCCESS && r != LDB_ERR_NO_SUCH_OBJECT) {
- goto failed;
- }
-
- /* set flag for checking base DN on searches */
- if (r == LDB_SUCCESS) {
- ltdb->check_base = ldb_msg_find_attr_as_bool(options, LTDB_CHECK_BASE, false);
- } else {
- ltdb->check_base = false;
- }
-
- talloc_free(ltdb->cache->indexlist);
- ltdb_attributes_unload(module); /* calls internally "talloc_free" */
-
- ltdb->cache->indexlist = ldb_msg_new(ltdb->cache);
- ltdb->cache->attributes = ldb_msg_new(ltdb->cache);
- if (ltdb->cache->indexlist == NULL ||
- ltdb->cache->attributes == NULL) {
- goto failed;
- }
- ltdb->cache->one_level_indexes = false;
- ltdb->cache->attribute_indexes = false;
-
- indexlist_dn = ldb_dn_new(module, ldb, LTDB_INDEXLIST);
- if (indexlist_dn == NULL) goto failed;
-
- r = ltdb_search_dn1(module, indexlist_dn, ltdb->cache->indexlist);
- if (r != LDB_SUCCESS && r != LDB_ERR_NO_SUCH_OBJECT) {
- goto failed;
- }
-
- if (ldb_msg_find_element(ltdb->cache->indexlist, LTDB_IDXONE) != NULL) {
- ltdb->cache->one_level_indexes = true;
- }
- if (ldb_msg_find_element(ltdb->cache->indexlist, LTDB_IDXATTR) != NULL) {
- ltdb->cache->attribute_indexes = true;
- }
-
- if (ltdb_attributes_load(module) == -1) {
- goto failed;
- }
-
-done:
- talloc_free(options);
- talloc_free(baseinfo);
- talloc_free(indexlist_dn);
- return 0;
-
-failed:
- talloc_free(options);
- talloc_free(baseinfo);
- talloc_free(indexlist_dn);
- return -1;
-}
-
-
-/*
- increase the sequence number to indicate a database change
-*/
-int ltdb_increase_sequence_number(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- struct ldb_message *msg;
- struct ldb_message_element el[2];
- struct ldb_val val;
- struct ldb_val val_time;
- time_t t = time(NULL);
- char *s = NULL;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- msg = ldb_msg_new(ltdb);
- if (msg == NULL) {
- errno = ENOMEM;
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- s = talloc_asprintf(msg, "%llu", ltdb->sequence_number+1);
- if (!s) {
- talloc_free(msg);
- errno = ENOMEM;
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg->num_elements = ARRAY_SIZE(el);
- msg->elements = el;
- msg->dn = ldb_dn_new(msg, ldb, LTDB_BASEINFO);
- if (msg->dn == NULL) {
- talloc_free(msg);
- errno = ENOMEM;
- return LDB_ERR_OPERATIONS_ERROR;
- }
- el[0].name = talloc_strdup(msg, LTDB_SEQUENCE_NUMBER);
- if (el[0].name == NULL) {
- talloc_free(msg);
- errno = ENOMEM;
- return LDB_ERR_OPERATIONS_ERROR;
- }
- el[0].values = &val;
- el[0].num_values = 1;
- el[0].flags = LDB_FLAG_MOD_REPLACE;
- val.data = (uint8_t *)s;
- val.length = strlen(s);
-
- el[1].name = talloc_strdup(msg, LTDB_MOD_TIMESTAMP);
- if (el[1].name == NULL) {
- talloc_free(msg);
- errno = ENOMEM;
- return LDB_ERR_OPERATIONS_ERROR;
- }
- el[1].values = &val_time;
- el[1].num_values = 1;
- el[1].flags = LDB_FLAG_MOD_REPLACE;
-
- s = ldb_timestring(msg, t);
- if (s == NULL) {
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- val_time.data = (uint8_t *)s;
- val_time.length = strlen(s);
-
- ret = ltdb_modify_internal(module, msg, NULL);
-
- talloc_free(msg);
-
- if (ret == LDB_SUCCESS) {
- ltdb->sequence_number += 1;
- }
-
- /* updating the tdb_seqnum here avoids us reloading the cache
- records due to our own modification */
- ltdb->tdb_seqnum = tdb_get_seqnum(ltdb->tdb);
-
- return ret;
-}
-
-int ltdb_check_at_attributes_values(const struct ldb_val *value)
-{
- unsigned int i;
-
- for (i = 0; ltdb_valid_attr_flags[i].name != NULL; i++) {
- if ((strcmp(ltdb_valid_attr_flags[i].name, (char *)value->data) == 0)) {
- return 0;
- }
- }
-
- return -1;
-}
-
diff --git a/source4/lib/ldb/ldb_tdb/ldb_index.c b/source4/lib/ldb/ldb_tdb/ldb_index.c
deleted file mode 100644
index 24cc93feb9..0000000000
--- a/source4/lib/ldb/ldb_tdb/ldb_index.c
+++ /dev/null
@@ -1,1599 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004-2009
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb tdb backend - indexing
- *
- * Description: indexing routines for ldb tdb backend
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb_tdb.h"
-
-struct dn_list {
- unsigned int count;
- struct ldb_val *dn;
-};
-
-struct ltdb_idxptr {
- struct tdb_context *itdb;
- int error;
-};
-
-/* we put a @IDXVERSION attribute on index entries. This
- allows us to tell if it was written by an older version
-*/
-#define LTDB_INDEXING_VERSION 2
-
-/* enable the idxptr mode when transactions start */
-int ltdb_index_transaction_start(struct ldb_module *module)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- ltdb->idxptr = talloc_zero(ltdb, struct ltdb_idxptr);
- return LDB_SUCCESS;
-}
-
-/* compare two DN entries in a dn_list. Take account of possible
- * differences in string termination */
-static int dn_list_cmp(const struct ldb_val *v1, const struct ldb_val *v2)
-{
- if (v1->length > v2->length && v1->data[v2->length] != 0) {
- return -1;
- }
- if (v1->length < v2->length && v2->data[v1->length] != 0) {
- return 1;
- }
- return strncmp((char *)v1->data, (char *)v2->data, v1->length);
-}
-
-
-/*
- find a entry in a dn_list, using a ldb_val. Uses a case sensitive
- comparison with the dn returns -1 if not found
- */
-static int ltdb_dn_list_find_val(const struct dn_list *list, const struct ldb_val *v)
-{
- unsigned int i;
- for (i=0; i<list->count; i++) {
- if (dn_list_cmp(&list->dn[i], v) == 0) return i;
- }
- return -1;
-}
-
-/*
- find a entry in a dn_list. Uses a case sensitive comparison with the dn
- returns -1 if not found
- */
-static int ltdb_dn_list_find_str(struct dn_list *list, const char *dn)
-{
- struct ldb_val v;
- v.data = discard_const_p(unsigned char, dn);
- v.length = strlen(dn);
- return ltdb_dn_list_find_val(list, &v);
-}
-
-/*
- this is effectively a cast function, but with lots of paranoia
- checks and also copes with CPUs that are fussy about pointer
- alignment
- */
-static struct dn_list *ltdb_index_idxptr(struct ldb_module *module, TDB_DATA rec, bool check_parent)
-{
- struct dn_list *list;
- if (rec.dsize != sizeof(void *)) {
- ldb_asprintf_errstring(ldb_module_get_ctx(module),
- "Bad data size for idxptr %u", (unsigned)rec.dsize);
- return NULL;
- }
- /* note that we can't just use a cast here, as rec.dptr may
- not be aligned sufficiently for a pointer. A cast would cause
- platforms like some ARM CPUs to crash */
- memcpy(&list, rec.dptr, sizeof(void *));
- list = talloc_get_type(list, struct dn_list);
- if (list == NULL) {
- ldb_asprintf_errstring(ldb_module_get_ctx(module),
- "Bad type '%s' for idxptr",
- talloc_get_name(list));
- return NULL;
- }
- if (check_parent && list->dn && talloc_parent(list->dn) != list) {
- ldb_asprintf_errstring(ldb_module_get_ctx(module),
- "Bad parent '%s' for idxptr",
- talloc_get_name(talloc_parent(list->dn)));
- return NULL;
- }
- return list;
-}
-
-/*
- return the @IDX list in an index entry for a dn as a
- struct dn_list
- */
-static int ltdb_dn_list_load(struct ldb_module *module,
- struct ldb_dn *dn, struct dn_list *list)
-{
- struct ldb_message *msg;
- int ret;
- struct ldb_message_element *el;
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- TDB_DATA rec;
- struct dn_list *list2;
- TDB_DATA key;
-
- list->dn = NULL;
- list->count = 0;
-
- /* see if we have any in-memory index entries */
- if (ltdb->idxptr == NULL ||
- ltdb->idxptr->itdb == NULL) {
- goto normal_index;
- }
-
- key.dptr = discard_const_p(unsigned char, ldb_dn_get_linearized(dn));
- key.dsize = strlen((char *)key.dptr);
-
- rec = tdb_fetch_compat(ltdb->idxptr->itdb, key);
- if (rec.dptr == NULL) {
- goto normal_index;
- }
-
- /* we've found an in-memory index entry */
- list2 = ltdb_index_idxptr(module, rec, true);
- if (list2 == NULL) {
- free(rec.dptr);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- free(rec.dptr);
-
- *list = *list2;
- return LDB_SUCCESS;
-
-normal_index:
- msg = ldb_msg_new(list);
- if (msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_search_dn1(module, dn, msg);
- if (ret != LDB_SUCCESS) {
- talloc_free(msg);
- return ret;
- }
-
- /* TODO: check indexing version number */
-
- el = ldb_msg_find_element(msg, LTDB_IDX);
- if (!el) {
- talloc_free(msg);
- return LDB_SUCCESS;
- }
-
- /* we avoid copying the strings by stealing the list */
- list->dn = talloc_steal(list, el->values);
- list->count = el->num_values;
-
- return LDB_SUCCESS;
-}
-
-
-/*
- save a dn_list into a full @IDX style record
- */
-static int ltdb_dn_list_store_full(struct ldb_module *module, struct ldb_dn *dn,
- struct dn_list *list)
-{
- struct ldb_message *msg;
- int ret;
-
- if (list->count == 0) {
- ret = ltdb_delete_noindex(module, dn);
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- return LDB_SUCCESS;
- }
- return ret;
- }
-
- msg = ldb_msg_new(module);
- if (!msg) {
- return ldb_module_oom(module);
- }
-
- ret = ldb_msg_add_fmt(msg, LTDB_IDXVERSION, "%u", LTDB_INDEXING_VERSION);
- if (ret != LDB_SUCCESS) {
- talloc_free(msg);
- return ldb_module_oom(module);
- }
-
- msg->dn = dn;
- if (list->count > 0) {
- struct ldb_message_element *el;
-
- ret = ldb_msg_add_empty(msg, LTDB_IDX, LDB_FLAG_MOD_ADD, &el);
- if (ret != LDB_SUCCESS) {
- talloc_free(msg);
- return ldb_module_oom(module);
- }
- el->values = list->dn;
- el->num_values = list->count;
- }
-
- ret = ltdb_store(module, msg, TDB_REPLACE);
- talloc_free(msg);
- return ret;
-}
-
-/*
- save a dn_list into the database, in either @IDX or internal format
- */
-static int ltdb_dn_list_store(struct ldb_module *module, struct ldb_dn *dn,
- struct dn_list *list)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- TDB_DATA rec, key;
- int ret;
- struct dn_list *list2;
-
- if (ltdb->idxptr == NULL) {
- return ltdb_dn_list_store_full(module, dn, list);
- }
-
- if (ltdb->idxptr->itdb == NULL) {
- ltdb->idxptr->itdb = tdb_open_compat(NULL, 1000, TDB_INTERNAL, O_RDWR, 0, NULL, NULL);
- if (ltdb->idxptr->itdb == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- key.dptr = discard_const_p(unsigned char, ldb_dn_get_linearized(dn));
- key.dsize = strlen((char *)key.dptr);
-
- rec = tdb_fetch_compat(ltdb->idxptr->itdb, key);
- if (rec.dptr != NULL) {
- list2 = ltdb_index_idxptr(module, rec, false);
- if (list2 == NULL) {
- free(rec.dptr);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- free(rec.dptr);
- list2->dn = talloc_steal(list2, list->dn);
- list2->count = list->count;
- return LDB_SUCCESS;
- }
-
- list2 = talloc(ltdb->idxptr, struct dn_list);
- if (list2 == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- list2->dn = talloc_steal(list2, list->dn);
- list2->count = list->count;
-
- rec.dptr = (uint8_t *)&list2;
- rec.dsize = sizeof(void *);
-
- ret = tdb_store(ltdb->idxptr->itdb, key, rec, TDB_INSERT);
- if (ret != 0) {
- return ltdb_err_map(tdb_error(ltdb->idxptr->itdb));
- }
- return LDB_SUCCESS;
-}
-
-/*
- traverse function for storing the in-memory index entries on disk
- */
-static int ltdb_index_traverse_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *state)
-{
- struct ldb_module *module = state;
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- struct ldb_dn *dn;
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- struct ldb_val v;
- struct dn_list *list;
-
- list = ltdb_index_idxptr(module, data, true);
- if (list == NULL) {
- ltdb->idxptr->error = LDB_ERR_OPERATIONS_ERROR;
- return -1;
- }
-
- v.data = key.dptr;
- v.length = strnlen((char *)key.dptr, key.dsize);
-
- dn = ldb_dn_from_ldb_val(module, ldb, &v);
- if (dn == NULL) {
- ldb_asprintf_errstring(ldb, "Failed to parse index key %*.*s as an LDB DN", (int)v.length, (int)v.length, (const char *)v.data);
- ltdb->idxptr->error = LDB_ERR_OPERATIONS_ERROR;
- return -1;
- }
-
- ltdb->idxptr->error = ltdb_dn_list_store_full(module, dn, list);
- talloc_free(dn);
- if (ltdb->idxptr->error != 0) {
- return -1;
- }
- return 0;
-}
-
-/* cleanup the idxptr mode when transaction commits */
-int ltdb_index_transaction_commit(struct ldb_module *module)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- int ret;
-
- struct ldb_context *ldb = ldb_module_get_ctx(module);
-
- ldb_reset_err_string(ldb);
-
- if (ltdb->idxptr->itdb) {
- tdb_traverse(ltdb->idxptr->itdb, ltdb_index_traverse_store, module);
- tdb_close(ltdb->idxptr->itdb);
- }
-
- ret = ltdb->idxptr->error;
- if (ret != LDB_SUCCESS) {
- if (!ldb_errstring(ldb)) {
- ldb_set_errstring(ldb, ldb_strerror(ret));
- }
- ldb_asprintf_errstring(ldb, "Failed to store index records in transaction commit: %s", ldb_errstring(ldb));
- }
-
- talloc_free(ltdb->idxptr);
- ltdb->idxptr = NULL;
- return ret;
-}
-
-/* cleanup the idxptr mode when transaction cancels */
-int ltdb_index_transaction_cancel(struct ldb_module *module)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- if (ltdb->idxptr && ltdb->idxptr->itdb) {
- tdb_close(ltdb->idxptr->itdb);
- }
- talloc_free(ltdb->idxptr);
- ltdb->idxptr = NULL;
- return LDB_SUCCESS;
-}
-
-
-/*
- return the dn key to be used for an index
- the caller is responsible for freeing
-*/
-static struct ldb_dn *ltdb_index_key(struct ldb_context *ldb,
- const char *attr, const struct ldb_val *value,
- const struct ldb_schema_attribute **ap)
-{
- struct ldb_dn *ret;
- struct ldb_val v;
- const struct ldb_schema_attribute *a;
- char *attr_folded;
- int r;
-
- attr_folded = ldb_attr_casefold(ldb, attr);
- if (!attr_folded) {
- return NULL;
- }
-
- a = ldb_schema_attribute_by_name(ldb, attr);
- if (ap) {
- *ap = a;
- }
- r = a->syntax->canonicalise_fn(ldb, ldb, value, &v);
- if (r != LDB_SUCCESS) {
- const char *errstr = ldb_errstring(ldb);
- /* canonicalisation can be refused. For example,
- a attribute that takes wildcards will refuse to canonicalise
- if the value contains a wildcard */
- ldb_asprintf_errstring(ldb, "Failed to create index key for attribute '%s':%s%s%s",
- attr, ldb_strerror(r), (errstr?":":""), (errstr?errstr:""));
- talloc_free(attr_folded);
- return NULL;
- }
- if (ldb_should_b64_encode(ldb, &v)) {
- char *vstr = ldb_base64_encode(ldb, (char *)v.data, v.length);
- if (!vstr) {
- talloc_free(attr_folded);
- return NULL;
- }
- ret = ldb_dn_new_fmt(ldb, ldb, "%s:%s::%s", LTDB_INDEX, attr_folded, vstr);
- talloc_free(vstr);
- } else {
- ret = ldb_dn_new_fmt(ldb, ldb, "%s:%s:%.*s", LTDB_INDEX, attr_folded, (int)v.length, (char *)v.data);
- }
-
- if (v.data != value->data) {
- talloc_free(v.data);
- }
- talloc_free(attr_folded);
-
- return ret;
-}
-
-/*
- see if a attribute value is in the list of indexed attributes
-*/
-static bool ltdb_is_indexed(const struct ldb_message *index_list, const char *attr)
-{
- unsigned int i;
- struct ldb_message_element *el;
-
- el = ldb_msg_find_element(index_list, LTDB_IDXATTR);
- if (el == NULL) {
- return false;
- }
-
- /* TODO: this is too expensive! At least use a binary search */
- for (i=0; i<el->num_values; i++) {
- if (ldb_attr_cmp((char *)el->values[i].data, attr) == 0) {
- return true;
- }
- }
- return false;
-}
-
-/*
- in the following logic functions, the return value is treated as
- follows:
-
- LDB_SUCCESS: we found some matching index values
-
- LDB_ERR_NO_SUCH_OBJECT: we know for sure that no object matches
-
- LDB_ERR_OPERATIONS_ERROR: indexing could not answer the call,
- we'll need a full search
- */
-
-/*
- return a list of dn's that might match a simple indexed search (an
- equality search only)
- */
-static int ltdb_index_dn_simple(struct ldb_module *module,
- const struct ldb_parse_tree *tree,
- const struct ldb_message *index_list,
- struct dn_list *list)
-{
- struct ldb_context *ldb;
- struct ldb_dn *dn;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- list->count = 0;
- list->dn = NULL;
-
- /* if the attribute isn't in the list of indexed attributes then
- this node needs a full search */
- if (!ltdb_is_indexed(index_list, tree->u.equality.attr)) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* the attribute is indexed. Pull the list of DNs that match the
- search criterion */
- dn = ltdb_index_key(ldb, tree->u.equality.attr, &tree->u.equality.value, NULL);
- if (!dn) return LDB_ERR_OPERATIONS_ERROR;
-
- ret = ltdb_dn_list_load(module, dn, list);
- talloc_free(dn);
- return ret;
-}
-
-
-static bool list_union(struct ldb_context *, struct dn_list *, const struct dn_list *);
-
-/*
- return a list of dn's that might match a leaf indexed search
- */
-static int ltdb_index_dn_leaf(struct ldb_module *module,
- const struct ldb_parse_tree *tree,
- const struct ldb_message *index_list,
- struct dn_list *list)
-{
- if (ldb_attr_dn(tree->u.equality.attr) == 0) {
- list->dn = talloc_array(list, struct ldb_val, 1);
- if (list->dn == NULL) {
- ldb_module_oom(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- list->dn[0] = tree->u.equality.value;
- list->count = 1;
- return LDB_SUCCESS;
- }
- return ltdb_index_dn_simple(module, tree, index_list, list);
-}
-
-
-/*
- list intersection
- list = list & list2
-*/
-static bool list_intersect(struct ldb_context *ldb,
- struct dn_list *list, const struct dn_list *list2)
-{
- struct dn_list *list3;
- unsigned int i;
-
- if (list->count == 0) {
- /* 0 & X == 0 */
- return true;
- }
- if (list2->count == 0) {
- /* X & 0 == 0 */
- list->count = 0;
- list->dn = NULL;
- return true;
- }
-
- /* the indexing code is allowed to return a longer list than
- what really matches, as all results are filtered by the
- full expression at the end - this shortcut avoids a lot of
- work in some cases */
- if (list->count < 2 && list2->count > 10) {
- return true;
- }
- if (list2->count < 2 && list->count > 10) {
- list->count = list2->count;
- list->dn = list2->dn;
- /* note that list2 may not be the parent of list2->dn,
- as list2->dn may be owned by ltdb->idxptr. In that
- case we expect this reparent call to fail, which is
- OK */
- talloc_reparent(list2, list, list2->dn);
- return true;
- }
-
- list3 = talloc_zero(list, struct dn_list);
- if (list3 == NULL) {
- return false;
- }
-
- list3->dn = talloc_array(list3, struct ldb_val, list->count);
- if (!list3->dn) {
- talloc_free(list3);
- return false;
- }
- list3->count = 0;
-
- for (i=0;i<list->count;i++) {
- if (ltdb_dn_list_find_val(list2, &list->dn[i]) != -1) {
- list3->dn[list3->count] = list->dn[i];
- list3->count++;
- }
- }
-
- list->dn = talloc_steal(list, list3->dn);
- list->count = list3->count;
- talloc_free(list3);
-
- return true;
-}
-
-
-/*
- list union
- list = list | list2
-*/
-static bool list_union(struct ldb_context *ldb,
- struct dn_list *list, const struct dn_list *list2)
-{
- struct ldb_val *dn3;
-
- if (list2->count == 0) {
- /* X | 0 == X */
- return true;
- }
-
- if (list->count == 0) {
- /* 0 | X == X */
- list->count = list2->count;
- list->dn = list2->dn;
- /* note that list2 may not be the parent of list2->dn,
- as list2->dn may be owned by ltdb->idxptr. In that
- case we expect this reparent call to fail, which is
- OK */
- talloc_reparent(list2, list, list2->dn);
- return true;
- }
-
- dn3 = talloc_array(list, struct ldb_val, list->count + list2->count);
- if (!dn3) {
- ldb_oom(ldb);
- return false;
- }
-
- /* we allow for duplicates here, and get rid of them later */
- memcpy(dn3, list->dn, sizeof(list->dn[0])*list->count);
- memcpy(dn3+list->count, list2->dn, sizeof(list2->dn[0])*list2->count);
-
- list->dn = dn3;
- list->count += list2->count;
-
- return true;
-}
-
-static int ltdb_index_dn(struct ldb_module *module,
- const struct ldb_parse_tree *tree,
- const struct ldb_message *index_list,
- struct dn_list *list);
-
-
-/*
- process an OR list (a union)
- */
-static int ltdb_index_dn_or(struct ldb_module *module,
- const struct ldb_parse_tree *tree,
- const struct ldb_message *index_list,
- struct dn_list *list)
-{
- struct ldb_context *ldb;
- unsigned int i;
-
- ldb = ldb_module_get_ctx(module);
-
- list->dn = NULL;
- list->count = 0;
-
- for (i=0; i<tree->u.list.num_elements; i++) {
- struct dn_list *list2;
- int ret;
-
- list2 = talloc_zero(list, struct dn_list);
- if (list2 == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_index_dn(module, tree->u.list.elements[i], index_list, list2);
-
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- /* X || 0 == X */
- talloc_free(list2);
- continue;
- }
-
- if (ret != LDB_SUCCESS) {
- /* X || * == * */
- talloc_free(list2);
- return ret;
- }
-
- if (!list_union(ldb, list, list2)) {
- talloc_free(list2);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- if (list->count == 0) {
- return LDB_ERR_NO_SUCH_OBJECT;
- }
-
- return LDB_SUCCESS;
-}
-
-
-/*
- NOT an index results
- */
-static int ltdb_index_dn_not(struct ldb_module *module,
- const struct ldb_parse_tree *tree,
- const struct ldb_message *index_list,
- struct dn_list *list)
-{
- /* the only way to do an indexed not would be if we could
- negate the not via another not or if we knew the total
- number of database elements so we could know that the
- existing expression covered the whole database.
-
- instead, we just give up, and rely on a full index scan
- (unless an outer & manages to reduce the list)
- */
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-
-static bool ltdb_index_unique(struct ldb_context *ldb,
- const char *attr)
-{
- const struct ldb_schema_attribute *a;
- a = ldb_schema_attribute_by_name(ldb, attr);
- if (a->flags & LDB_ATTR_FLAG_UNIQUE_INDEX) {
- return true;
- }
- return false;
-}
-
-/*
- process an AND expression (intersection)
- */
-static int ltdb_index_dn_and(struct ldb_module *module,
- const struct ldb_parse_tree *tree,
- const struct ldb_message *index_list,
- struct dn_list *list)
-{
- struct ldb_context *ldb;
- unsigned int i;
- bool found;
-
- ldb = ldb_module_get_ctx(module);
-
- list->dn = NULL;
- list->count = 0;
-
- /* in the first pass we only look for unique simple
- equality tests, in the hope of avoiding having to look
- at any others */
- for (i=0; i<tree->u.list.num_elements; i++) {
- const struct ldb_parse_tree *subtree = tree->u.list.elements[i];
- int ret;
-
- if (subtree->operation != LDB_OP_EQUALITY ||
- !ltdb_index_unique(ldb, subtree->u.equality.attr)) {
- continue;
- }
-
- ret = ltdb_index_dn(module, subtree, index_list, list);
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- /* 0 && X == 0 */
- return LDB_ERR_NO_SUCH_OBJECT;
- }
- if (ret == LDB_SUCCESS) {
- /* a unique index match means we can
- * stop. Note that we don't care if we return
- * a few too many objects, due to later
- * filtering */
- return LDB_SUCCESS;
- }
- }
-
- /* now do a full intersection */
- found = false;
-
- for (i=0; i<tree->u.list.num_elements; i++) {
- const struct ldb_parse_tree *subtree = tree->u.list.elements[i];
- struct dn_list *list2;
- int ret;
-
- list2 = talloc_zero(list, struct dn_list);
- if (list2 == NULL) {
- return ldb_module_oom(module);
- }
-
- ret = ltdb_index_dn(module, subtree, index_list, list2);
-
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- /* X && 0 == 0 */
- list->dn = NULL;
- list->count = 0;
- talloc_free(list2);
- return LDB_ERR_NO_SUCH_OBJECT;
- }
-
- if (ret != LDB_SUCCESS) {
- /* this didn't adding anything */
- talloc_free(list2);
- continue;
- }
-
- if (!found) {
- talloc_reparent(list2, list, list->dn);
- list->dn = list2->dn;
- list->count = list2->count;
- found = true;
- } else if (!list_intersect(ldb, list, list2)) {
- talloc_free(list2);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (list->count == 0) {
- list->dn = NULL;
- return LDB_ERR_NO_SUCH_OBJECT;
- }
-
- if (list->count < 2) {
- /* it isn't worth loading the next part of the tree */
- return LDB_SUCCESS;
- }
- }
-
- if (!found) {
- /* none of the attributes were indexed */
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
-}
-
-/*
- return a list of matching objects using a one-level index
- */
-static int ltdb_index_dn_one(struct ldb_module *module,
- struct ldb_dn *parent_dn,
- struct dn_list *list)
-{
- struct ldb_context *ldb;
- struct ldb_dn *key;
- struct ldb_val val;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* work out the index key from the parent DN */
- val.data = (uint8_t *)((uintptr_t)ldb_dn_get_casefold(parent_dn));
- val.length = strlen((char *)val.data);
- key = ltdb_index_key(ldb, LTDB_IDXONE, &val, NULL);
- if (!key) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_dn_list_load(module, key, list);
- talloc_free(key);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- if (list->count == 0) {
- return LDB_ERR_NO_SUCH_OBJECT;
- }
-
- return LDB_SUCCESS;
-}
-
-/*
- return a list of dn's that might match a indexed search or
- an error. return LDB_ERR_NO_SUCH_OBJECT for no matches, or LDB_SUCCESS for matches
- */
-static int ltdb_index_dn(struct ldb_module *module,
- const struct ldb_parse_tree *tree,
- const struct ldb_message *index_list,
- struct dn_list *list)
-{
- int ret = LDB_ERR_OPERATIONS_ERROR;
-
- switch (tree->operation) {
- case LDB_OP_AND:
- ret = ltdb_index_dn_and(module, tree, index_list, list);
- break;
-
- case LDB_OP_OR:
- ret = ltdb_index_dn_or(module, tree, index_list, list);
- break;
-
- case LDB_OP_NOT:
- ret = ltdb_index_dn_not(module, tree, index_list, list);
- break;
-
- case LDB_OP_EQUALITY:
- ret = ltdb_index_dn_leaf(module, tree, index_list, list);
- break;
-
- case LDB_OP_SUBSTRING:
- case LDB_OP_GREATER:
- case LDB_OP_LESS:
- case LDB_OP_PRESENT:
- case LDB_OP_APPROX:
- case LDB_OP_EXTENDED:
- /* we can't index with fancy bitops yet */
- ret = LDB_ERR_OPERATIONS_ERROR;
- break;
- }
-
- return ret;
-}
-
-/*
- filter a candidate dn_list from an indexed search into a set of results
- extracting just the given attributes
-*/
-static int ltdb_index_filter(const struct dn_list *dn_list,
- struct ltdb_context *ac,
- uint32_t *match_count)
-{
- struct ldb_context *ldb;
- struct ldb_message *msg;
- unsigned int i;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- for (i = 0; i < dn_list->count; i++) {
- struct ldb_dn *dn;
- int ret;
- bool matched;
-
- msg = ldb_msg_new(ac);
- if (!msg) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- dn = ldb_dn_from_ldb_val(msg, ldb, &dn_list->dn[i]);
- if (dn == NULL) {
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_search_dn1(ac->module, dn, msg);
- talloc_free(dn);
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- /* the record has disappeared? yes, this can happen */
- talloc_free(msg);
- continue;
- }
-
- if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_OBJECT) {
- /* an internal error */
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_match_msg_error(ldb, msg,
- ac->tree, ac->base, ac->scope, &matched);
- if (ret != LDB_SUCCESS) {
- talloc_free(msg);
- return ret;
- }
- if (!matched) {
- talloc_free(msg);
- continue;
- }
-
- /* filter the attributes that the user wants */
- ret = ltdb_filter_attrs(msg, ac->attrs);
-
- if (ret == -1) {
- talloc_free(msg);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_module_send_entry(ac->req, msg, NULL);
- if (ret != LDB_SUCCESS) {
- /* Regardless of success or failure, the msg
- * is the callbacks responsiblity, and should
- * not be talloc_free()'ed */
- ac->request_terminated = true;
- return ret;
- }
-
- (*match_count)++;
- }
-
- return LDB_SUCCESS;
-}
-
-/*
- remove any duplicated entries in a indexed result
- */
-static void ltdb_dn_list_remove_duplicates(struct dn_list *list)
-{
- unsigned int i, new_count;
-
- if (list->count < 2) {
- return;
- }
-
- TYPESAFE_QSORT(list->dn, list->count, dn_list_cmp);
-
- new_count = 1;
- for (i=1; i<list->count; i++) {
- if (dn_list_cmp(&list->dn[i], &list->dn[new_count-1]) != 0) {
- if (new_count != i) {
- list->dn[new_count] = list->dn[i];
- }
- new_count++;
- }
- }
-
- list->count = new_count;
-}
-
-/*
- search the database with a LDAP-like expression using indexes
- returns -1 if an indexed search is not possible, in which
- case the caller should call ltdb_search_full()
-*/
-int ltdb_search_indexed(struct ltdb_context *ac, uint32_t *match_count)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(ac->module), struct ltdb_private);
- struct dn_list *dn_list;
- int ret;
-
- /* see if indexing is enabled */
- if (!ltdb->cache->attribute_indexes &&
- !ltdb->cache->one_level_indexes &&
- ac->scope != LDB_SCOPE_BASE) {
- /* fallback to a full search */
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- dn_list = talloc_zero(ac, struct dn_list);
- if (dn_list == NULL) {
- return ldb_module_oom(ac->module);
- }
-
- switch (ac->scope) {
- case LDB_SCOPE_BASE:
- dn_list->dn = talloc_array(dn_list, struct ldb_val, 1);
- if (dn_list->dn == NULL) {
- talloc_free(dn_list);
- return ldb_module_oom(ac->module);
- }
- dn_list->dn[0].data = discard_const_p(unsigned char, ldb_dn_get_linearized(ac->base));
- if (dn_list->dn[0].data == NULL) {
- talloc_free(dn_list);
- return ldb_module_oom(ac->module);
- }
- dn_list->dn[0].length = strlen((char *)dn_list->dn[0].data);
- dn_list->count = 1;
- break;
-
- case LDB_SCOPE_ONELEVEL:
- if (!ltdb->cache->one_level_indexes) {
- talloc_free(dn_list);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ret = ltdb_index_dn_one(ac->module, ac->base, dn_list);
- if (ret != LDB_SUCCESS) {
- talloc_free(dn_list);
- return ret;
- }
- break;
-
- case LDB_SCOPE_SUBTREE:
- case LDB_SCOPE_DEFAULT:
- if (!ltdb->cache->attribute_indexes) {
- talloc_free(dn_list);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ret = ltdb_index_dn(ac->module, ac->tree, ltdb->cache->indexlist, dn_list);
- if (ret != LDB_SUCCESS) {
- talloc_free(dn_list);
- return ret;
- }
- ltdb_dn_list_remove_duplicates(dn_list);
- break;
- }
-
- ret = ltdb_index_filter(dn_list, ac, match_count);
- talloc_free(dn_list);
- return ret;
-}
-
-/*
- add an index entry for one message element
-*/
-static int ltdb_index_add1(struct ldb_module *module, const char *dn,
- struct ldb_message_element *el, int v_idx)
-{
- struct ldb_context *ldb;
- struct ldb_dn *dn_key;
- int ret;
- const struct ldb_schema_attribute *a;
- struct dn_list *list;
- unsigned alloc_len;
-
- ldb = ldb_module_get_ctx(module);
-
- list = talloc_zero(module, struct dn_list);
- if (list == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- dn_key = ltdb_index_key(ldb, el->name, &el->values[v_idx], &a);
- if (!dn_key) {
- talloc_free(list);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- talloc_steal(list, dn_key);
-
- ret = ltdb_dn_list_load(module, dn_key, list);
- if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_OBJECT) {
- talloc_free(list);
- return ret;
- }
-
- if (ltdb_dn_list_find_str(list, dn) != -1) {
- talloc_free(list);
- return LDB_SUCCESS;
- }
-
- if (list->count > 0 &&
- a->flags & LDB_ATTR_FLAG_UNIQUE_INDEX) {
- talloc_free(list);
- ldb_asprintf_errstring(ldb, __location__ ": unique index violation on %s in %s",
- el->name, dn);
- return LDB_ERR_ENTRY_ALREADY_EXISTS;
- }
-
- /* overallocate the list a bit, to reduce the number of
- * realloc trigered copies */
- alloc_len = ((list->count+1)+7) & ~7;
- list->dn = talloc_realloc(list, list->dn, struct ldb_val, alloc_len);
- if (list->dn == NULL) {
- talloc_free(list);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- list->dn[list->count].data = (uint8_t *)talloc_strdup(list->dn, dn);
- list->dn[list->count].length = strlen(dn);
- list->count++;
-
- ret = ltdb_dn_list_store(module, dn_key, list);
-
- talloc_free(list);
-
- return ret;
-}
-
-/*
- add index entries for one elements in a message
- */
-static int ltdb_index_add_el(struct ldb_module *module, const char *dn,
- struct ldb_message_element *el)
-{
- unsigned int i;
- for (i = 0; i < el->num_values; i++) {
- int ret = ltdb_index_add1(module, dn, el, i);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-/*
- add index entries for all elements in a message
- */
-static int ltdb_index_add_all(struct ldb_module *module, const char *dn,
- struct ldb_message_element *elements, int num_el)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- unsigned int i;
-
- if (dn[0] == '@') {
- return LDB_SUCCESS;
- }
-
- if (ltdb->cache->indexlist->num_elements == 0) {
- /* no indexed fields */
- return LDB_SUCCESS;
- }
-
- for (i = 0; i < num_el; i++) {
- int ret;
- if (!ltdb_is_indexed(ltdb->cache->indexlist, elements[i].name)) {
- continue;
- }
- ret = ltdb_index_add_el(module, dn, &elements[i]);
- if (ret != LDB_SUCCESS) {
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- ldb_asprintf_errstring(ldb,
- __location__ ": Failed to re-index %s in %s - %s",
- elements[i].name, dn, ldb_errstring(ldb));
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-
-/*
- insert a one level index for a message
-*/
-static int ltdb_index_onelevel(struct ldb_module *module, const struct ldb_message *msg, int add)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- struct ldb_message_element el;
- struct ldb_val val;
- struct ldb_dn *pdn;
- const char *dn;
- int ret;
-
- /* We index for ONE Level only if requested */
- if (!ltdb->cache->one_level_indexes) {
- return LDB_SUCCESS;
- }
-
- pdn = ldb_dn_get_parent(module, msg->dn);
- if (pdn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- dn = ldb_dn_get_linearized(msg->dn);
- if (dn == NULL) {
- talloc_free(pdn);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- val.data = (uint8_t *)((uintptr_t)ldb_dn_get_casefold(pdn));
- if (val.data == NULL) {
- talloc_free(pdn);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- val.length = strlen((char *)val.data);
- el.name = LTDB_IDXONE;
- el.values = &val;
- el.num_values = 1;
-
- if (add) {
- ret = ltdb_index_add1(module, dn, &el, 0);
- } else { /* delete */
- ret = ltdb_index_del_value(module, msg->dn, &el, 0);
- }
-
- talloc_free(pdn);
-
- return ret;
-}
-
-/*
- add the index entries for a new element in a record
- The caller guarantees that these element values are not yet indexed
-*/
-int ltdb_index_add_element(struct ldb_module *module, struct ldb_dn *dn,
- struct ldb_message_element *el)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- if (ldb_dn_is_special(dn)) {
- return LDB_SUCCESS;
- }
- if (!ltdb_is_indexed(ltdb->cache->indexlist, el->name)) {
- return LDB_SUCCESS;
- }
- return ltdb_index_add_el(module, ldb_dn_get_linearized(dn), el);
-}
-
-/*
- add the index entries for a new record
-*/
-int ltdb_index_add_new(struct ldb_module *module, const struct ldb_message *msg)
-{
- const char *dn;
- int ret;
-
- if (ldb_dn_is_special(msg->dn)) {
- return LDB_SUCCESS;
- }
-
- dn = ldb_dn_get_linearized(msg->dn);
- if (dn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_index_add_all(module, dn, msg->elements, msg->num_elements);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- return ltdb_index_onelevel(module, msg, 1);
-}
-
-
-/*
- delete an index entry for one message element
-*/
-int ltdb_index_del_value(struct ldb_module *module, struct ldb_dn *dn,
- struct ldb_message_element *el, unsigned int v_idx)
-{
- struct ldb_context *ldb;
- struct ldb_dn *dn_key;
- const char *dn_str;
- int ret, i;
- unsigned int j;
- struct dn_list *list;
-
- ldb = ldb_module_get_ctx(module);
-
- dn_str = ldb_dn_get_linearized(dn);
- if (dn_str == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (dn_str[0] == '@') {
- return LDB_SUCCESS;
- }
-
- dn_key = ltdb_index_key(ldb, el->name, &el->values[v_idx], NULL);
- if (!dn_key) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- list = talloc_zero(dn_key, struct dn_list);
- if (list == NULL) {
- talloc_free(dn_key);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_dn_list_load(module, dn_key, list);
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- /* it wasn't indexed. Did we have an earlier error? If we did then
- its gone now */
- talloc_free(dn_key);
- return LDB_SUCCESS;
- }
-
- if (ret != LDB_SUCCESS) {
- talloc_free(dn_key);
- return ret;
- }
-
- i = ltdb_dn_list_find_str(list, dn_str);
- if (i == -1) {
- /* nothing to delete */
- talloc_free(dn_key);
- return LDB_SUCCESS;
- }
-
- j = (unsigned int) i;
- if (j != list->count - 1) {
- memmove(&list->dn[j], &list->dn[j+1], sizeof(list->dn[0])*(list->count - (j+1)));
- }
- list->count--;
- list->dn = talloc_realloc(list, list->dn, struct ldb_val, list->count);
-
- ret = ltdb_dn_list_store(module, dn_key, list);
-
- talloc_free(dn_key);
-
- return ret;
-}
-
-/*
- delete the index entries for a element
- return -1 on failure
-*/
-int ltdb_index_del_element(struct ldb_module *module, struct ldb_dn *dn,
- struct ldb_message_element *el)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- const char *dn_str;
- int ret;
- unsigned int i;
-
- if (!ltdb->cache->attribute_indexes) {
- /* no indexed fields */
- return LDB_SUCCESS;
- }
-
- dn_str = ldb_dn_get_linearized(dn);
- if (dn_str == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (dn_str[0] == '@') {
- return LDB_SUCCESS;
- }
-
- if (!ltdb_is_indexed(ltdb->cache->indexlist, el->name)) {
- return LDB_SUCCESS;
- }
- for (i = 0; i < el->num_values; i++) {
- ret = ltdb_index_del_value(module, dn, el, i);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-/*
- delete the index entries for a record
- return -1 on failure
-*/
-int ltdb_index_delete(struct ldb_module *module, const struct ldb_message *msg)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- int ret;
- unsigned int i;
-
- if (ldb_dn_is_special(msg->dn)) {
- return LDB_SUCCESS;
- }
-
- ret = ltdb_index_onelevel(module, msg, 0);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- if (!ltdb->cache->attribute_indexes) {
- /* no indexed fields */
- return LDB_SUCCESS;
- }
-
- for (i = 0; i < msg->num_elements; i++) {
- ret = ltdb_index_del_element(module, msg->dn, &msg->elements[i]);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-
-/*
- traversal function that deletes all @INDEX records
-*/
-static int delete_index(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *state)
-{
- struct ldb_module *module = state;
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- const char *dnstr = "DN=" LTDB_INDEX ":";
- struct dn_list list;
- struct ldb_dn *dn;
- struct ldb_val v;
- int ret;
-
- if (strncmp((char *)key.dptr, dnstr, strlen(dnstr)) != 0) {
- return 0;
- }
- /* we need to put a empty list in the internal tdb for this
- * index entry */
- list.dn = NULL;
- list.count = 0;
-
- /* the offset of 3 is to remove the DN= prefix. */
- v.data = key.dptr + 3;
- v.length = strnlen((char *)key.dptr, key.dsize) - 3;
-
- dn = ldb_dn_from_ldb_val(ltdb, ldb_module_get_ctx(module), &v);
- ret = ltdb_dn_list_store(module, dn, &list);
- if (ret != LDB_SUCCESS) {
- ldb_asprintf_errstring(ldb_module_get_ctx(module),
- "Unable to store null index for %s\n",
- ldb_dn_get_linearized(dn));
- talloc_free(dn);
- return -1;
- }
- talloc_free(dn);
- return 0;
-}
-
-struct ltdb_reindex_context {
- struct ldb_module *module;
- int error;
-};
-
-/*
- traversal function that adds @INDEX records during a re index
-*/
-static int re_index(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *state)
-{
- struct ldb_context *ldb;
- struct ltdb_reindex_context *ctx = (struct ltdb_reindex_context *)state;
- struct ldb_module *module = ctx->module;
- struct ldb_message *msg;
- const char *dn = NULL;
- int ret;
- TDB_DATA key2;
-
- ldb = ldb_module_get_ctx(module);
-
- if (strncmp((char *)key.dptr, "DN=@", 4) == 0 ||
- strncmp((char *)key.dptr, "DN=", 3) != 0) {
- return 0;
- }
-
- msg = ldb_msg_new(module);
- if (msg == NULL) {
- return -1;
- }
-
- ret = ltdb_unpack_data(module, &data, msg);
- if (ret != 0) {
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid data for index %s\n",
- ldb_dn_get_linearized(msg->dn));
- talloc_free(msg);
- return -1;
- }
-
- /* check if the DN key has changed, perhaps due to the
- case insensitivity of an element changing */
- key2 = ltdb_key(module, msg->dn);
- if (key2.dptr == NULL) {
- /* probably a corrupt record ... darn */
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid DN in re_index: %s",
- ldb_dn_get_linearized(msg->dn));
- talloc_free(msg);
- return 0;
- }
- if (strcmp((char *)key2.dptr, (char *)key.dptr) != 0) {
- tdb_delete(tdb, key);
- tdb_store(tdb, key2, data, 0);
- }
- talloc_free(key2.dptr);
-
- if (msg->dn == NULL) {
- dn = (char *)key.dptr + 3;
- } else {
- dn = ldb_dn_get_linearized(msg->dn);
- }
-
- ret = ltdb_index_onelevel(module, msg, 1);
- if (ret != LDB_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Adding special ONE LEVEL index failed (%s)!",
- ldb_dn_get_linearized(msg->dn));
- talloc_free(msg);
- return -1;
- }
-
- ret = ltdb_index_add_all(module, dn, msg->elements, msg->num_elements);
-
- if (ret != LDB_SUCCESS) {
- ctx->error = ret;
- talloc_free(msg);
- return -1;
- }
-
- talloc_free(msg);
-
- return 0;
-}
-
-/*
- force a complete reindex of the database
-*/
-int ltdb_reindex(struct ldb_module *module)
-{
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
- int ret;
- struct ltdb_reindex_context ctx;
-
- if (ltdb_cache_reload(module) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* first traverse the database deleting any @INDEX records by
- * putting NULL entries in the in-memory tdb
- */
- ret = tdb_traverse(ltdb->tdb, delete_index, module);
- if (ret < 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* if we don't have indexes we have nothing todo */
- if (ltdb->cache->indexlist->num_elements == 0) {
- return LDB_SUCCESS;
- }
-
- ctx.module = module;
- ctx.error = 0;
-
- /* now traverse adding any indexes for normal LDB records */
- ret = tdb_traverse(ltdb->tdb, re_index, &ctx);
- if (ret < 0) {
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- ldb_asprintf_errstring(ldb, "reindexing traverse failed: %s", ldb_errstring(ldb));
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (ctx.error != LDB_SUCCESS) {
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- ldb_asprintf_errstring(ldb, "reindexing failed: %s", ldb_errstring(ldb));
- return ctx.error;
- }
-
- return LDB_SUCCESS;
-}
diff --git a/source4/lib/ldb/ldb_tdb/ldb_pack.c b/source4/lib/ldb/ldb_tdb/ldb_pack.c
deleted file mode 100644
index 7c13065aee..0000000000
--- a/source4/lib/ldb/ldb_tdb/ldb_pack.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb pack/unpack
- *
- * Description: pack/unpack routines for ldb messages as key/value blobs
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb_tdb.h"
-
-/* change this if the data format ever changes */
-#define LTDB_PACKING_FORMAT 0x26011967
-
-/* old packing formats */
-#define LTDB_PACKING_FORMAT_NODN 0x26011966
-
-/* use a portable integer format */
-static void put_uint32(uint8_t *p, int ofs, unsigned int val)
-{
- p += ofs;
- p[0] = val&0xFF;
- p[1] = (val>>8) & 0xFF;
- p[2] = (val>>16) & 0xFF;
- p[3] = (val>>24) & 0xFF;
-}
-
-static unsigned int pull_uint32(uint8_t *p, int ofs)
-{
- p += ofs;
- return p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24);
-}
-
-static int attribute_storable_values(const struct ldb_message_element *el)
-{
- if (el->num_values == 0) return 0;
-
- if (ldb_attr_cmp(el->name, "distinguishedName") == 0) return 0;
-
- return el->num_values;
-}
-
-/*
- pack a ldb message into a linear buffer in a TDB_DATA
-
- note that this routine avoids saving elements with zero values,
- as these are equivalent to having no element
-
- caller frees the data buffer after use
-*/
-int ltdb_pack_data(struct ldb_module *module,
- const struct ldb_message *message,
- TDB_DATA *data)
-{
- struct ldb_context *ldb;
- unsigned int i, j, real_elements=0;
- size_t size;
- const char *dn;
- uint8_t *p;
- size_t len;
-
- ldb = ldb_module_get_ctx(module);
-
- dn = ldb_dn_get_linearized(message->dn);
- if (dn == NULL) {
- errno = ENOMEM;
- return -1;
- }
-
- /* work out how big it needs to be */
- size = 8;
-
- size += 1 + strlen(dn);
-
- for (i=0;i<message->num_elements;i++) {
- if (attribute_storable_values(&message->elements[i]) == 0) {
- continue;
- }
-
- real_elements++;
-
- size += 1 + strlen(message->elements[i].name) + 4;
- for (j=0;j<message->elements[i].num_values;j++) {
- size += 4 + message->elements[i].values[j].length + 1;
- }
- }
-
- /* allocate it */
- data->dptr = talloc_array(ldb, uint8_t, size);
- if (!data->dptr) {
- errno = ENOMEM;
- return -1;
- }
- data->dsize = size;
-
- p = data->dptr;
- put_uint32(p, 0, LTDB_PACKING_FORMAT);
- put_uint32(p, 4, real_elements);
- p += 8;
-
- /* the dn needs to be packed so we can be case preserving
- while hashing on a case folded dn */
- len = strlen(dn);
- memcpy(p, dn, len+1);
- p += len + 1;
-
- for (i=0;i<message->num_elements;i++) {
- if (attribute_storable_values(&message->elements[i]) == 0) {
- continue;
- }
- len = strlen(message->elements[i].name);
- memcpy(p, message->elements[i].name, len+1);
- p += len + 1;
- put_uint32(p, 0, message->elements[i].num_values);
- p += 4;
- for (j=0;j<message->elements[i].num_values;j++) {
- put_uint32(p, 0, message->elements[i].values[j].length);
- memcpy(p+4, message->elements[i].values[j].data,
- message->elements[i].values[j].length);
- p[4+message->elements[i].values[j].length] = 0;
- p += 4 + message->elements[i].values[j].length + 1;
- }
- }
-
- return 0;
-}
-
-/*
- unpack a ldb message from a linear buffer in TDB_DATA
-
- Free with ltdb_unpack_data_free()
-*/
-int ltdb_unpack_data(struct ldb_module *module,
- const TDB_DATA *data,
- struct ldb_message *message)
-{
- struct ldb_context *ldb;
- uint8_t *p;
- unsigned int remaining;
- unsigned int i, j;
- unsigned format;
- size_t len;
-
- ldb = ldb_module_get_ctx(module);
- message->elements = NULL;
-
- p = data->dptr;
- if (data->dsize < 8) {
- errno = EIO;
- goto failed;
- }
-
- format = pull_uint32(p, 0);
- message->num_elements = pull_uint32(p, 4);
- p += 8;
-
- remaining = data->dsize - 8;
-
- switch (format) {
- case LTDB_PACKING_FORMAT_NODN:
- message->dn = NULL;
- break;
-
- case LTDB_PACKING_FORMAT:
- len = strnlen((char *)p, remaining);
- if (len == remaining) {
- errno = EIO;
- goto failed;
- }
- message->dn = ldb_dn_new(message, ldb, (char *)p);
- if (message->dn == NULL) {
- errno = ENOMEM;
- goto failed;
- }
- remaining -= len + 1;
- p += len + 1;
- break;
-
- default:
- errno = EIO;
- goto failed;
- }
-
- if (message->num_elements == 0) {
- return 0;
- }
-
- if (message->num_elements > remaining / 6) {
- errno = EIO;
- goto failed;
- }
-
- message->elements = talloc_array(message, struct ldb_message_element, message->num_elements);
- if (!message->elements) {
- errno = ENOMEM;
- goto failed;
- }
-
- memset(message->elements, 0,
- message->num_elements * sizeof(struct ldb_message_element));
-
- for (i=0;i<message->num_elements;i++) {
- if (remaining < 10) {
- errno = EIO;
- goto failed;
- }
- len = strnlen((char *)p, remaining-6);
- if (len == remaining-6) {
- errno = EIO;
- goto failed;
- }
- if (len == 0) {
- errno = EIO;
- goto failed;
- }
- message->elements[i].flags = 0;
- message->elements[i].name = talloc_strndup(message->elements, (char *)p, len);
- if (message->elements[i].name == NULL) {
- errno = ENOMEM;
- goto failed;
- }
- remaining -= len + 1;
- p += len + 1;
- message->elements[i].num_values = pull_uint32(p, 0);
- message->elements[i].values = NULL;
- if (message->elements[i].num_values != 0) {
- message->elements[i].values = talloc_array(message->elements,
- struct ldb_val,
- message->elements[i].num_values);
- if (!message->elements[i].values) {
- errno = ENOMEM;
- goto failed;
- }
- }
- p += 4;
- remaining -= 4;
- for (j=0;j<message->elements[i].num_values;j++) {
- len = pull_uint32(p, 0);
- if (len > remaining-5) {
- errno = EIO;
- goto failed;
- }
-
- message->elements[i].values[j].length = len;
- message->elements[i].values[j].data = talloc_size(message->elements[i].values, len+1);
- if (message->elements[i].values[j].data == NULL) {
- errno = ENOMEM;
- goto failed;
- }
- memcpy(message->elements[i].values[j].data, p+4, len);
- message->elements[i].values[j].data[len] = 0;
-
- remaining -= len+4+1;
- p += len+4+1;
- }
- }
-
- if (remaining != 0) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Error: %d bytes unread in ltdb_unpack_data", remaining);
- }
-
- return 0;
-
-failed:
- talloc_free(message->elements);
- return -1;
-}
diff --git a/source4/lib/ldb/ldb_tdb/ldb_search.c b/source4/lib/ldb/ldb_tdb/ldb_search.c
deleted file mode 100644
index 46e2d74998..0000000000
--- a/source4/lib/ldb/ldb_tdb/ldb_search.c
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb search functions
- *
- * Description: functions to search ldb+tdb databases
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb_tdb.h"
-#include <lib/tdb_compat/tdb_compat.h>
-
-/*
- add one element to a message
-*/
-static int msg_add_element(struct ldb_message *ret,
- const struct ldb_message_element *el,
- int check_duplicates)
-{
- unsigned int i;
- struct ldb_message_element *e2, *elnew;
-
- if (check_duplicates && ldb_msg_find_element(ret, el->name)) {
- /* its already there */
- return 0;
- }
-
- e2 = talloc_realloc(ret, ret->elements, struct ldb_message_element, ret->num_elements+1);
- if (!e2) {
- return -1;
- }
- ret->elements = e2;
-
- elnew = &e2[ret->num_elements];
-
- elnew->name = talloc_strdup(ret->elements, el->name);
- if (!elnew->name) {
- return -1;
- }
-
- if (el->num_values) {
- elnew->values = talloc_array(ret->elements, struct ldb_val, el->num_values);
- if (!elnew->values) {
- return -1;
- }
- } else {
- elnew->values = NULL;
- }
-
- for (i=0;i<el->num_values;i++) {
- elnew->values[i] = ldb_val_dup(elnew->values, &el->values[i]);
- if (elnew->values[i].length != el->values[i].length) {
- return -1;
- }
- }
-
- elnew->num_values = el->num_values;
- elnew->flags = el->flags;
-
- ret->num_elements++;
-
- return 0;
-}
-
-/*
- add the special distinguishedName element
-*/
-static int msg_add_distinguished_name(struct ldb_message *msg)
-{
- struct ldb_message_element el;
- struct ldb_val val;
- int ret;
-
- el.flags = 0;
- el.name = "distinguishedName";
- el.num_values = 1;
- el.values = &val;
- el.flags = 0;
- val.data = (uint8_t *)ldb_dn_alloc_linearized(msg, msg->dn);
- val.length = strlen((char *)val.data);
-
- ret = msg_add_element(msg, &el, 1);
- return ret;
-}
-
-/*
- add all elements from one message into another
- */
-static int msg_add_all_elements(struct ldb_module *module, struct ldb_message *ret,
- const struct ldb_message *msg)
-{
- struct ldb_context *ldb;
- unsigned int i;
- int check_duplicates = (ret->num_elements != 0);
-
- ldb = ldb_module_get_ctx(module);
-
- if (msg_add_distinguished_name(ret) != 0) {
- return -1;
- }
-
- for (i=0;i<msg->num_elements;i++) {
- const struct ldb_schema_attribute *a;
- a = ldb_schema_attribute_by_name(ldb, msg->elements[i].name);
- if (a->flags & LDB_ATTR_FLAG_HIDDEN) {
- continue;
- }
- if (msg_add_element(ret, &msg->elements[i],
- check_duplicates) != 0) {
- return -1;
- }
- }
-
- return 0;
-}
-
-
-/*
- pull the specified list of attributes from a message
- */
-static struct ldb_message *ltdb_pull_attrs(struct ldb_module *module,
- TALLOC_CTX *mem_ctx,
- const struct ldb_message *msg,
- const char * const *attrs)
-{
- struct ldb_message *ret;
- unsigned int i;
-
- ret = talloc(mem_ctx, struct ldb_message);
- if (!ret) {
- return NULL;
- }
-
- ret->dn = ldb_dn_copy(ret, msg->dn);
- if (!ret->dn) {
- talloc_free(ret);
- return NULL;
- }
-
- ret->num_elements = 0;
- ret->elements = NULL;
-
- if (!attrs) {
- if (msg_add_all_elements(module, ret, msg) != 0) {
- talloc_free(ret);
- return NULL;
- }
- return ret;
- }
-
- for (i=0;attrs[i];i++) {
- struct ldb_message_element *el;
-
- if (strcmp(attrs[i], "*") == 0) {
- if (msg_add_all_elements(module, ret, msg) != 0) {
- talloc_free(ret);
- return NULL;
- }
- continue;
- }
-
- if (ldb_attr_cmp(attrs[i], "distinguishedName") == 0) {
- if (msg_add_distinguished_name(ret) != 0) {
- return NULL;
- }
- continue;
- }
-
- el = ldb_msg_find_element(msg, attrs[i]);
- if (!el) {
- continue;
- }
- if (msg_add_element(ret, el, 1) != 0) {
- talloc_free(ret);
- return NULL;
- }
- }
-
- return ret;
-}
-
-/*
- search the database for a single simple dn.
- return LDB_ERR_NO_SUCH_OBJECT on record-not-found
- and LDB_SUCCESS on success
-*/
-static int ltdb_search_base(struct ldb_module *module, struct ldb_dn *dn)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- TDB_DATA tdb_key, tdb_data;
-
- if (ldb_dn_is_null(dn)) {
- return LDB_ERR_NO_SUCH_OBJECT;
- }
-
- /* form the key */
- tdb_key = ltdb_key(module, dn);
- if (!tdb_key.dptr) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- tdb_data = tdb_fetch_compat(ltdb->tdb, tdb_key);
- talloc_free(tdb_key.dptr);
- if (!tdb_data.dptr) {
- return LDB_ERR_NO_SUCH_OBJECT;
- }
-
- free(tdb_data.dptr);
- return LDB_SUCCESS;
-}
-
-/*
- search the database for a single simple dn, returning all attributes
- in a single message
-
- return LDB_ERR_NO_SUCH_OBJECT on record-not-found
- and LDB_SUCCESS on success
-*/
-int ltdb_search_dn1(struct ldb_module *module, struct ldb_dn *dn, struct ldb_message *msg)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- int ret;
- TDB_DATA tdb_key, tdb_data;
-
- memset(msg, 0, sizeof(*msg));
-
- /* form the key */
- tdb_key = ltdb_key(module, dn);
- if (!tdb_key.dptr) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- tdb_data = tdb_fetch_compat(ltdb->tdb, tdb_key);
- talloc_free(tdb_key.dptr);
- if (!tdb_data.dptr) {
- return LDB_ERR_NO_SUCH_OBJECT;
- }
-
- msg->num_elements = 0;
- msg->elements = NULL;
-
- ret = ltdb_unpack_data(module, &tdb_data, msg);
- free(tdb_data.dptr);
- if (ret == -1) {
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid data for index %s\n",
- ldb_dn_get_linearized(msg->dn));
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (!msg->dn) {
- msg->dn = ldb_dn_copy(msg, dn);
- }
- if (!msg->dn) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
-}
-
-/*
- add a set of attributes from a record to a set of results
- return 0 on success, -1 on failure
-*/
-int ltdb_add_attr_results(struct ldb_module *module,
- TALLOC_CTX *mem_ctx,
- struct ldb_message *msg,
- const char * const attrs[],
- unsigned int *count,
- struct ldb_message ***res)
-{
- struct ldb_message *msg2;
- struct ldb_message **res2;
-
- /* pull the attributes that the user wants */
- msg2 = ltdb_pull_attrs(module, mem_ctx, msg, attrs);
- if (!msg2) {
- return -1;
- }
-
- /* add to the results list */
- res2 = talloc_realloc(mem_ctx, *res, struct ldb_message *, (*count)+2);
- if (!res2) {
- talloc_free(msg2);
- return -1;
- }
-
- (*res) = res2;
-
- (*res)[*count] = talloc_move(*res, &msg2);
- (*res)[(*count)+1] = NULL;
- (*count)++;
-
- return 0;
-}
-
-
-
-/*
- filter the specified list of attributes from a message
- removing not requested attrs.
- */
-int ltdb_filter_attrs(struct ldb_message *msg, const char * const *attrs)
-{
- unsigned int i;
- int keep_all = 0;
- struct ldb_message_element *el2;
- uint32_t num_elements;
-
- if (attrs) {
- /* check for special attrs */
- for (i = 0; attrs[i]; i++) {
- if (strcmp(attrs[i], "*") == 0) {
- keep_all = 1;
- break;
- }
-
- if (ldb_attr_cmp(attrs[i], "distinguishedName") == 0) {
- if (msg_add_distinguished_name(msg) != 0) {
- return -1;
- }
- }
- }
- } else {
- keep_all = 1;
- }
-
- if (keep_all) {
- if (msg_add_distinguished_name(msg) != 0) {
- return -1;
- }
- return 0;
- }
-
- el2 = talloc_array(msg, struct ldb_message_element, msg->num_elements);
- if (el2 == NULL) {
- return -1;
- }
- num_elements = 0;
-
- for (i = 0; i < msg->num_elements; i++) {
- unsigned int j;
- int found = 0;
-
- for (j = 0; attrs[j]; j++) {
- if (ldb_attr_cmp(msg->elements[i].name, attrs[j]) == 0) {
- found = 1;
- break;
- }
- }
-
- if (found) {
- el2[num_elements] = msg->elements[i];
- talloc_steal(el2, el2[num_elements].name);
- talloc_steal(el2, el2[num_elements].values);
- num_elements++;
- }
- }
-
- talloc_free(msg->elements);
- msg->elements = talloc_realloc(msg, el2, struct ldb_message_element, msg->num_elements);
- if (msg->elements == NULL) {
- return -1;
- }
- msg->num_elements = num_elements;
-
- return 0;
-}
-
-/*
- search function for a non-indexed search
- */
-static int search_func(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *state)
-{
- struct ldb_context *ldb;
- struct ltdb_context *ac;
- struct ldb_message *msg;
- int ret;
- bool matched;
-
- ac = talloc_get_type(state, struct ltdb_context);
- ldb = ldb_module_get_ctx(ac->module);
-
- if (key.dsize < 4 ||
- strncmp((char *)key.dptr, "DN=", 3) != 0) {
- return 0;
- }
-
- msg = ldb_msg_new(ac);
- if (!msg) {
- return -1;
- }
-
- /* unpack the record */
- ret = ltdb_unpack_data(ac->module, &data, msg);
- if (ret == -1) {
- talloc_free(msg);
- return -1;
- }
-
- if (!msg->dn) {
- msg->dn = ldb_dn_new(msg, ldb,
- (char *)key.dptr + 3);
- if (msg->dn == NULL) {
- talloc_free(msg);
- return -1;
- }
- }
-
- /* see if it matches the given expression */
- ret = ldb_match_msg_error(ldb, msg,
- ac->tree, ac->base, ac->scope, &matched);
- if (ret != LDB_SUCCESS) {
- talloc_free(msg);
- return -1;
- }
- if (!matched) {
- talloc_free(msg);
- return 0;
- }
-
- /* filter the attributes that the user wants */
- ret = ltdb_filter_attrs(msg, ac->attrs);
-
- if (ret == -1) {
- talloc_free(msg);
- return -1;
- }
-
- ret = ldb_module_send_entry(ac->req, msg, NULL);
- if (ret != LDB_SUCCESS) {
- ac->request_terminated = true;
- /* the callback failed, abort the operation */
- return -1;
- }
-
- return 0;
-}
-
-
-/*
- search the database with a LDAP-like expression.
- this is the "full search" non-indexed variant
-*/
-static int ltdb_search_full(struct ltdb_context *ctx)
-{
- void *data = ldb_module_get_private(ctx->module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- int ret;
-
- if (ltdb->in_transaction != 0) {
- ret = tdb_traverse(ltdb->tdb, search_func, ctx);
- } else {
- ret = tdb_traverse_read(ltdb->tdb, search_func, ctx);
- }
-
- if (ret < 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return LDB_SUCCESS;
-}
-
-/*
- search the database with a LDAP-like expression.
- choses a search method
-*/
-int ltdb_search(struct ltdb_context *ctx)
-{
- struct ldb_context *ldb;
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- if (ltdb_lock_read(module) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (ltdb_cache_load(module) != 0) {
- ltdb_unlock_read(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (req->op.search.tree == NULL) {
- ltdb_unlock_read(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if ((req->op.search.base == NULL) || (ldb_dn_is_null(req->op.search.base) == true)) {
-
- /* Check what we should do with a NULL dn */
- switch (req->op.search.scope) {
- case LDB_SCOPE_BASE:
- ldb_asprintf_errstring(ldb,
- "NULL Base DN invalid for a base search");
- ret = LDB_ERR_INVALID_DN_SYNTAX;
- break;
- case LDB_SCOPE_ONELEVEL:
- ldb_asprintf_errstring(ldb,
- "NULL Base DN invalid for a one-level search");
- ret = LDB_ERR_INVALID_DN_SYNTAX;
- break;
- case LDB_SCOPE_SUBTREE:
- default:
- /* We accept subtree searches from a NULL base DN, ie over the whole DB */
- ret = LDB_SUCCESS;
- }
- } else if (ldb_dn_is_valid(req->op.search.base) == false) {
-
- /* We don't want invalid base DNs here */
- ldb_asprintf_errstring(ldb,
- "Invalid Base DN: %s",
- ldb_dn_get_linearized(req->op.search.base));
- ret = LDB_ERR_INVALID_DN_SYNTAX;
-
- } else if (ltdb->check_base) {
- /* This database has been marked as 'checkBaseOnSearch', so do a spot check of the base dn */
- ret = ltdb_search_base(module, req->op.search.base);
-
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- ldb_asprintf_errstring(ldb,
- "No such Base DN: %s",
- ldb_dn_get_linearized(req->op.search.base));
- }
-
- } else {
- /* If we are not checking the base DN life is easy */
- ret = LDB_SUCCESS;
- }
-
- ctx->tree = req->op.search.tree;
- ctx->scope = req->op.search.scope;
- ctx->base = req->op.search.base;
- ctx->attrs = req->op.search.attrs;
-
- if (ret == LDB_SUCCESS) {
- uint32_t match_count = 0;
-
- ret = ltdb_search_indexed(ctx, &match_count);
- if (ret == LDB_ERR_NO_SUCH_OBJECT) {
- /* Not in the index, therefore OK! */
- ret = LDB_SUCCESS;
-
- }
- /* Check if we got just a normal error.
- * In that case proceed to a full search unless we got a
- * callback error */
- if ( ! ctx->request_terminated && ret != LDB_SUCCESS) {
- /* Not indexed, so we need to do a full scan */
- if (ltdb->warn_unindexed) {
- /* useful for debugging when slow performance
- * is caused by unindexed searches */
- char *expression = ldb_filter_from_tree(ctx, ctx->tree);
- ldb_debug(ldb, LDB_DEBUG_WARNING, "ldb FULL SEARCH: %s SCOPE: %s DN: %s\n",
- expression,
- req->op.search.scope==LDB_SCOPE_BASE?"base":
- req->op.search.scope==LDB_SCOPE_ONELEVEL?"one":
- req->op.search.scope==LDB_SCOPE_SUBTREE?"sub":"UNKNOWN",
- ldb_dn_get_linearized(req->op.search.base));
-
- talloc_free(expression);
- }
- if (match_count != 0) {
- /* the indexing code gave an error
- * after having returned at least one
- * entry. This means the indexes are
- * corrupt or a database record is
- * corrupt. We cannot continue with a
- * full search or we may return
- * duplicate entries
- */
- ltdb_unlock_read(module);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ret = ltdb_search_full(ctx);
- if (ret != LDB_SUCCESS) {
- ldb_set_errstring(ldb, "Indexed and full searches both failed!\n");
- }
- }
- }
-
- ltdb_unlock_read(module);
-
- return ret;
-}
-
diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.c b/source4/lib/ldb/ldb_tdb/ldb_tdb.c
deleted file mode 100644
index 0d4be49123..0000000000
--- a/source4/lib/ldb/ldb_tdb/ldb_tdb.c
+++ /dev/null
@@ -1,1519 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
- Copyright (C) Stefan Metzmacher 2004
- Copyright (C) Simo Sorce 2006-2008
- Copyright (C) Matthias Dieter Wallnöfer 2009-2010
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb_tdb
- *
- * Component: ldb tdb backend
- *
- * Description: core functions for tdb backend
- *
- * Author: Andrew Tridgell
- * Author: Stefan Metzmacher
- *
- * Modifications:
- *
- * - description: make the module use asynchronous calls
- * date: Feb 2006
- * Author: Simo Sorce
- *
- * - description: make it possible to use event contexts
- * date: Jan 2008
- * Author: Simo Sorce
- *
- * - description: fix up memory leaks and small bugs
- * date: Oct 2009
- * Author: Matthias Dieter Wallnöfer
- */
-
-#include "ldb_tdb.h"
-#include <lib/tdb_compat/tdb_compat.h>
-
-
-/*
- map a tdb error code to a ldb error code
-*/
-int ltdb_err_map(enum TDB_ERROR tdb_code)
-{
- switch (tdb_code) {
- case TDB_SUCCESS:
- return LDB_SUCCESS;
- case TDB_ERR_CORRUPT:
- case TDB_ERR_OOM:
- case TDB_ERR_EINVAL:
- return LDB_ERR_OPERATIONS_ERROR;
- case TDB_ERR_IO:
- return LDB_ERR_PROTOCOL_ERROR;
- case TDB_ERR_LOCK:
-#ifndef BUILD_TDB2
- case TDB_ERR_NOLOCK:
-#endif
- return LDB_ERR_BUSY;
-#ifndef BUILD_TDB2
- case TDB_ERR_LOCK_TIMEOUT:
-#endif
- return LDB_ERR_TIME_LIMIT_EXCEEDED;
- case TDB_ERR_EXISTS:
- return LDB_ERR_ENTRY_ALREADY_EXISTS;
- case TDB_ERR_NOEXIST:
- return LDB_ERR_NO_SUCH_OBJECT;
- case TDB_ERR_RDONLY:
- return LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS;
- default:
- break;
- }
- return LDB_ERR_OTHER;
-}
-
-/*
- lock the database for read - use by ltdb_search and ltdb_sequence_number
-*/
-int ltdb_lock_read(struct ldb_module *module)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- int ret = 0;
-
- if (ltdb->in_transaction == 0 &&
- ltdb->read_lock_count == 0) {
- ret = tdb_lockall_read(ltdb->tdb);
- }
- if (ret == 0) {
- ltdb->read_lock_count++;
- }
- return ret;
-}
-
-/*
- unlock the database after a ltdb_lock_read()
-*/
-int ltdb_unlock_read(struct ldb_module *module)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- if (ltdb->in_transaction == 0 && ltdb->read_lock_count == 1) {
- tdb_unlockall_read(ltdb->tdb);
- return 0;
- }
- ltdb->read_lock_count--;
- return 0;
-}
-
-
-/*
- form a TDB_DATA for a record key
- caller frees
-
- note that the key for a record can depend on whether the
- dn refers to a case sensitive index record or not
-*/
-TDB_DATA ltdb_key(struct ldb_module *module, struct ldb_dn *dn)
-{
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- TDB_DATA key;
- char *key_str = NULL;
- const char *dn_folded = NULL;
-
- /*
- most DNs are case insensitive. The exception is index DNs for
- case sensitive attributes
-
- there are 3 cases dealt with in this code:
-
- 1) if the dn doesn't start with @ then uppercase the attribute
- names and the attributes values of case insensitive attributes
- 2) if the dn starts with @ then leave it alone -
- the indexing code handles the rest
- */
-
- dn_folded = ldb_dn_get_casefold(dn);
- if (!dn_folded) {
- goto failed;
- }
-
- key_str = talloc_strdup(ldb, "DN=");
- if (!key_str) {
- goto failed;
- }
-
- key_str = talloc_strdup_append_buffer(key_str, dn_folded);
- if (!key_str) {
- goto failed;
- }
-
- key.dptr = (uint8_t *)key_str;
- key.dsize = strlen(key_str) + 1;
-
- return key;
-
-failed:
- errno = ENOMEM;
- key.dptr = NULL;
- key.dsize = 0;
- return key;
-}
-
-/*
- check special dn's have valid attributes
- currently only @ATTRIBUTES is checked
-*/
-static int ltdb_check_special_dn(struct ldb_module *module,
- const struct ldb_message *msg)
-{
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- unsigned int i, j;
-
- if (! ldb_dn_is_special(msg->dn) ||
- ! ldb_dn_check_special(msg->dn, LTDB_ATTRIBUTES)) {
- return LDB_SUCCESS;
- }
-
- /* we have @ATTRIBUTES, let's check attributes are fine */
- /* should we check that we deny multivalued attributes ? */
- for (i = 0; i < msg->num_elements; i++) {
- if (ldb_attr_cmp(msg->elements[i].name, "distinguishedName") == 0) continue;
-
- for (j = 0; j < msg->elements[i].num_values; j++) {
- if (ltdb_check_at_attributes_values(&msg->elements[i].values[j]) != 0) {
- ldb_set_errstring(ldb, "Invalid attribute value in an @ATTRIBUTES entry");
- return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX;
- }
- }
- }
-
- return LDB_SUCCESS;
-}
-
-
-/*
- we've made a modification to a dn - possibly reindex and
- update sequence number
-*/
-static int ltdb_modified(struct ldb_module *module, struct ldb_dn *dn)
-{
- int ret = LDB_SUCCESS;
- struct ltdb_private *ltdb = talloc_get_type(ldb_module_get_private(module), struct ltdb_private);
-
- /* only allow modifies inside a transaction, otherwise the
- * ldb is unsafe */
- if (ltdb->in_transaction == 0) {
- ldb_set_errstring(ldb_module_get_ctx(module), "ltdb modify without transaction");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (ldb_dn_is_special(dn) &&
- (ldb_dn_check_special(dn, LTDB_INDEXLIST) ||
- ldb_dn_check_special(dn, LTDB_ATTRIBUTES)) ) {
- ret = ltdb_reindex(module);
- }
-
- /* If the modify was to a normal record, or any special except @BASEINFO, update the seq number */
- if (ret == LDB_SUCCESS &&
- !(ldb_dn_is_special(dn) &&
- ldb_dn_check_special(dn, LTDB_BASEINFO)) ) {
- ret = ltdb_increase_sequence_number(module);
- }
-
- /* If the modify was to @OPTIONS, reload the cache */
- if (ret == LDB_SUCCESS &&
- ldb_dn_is_special(dn) &&
- (ldb_dn_check_special(dn, LTDB_OPTIONS)) ) {
- ret = ltdb_cache_reload(module);
- }
-
- return ret;
-}
-
-/*
- store a record into the db
-*/
-int ltdb_store(struct ldb_module *module, const struct ldb_message *msg, int flgs)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- TDB_DATA tdb_key, tdb_data;
- int ret = LDB_SUCCESS;
-
- tdb_key = ltdb_key(module, msg->dn);
- if (tdb_key.dptr == NULL) {
- return LDB_ERR_OTHER;
- }
-
- ret = ltdb_pack_data(module, msg, &tdb_data);
- if (ret == -1) {
- talloc_free(tdb_key.dptr);
- return LDB_ERR_OTHER;
- }
-
- ret = tdb_store(ltdb->tdb, tdb_key, tdb_data, flgs);
- if (ret != 0) {
- ret = ltdb_err_map(tdb_error(ltdb->tdb));
- goto done;
- }
-
-done:
- talloc_free(tdb_key.dptr);
- talloc_free(tdb_data.dptr);
-
- return ret;
-}
-
-
-/*
- check if a attribute is a single valued, for a given element
- */
-static bool ldb_tdb_single_valued(const struct ldb_schema_attribute *a,
- struct ldb_message_element *el)
-{
- if (!a) return false;
- if (el != NULL) {
- if (el->flags & LDB_FLAG_INTERNAL_FORCE_SINGLE_VALUE_CHECK) {
- /* override from a ldb module, for example
- used for the description field, which is
- marked multi-valued in the schema but which
- should not actually accept multiple
- values */
- return true;
- }
- if (el->flags & LDB_FLAG_INTERNAL_DISABLE_SINGLE_VALUE_CHECK) {
- /* override from a ldb module, for example used for
- deleted linked attribute entries */
- return false;
- }
- }
- if (a->flags & LDB_ATTR_FLAG_SINGLE_VALUE) {
- return true;
- }
- return false;
-}
-
-static int ltdb_add_internal(struct ldb_module *module,
- const struct ldb_message *msg)
-{
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- int ret = LDB_SUCCESS;
- unsigned int i;
-
- for (i=0;i<msg->num_elements;i++) {
- struct ldb_message_element *el = &msg->elements[i];
- const struct ldb_schema_attribute *a = ldb_schema_attribute_by_name(ldb, el->name);
-
- if (el->num_values == 0) {
- ldb_asprintf_errstring(ldb, "attribute '%s' on '%s' specified, but with 0 values (illegal)",
- el->name, ldb_dn_get_linearized(msg->dn));
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
- if (el->num_values > 1 && ldb_tdb_single_valued(a, el)) {
- ldb_asprintf_errstring(ldb, "SINGLE-VALUE attribute %s on %s specified more than once",
- el->name, ldb_dn_get_linearized(msg->dn));
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
- }
-
- ret = ltdb_store(module, msg, TDB_INSERT);
- if (ret != LDB_SUCCESS) {
- if (ret == LDB_ERR_ENTRY_ALREADY_EXISTS) {
- ldb_asprintf_errstring(ldb,
- "Entry %s already exists",
- ldb_dn_get_linearized(msg->dn));
- }
- return ret;
- }
-
- ret = ltdb_index_add_new(module, msg);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ltdb_modified(module, msg->dn);
-
- return ret;
-}
-
-/*
- add a record to the database
-*/
-static int ltdb_add(struct ltdb_context *ctx)
-{
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- int ret = LDB_SUCCESS;
-
- ret = ltdb_check_special_dn(module, req->op.add.message);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- if (ltdb_cache_load(module) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_add_internal(module, req->op.add.message);
-
- return ret;
-}
-
-/*
- delete a record from the database, not updating indexes (used for deleting
- index records)
-*/
-int ltdb_delete_noindex(struct ldb_module *module, struct ldb_dn *dn)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- TDB_DATA tdb_key;
- int ret;
-
- tdb_key = ltdb_key(module, dn);
- if (!tdb_key.dptr) {
- return LDB_ERR_OTHER;
- }
-
- ret = tdb_delete(ltdb->tdb, tdb_key);
- talloc_free(tdb_key.dptr);
-
- if (ret != 0) {
- ret = ltdb_err_map(tdb_error(ltdb->tdb));
- }
-
- return ret;
-}
-
-static int ltdb_delete_internal(struct ldb_module *module, struct ldb_dn *dn)
-{
- struct ldb_message *msg;
- int ret = LDB_SUCCESS;
-
- msg = ldb_msg_new(module);
- if (msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* in case any attribute of the message was indexed, we need
- to fetch the old record */
- ret = ltdb_search_dn1(module, dn, msg);
- if (ret != LDB_SUCCESS) {
- /* not finding the old record is an error */
- goto done;
- }
-
- ret = ltdb_delete_noindex(module, dn);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
-
- /* remove any indexed attributes */
- ret = ltdb_index_delete(module, msg);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
-
- ret = ltdb_modified(module, dn);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
-
-done:
- talloc_free(msg);
- return ret;
-}
-
-/*
- delete a record from the database
-*/
-static int ltdb_delete(struct ltdb_context *ctx)
-{
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- int ret = LDB_SUCCESS;
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- if (ltdb_cache_load(module) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_delete_internal(module, req->op.del.dn);
-
- return ret;
-}
-
-/*
- find an element by attribute name. At the moment this does a linear search,
- it should be re-coded to use a binary search once all places that modify
- records guarantee sorted order
-
- return the index of the first matching element if found, otherwise -1
-*/
-static int find_element(const struct ldb_message *msg, const char *name)
-{
- unsigned int i;
- for (i=0;i<msg->num_elements;i++) {
- if (ldb_attr_cmp(msg->elements[i].name, name) == 0) {
- return i;
- }
- }
- return -1;
-}
-
-
-/*
- add an element to an existing record. Assumes a elements array that we
- can call re-alloc on, and assumed that we can re-use the data pointers from
- the passed in additional values. Use with care!
-
- returns 0 on success, -1 on failure (and sets errno)
-*/
-static int ltdb_msg_add_element(struct ldb_context *ldb,
- struct ldb_message *msg,
- struct ldb_message_element *el)
-{
- struct ldb_message_element *e2;
- unsigned int i;
-
- if (el->num_values == 0) {
- /* nothing to do here - we don't add empty elements */
- return 0;
- }
-
- e2 = talloc_realloc(msg, msg->elements, struct ldb_message_element,
- msg->num_elements+1);
- if (!e2) {
- errno = ENOMEM;
- return -1;
- }
-
- msg->elements = e2;
-
- e2 = &msg->elements[msg->num_elements];
-
- e2->name = el->name;
- e2->flags = el->flags;
- e2->values = talloc_array(msg->elements,
- struct ldb_val, el->num_values);
- if (!e2->values) {
- errno = ENOMEM;
- return -1;
- }
- for (i=0;i<el->num_values;i++) {
- e2->values[i] = el->values[i];
- }
- e2->num_values = el->num_values;
-
- ++msg->num_elements;
-
- return 0;
-}
-
-/*
- delete all elements having a specified attribute name
-*/
-static int msg_delete_attribute(struct ldb_module *module,
- struct ldb_context *ldb,
- struct ldb_message *msg, const char *name)
-{
- unsigned int i;
- int ret;
- struct ldb_message_element *el;
-
- el = ldb_msg_find_element(msg, name);
- if (el == NULL) {
- return LDB_ERR_NO_SUCH_ATTRIBUTE;
- }
- i = el - msg->elements;
-
- ret = ltdb_index_del_element(module, msg->dn, el);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- talloc_free(el->values);
- if (msg->num_elements > (i+1)) {
- memmove(el, el+1, sizeof(*el) * (msg->num_elements - (i+1)));
- }
- msg->num_elements--;
- msg->elements = talloc_realloc(msg, msg->elements,
- struct ldb_message_element,
- msg->num_elements);
- return LDB_SUCCESS;
-}
-
-/*
- delete all elements matching an attribute name/value
-
- return LDB Error on failure
-*/
-static int msg_delete_element(struct ldb_module *module,
- struct ldb_message *msg,
- const char *name,
- const struct ldb_val *val)
-{
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- unsigned int i;
- int found, ret;
- struct ldb_message_element *el;
- const struct ldb_schema_attribute *a;
-
- found = find_element(msg, name);
- if (found == -1) {
- return LDB_ERR_NO_SUCH_ATTRIBUTE;
- }
-
- i = (unsigned int) found;
- el = &(msg->elements[i]);
-
- a = ldb_schema_attribute_by_name(ldb, el->name);
-
- for (i=0;i<el->num_values;i++) {
- bool matched;
- if (a->syntax->operator_fn) {
- ret = a->syntax->operator_fn(ldb, LDB_OP_EQUALITY, a,
- &el->values[i], val, &matched);
- if (ret != LDB_SUCCESS) return ret;
- } else {
- matched = (a->syntax->comparison_fn(ldb, ldb,
- &el->values[i], val) == 0);
- }
- if (matched) {
- if (el->num_values == 1) {
- return msg_delete_attribute(module, ldb, msg, name);
- }
-
- ret = ltdb_index_del_value(module, msg->dn, el, i);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- if (i<el->num_values-1) {
- memmove(&el->values[i], &el->values[i+1],
- sizeof(el->values[i])*
- (el->num_values-(i+1)));
- }
- el->num_values--;
-
- /* per definition we find in a canonicalised message an
- attribute value only once. So we are finished here */
- return LDB_SUCCESS;
- }
- }
-
- /* Not found */
- return LDB_ERR_NO_SUCH_ATTRIBUTE;
-}
-
-
-/*
- modify a record - internal interface
-
- yuck - this is O(n^2). Luckily n is usually small so we probably
- get away with it, but if we ever have really large attribute lists
- then we'll need to look at this again
-
- 'req' is optional, and is used to specify controls if supplied
-*/
-int ltdb_modify_internal(struct ldb_module *module,
- const struct ldb_message *msg,
- struct ldb_request *req)
-{
- struct ldb_context *ldb = ldb_module_get_ctx(module);
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- TDB_DATA tdb_key, tdb_data;
- struct ldb_message *msg2;
- unsigned int i, j, k;
- int ret = LDB_SUCCESS, idx;
- struct ldb_control *control_permissive = NULL;
-
- if (req) {
- control_permissive = ldb_request_get_control(req,
- LDB_CONTROL_PERMISSIVE_MODIFY_OID);
- }
-
- tdb_key = ltdb_key(module, msg->dn);
- if (!tdb_key.dptr) {
- return LDB_ERR_OTHER;
- }
-
- tdb_data = tdb_fetch_compat(ltdb->tdb, tdb_key);
- if (!tdb_data.dptr) {
- talloc_free(tdb_key.dptr);
- return ltdb_err_map(tdb_error(ltdb->tdb));
- }
-
- msg2 = ldb_msg_new(tdb_key.dptr);
- if (msg2 == NULL) {
- free(tdb_data.dptr);
- ret = LDB_ERR_OTHER;
- goto done;
- }
-
- ret = ltdb_unpack_data(module, &tdb_data, msg2);
- free(tdb_data.dptr);
- if (ret == -1) {
- ret = LDB_ERR_OTHER;
- goto done;
- }
-
- if (!msg2->dn) {
- msg2->dn = msg->dn;
- }
-
- for (i=0; i<msg->num_elements; i++) {
- struct ldb_message_element *el = &msg->elements[i], *el2;
- struct ldb_val *vals;
- const struct ldb_schema_attribute *a = ldb_schema_attribute_by_name(ldb, el->name);
- const char *dn;
-
- switch (msg->elements[i].flags & LDB_FLAG_MOD_MASK) {
- case LDB_FLAG_MOD_ADD:
-
- if (el->num_values == 0) {
- ldb_asprintf_errstring(ldb,
- "attribute '%s': attribute on '%s' specified, but with 0 values (illegal)",
- el->name, ldb_dn_get_linearized(msg2->dn));
- ret = LDB_ERR_CONSTRAINT_VIOLATION;
- goto done;
- }
-
- /* make a copy of the array so that a permissive
- * control can remove duplicates without changing the
- * original values, but do not copy data as we do not
- * need to keep it around once the operation is
- * finished */
- if (control_permissive) {
- el = talloc(msg2, struct ldb_message_element);
- if (!el) {
- ret = LDB_ERR_OTHER;
- goto done;
- }
- *el = msg->elements[i];
- el->values = talloc_array(el, struct ldb_val, el->num_values);
- if (el->values == NULL) {
- ret = LDB_ERR_OTHER;
- goto done;
- }
- for (j = 0; j < el->num_values; j++) {
- el->values[j] = msg->elements[i].values[j];
- }
- }
-
- if (el->num_values > 1 && ldb_tdb_single_valued(a, el)) {
- ldb_asprintf_errstring(ldb, "SINGLE-VALUE attribute %s on %s specified more than once",
- el->name, ldb_dn_get_linearized(msg2->dn));
- ret = LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS;
- goto done;
- }
-
- /* Checks if element already exists */
- idx = find_element(msg2, el->name);
- if (idx == -1) {
- if (ltdb_msg_add_element(ldb, msg2, el) != 0) {
- ret = LDB_ERR_OTHER;
- goto done;
- }
- ret = ltdb_index_add_element(module, msg2->dn,
- el);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
- } else {
- j = (unsigned int) idx;
- el2 = &(msg2->elements[j]);
-
- /* We cannot add another value on a existing one
- if the attribute is single-valued */
- if (ldb_tdb_single_valued(a, el)) {
- ldb_asprintf_errstring(ldb, "SINGLE-VALUE attribute %s on %s specified more than once",
- el->name, ldb_dn_get_linearized(msg2->dn));
- ret = LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS;
- goto done;
- }
-
- /* Check that values don't exist yet on multi-
- valued attributes or aren't provided twice */
- for (j = 0; j < el->num_values; j++) {
- if (ldb_msg_find_val(el2, &el->values[j]) != NULL) {
- if (control_permissive) {
- /* remove this one as if it was never added */
- el->num_values--;
- for (k = j; k < el->num_values; k++) {
- el->values[k] = el->values[k + 1];
- }
- j--; /* rewind */
-
- continue;
- }
-
- ldb_asprintf_errstring(ldb,
- "attribute '%s': value #%u on '%s' already exists",
- el->name, j, ldb_dn_get_linearized(msg2->dn));
- ret = LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS;
- goto done;
- }
- if (ldb_msg_find_val(el, &el->values[j]) != &el->values[j]) {
- ldb_asprintf_errstring(ldb,
- "attribute '%s': value #%u on '%s' provided more than once",
- el->name, j, ldb_dn_get_linearized(msg2->dn));
- ret = LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS;
- goto done;
- }
- }
-
- /* Now combine existing and new values to a new
- attribute record */
- vals = talloc_realloc(msg2->elements,
- el2->values, struct ldb_val,
- el2->num_values + el->num_values);
- if (vals == NULL) {
- ldb_oom(ldb);
- ret = LDB_ERR_OTHER;
- goto done;
- }
-
- for (j=0; j<el->num_values; j++) {
- vals[el2->num_values + j] =
- ldb_val_dup(vals, &el->values[j]);
- }
-
- el2->values = vals;
- el2->num_values += el->num_values;
-
- ret = ltdb_index_add_element(module, msg2->dn, el);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
- }
-
- break;
-
- case LDB_FLAG_MOD_REPLACE:
-
- if (el->num_values > 1 && ldb_tdb_single_valued(a, el)) {
- ldb_asprintf_errstring(ldb, "SINGLE-VALUE attribute %s on %s specified more than once",
- el->name, ldb_dn_get_linearized(msg2->dn));
- ret = LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS;
- goto done;
- }
-
- /* TODO: This is O(n^2) - replace with more efficient check */
- for (j=0; j<el->num_values; j++) {
- if (ldb_msg_find_val(el, &el->values[j]) != &el->values[j]) {
- ldb_asprintf_errstring(ldb,
- "attribute '%s': value #%u on '%s' provided more than once",
- el->name, j, ldb_dn_get_linearized(msg2->dn));
- ret = LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS;
- goto done;
- }
- }
-
- /* Checks if element already exists */
- idx = find_element(msg2, el->name);
- if (idx != -1) {
- j = (unsigned int) idx;
- el2 = &(msg2->elements[j]);
- if (ldb_msg_element_compare(el, el2) == 0) {
- /* we are replacing with the same values */
- continue;
- }
-
- /* Delete the attribute if it exists in the DB */
- if (msg_delete_attribute(module, ldb, msg2,
- el->name) != 0) {
- ret = LDB_ERR_OTHER;
- goto done;
- }
- }
-
- /* Recreate it with the new values */
- if (ltdb_msg_add_element(ldb, msg2, el) != 0) {
- ret = LDB_ERR_OTHER;
- goto done;
- }
-
- ret = ltdb_index_add_element(module, msg2->dn, el);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
-
- break;
-
- case LDB_FLAG_MOD_DELETE:
- dn = ldb_dn_get_linearized(msg2->dn);
- if (dn == NULL) {
- ret = LDB_ERR_OTHER;
- goto done;
- }
-
- if (msg->elements[i].num_values == 0) {
- /* Delete the whole attribute */
- ret = msg_delete_attribute(module, ldb, msg2,
- msg->elements[i].name);
- if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE &&
- control_permissive) {
- ret = LDB_SUCCESS;
- } else {
- ldb_asprintf_errstring(ldb,
- "attribute '%s': no such attribute for delete on '%s'",
- msg->elements[i].name, dn);
- }
- if (ret != LDB_SUCCESS) {
- goto done;
- }
- } else {
- /* Delete specified values from an attribute */
- for (j=0; j < msg->elements[i].num_values; j++) {
- ret = msg_delete_element(module,
- msg2,
- msg->elements[i].name,
- &msg->elements[i].values[j]);
- if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE &&
- control_permissive) {
- ret = LDB_SUCCESS;
- } else {
- ldb_asprintf_errstring(ldb,
- "attribute '%s': no matching attribute value while deleting attribute on '%s'",
- msg->elements[i].name, dn);
- }
- if (ret != LDB_SUCCESS) {
- goto done;
- }
- }
- }
- break;
- default:
- ldb_asprintf_errstring(ldb,
- "attribute '%s': invalid modify flags on '%s': 0x%x",
- msg->elements[i].name, ldb_dn_get_linearized(msg->dn),
- msg->elements[i].flags & LDB_FLAG_MOD_MASK);
- ret = LDB_ERR_PROTOCOL_ERROR;
- goto done;
- }
- }
-
- ret = ltdb_store(module, msg2, TDB_MODIFY);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
-
- ret = ltdb_modified(module, msg2->dn);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
-
-done:
- talloc_free(tdb_key.dptr);
- return ret;
-}
-
-/*
- modify a record
-*/
-static int ltdb_modify(struct ltdb_context *ctx)
-{
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- int ret = LDB_SUCCESS;
-
- ret = ltdb_check_special_dn(module, req->op.mod.message);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- if (ltdb_cache_load(module) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_modify_internal(module, req->op.mod.message, req);
-
- return ret;
-}
-
-/*
- rename a record
-*/
-static int ltdb_rename(struct ltdb_context *ctx)
-{
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- struct ldb_message *msg;
- int ret = LDB_SUCCESS;
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- if (ltdb_cache_load(ctx->module) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- msg = ldb_msg_new(ctx);
- if (msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* in case any attribute of the message was indexed, we need
- to fetch the old record */
- ret = ltdb_search_dn1(module, req->op.rename.olddn, msg);
- if (ret != LDB_SUCCESS) {
- /* not finding the old record is an error */
- return ret;
- }
-
- /* Always delete first then add, to avoid conflicts with
- * unique indexes. We rely on the transaction to make this
- * atomic
- */
- ret = ltdb_delete_internal(module, msg->dn);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- msg->dn = ldb_dn_copy(msg, req->op.rename.newdn);
- if (msg->dn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ltdb_add_internal(module, msg);
-
- return ret;
-}
-
-static int ltdb_start_trans(struct ldb_module *module)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
-
- if (tdb_transaction_start(ltdb->tdb) != 0) {
- return ltdb_err_map(tdb_error(ltdb->tdb));
- }
-
- ltdb->in_transaction++;
-
- ltdb_index_transaction_start(module);
-
- return LDB_SUCCESS;
-}
-
-static int ltdb_prepare_commit(struct ldb_module *module)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
-
- if (ltdb->in_transaction != 1) {
- return LDB_SUCCESS;
- }
-
- if (ltdb_index_transaction_commit(module) != 0) {
- tdb_transaction_cancel(ltdb->tdb);
- ltdb->in_transaction--;
- return ltdb_err_map(tdb_error(ltdb->tdb));
- }
-
- if (tdb_transaction_prepare_commit(ltdb->tdb) != 0) {
- ltdb->in_transaction--;
- return ltdb_err_map(tdb_error(ltdb->tdb));
- }
-
- ltdb->prepared_commit = true;
-
- return LDB_SUCCESS;
-}
-
-static int ltdb_end_trans(struct ldb_module *module)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
-
- if (!ltdb->prepared_commit) {
- int ret = ltdb_prepare_commit(module);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- ltdb->in_transaction--;
- ltdb->prepared_commit = false;
-
- if (tdb_transaction_commit(ltdb->tdb) != 0) {
- return ltdb_err_map(tdb_error(ltdb->tdb));
- }
-
- return LDB_SUCCESS;
-}
-
-static int ltdb_del_trans(struct ldb_module *module)
-{
- void *data = ldb_module_get_private(module);
- struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
-
- ltdb->in_transaction--;
-
- if (ltdb_index_transaction_cancel(module) != 0) {
- tdb_transaction_cancel(ltdb->tdb);
- return ltdb_err_map(tdb_error(ltdb->tdb));
- }
-
- tdb_transaction_cancel(ltdb->tdb);
- return LDB_SUCCESS;
-}
-
-/*
- return sequenceNumber from @BASEINFO
-*/
-static int ltdb_sequence_number(struct ltdb_context *ctx,
- struct ldb_extended **ext)
-{
- struct ldb_context *ldb;
- struct ldb_module *module = ctx->module;
- struct ldb_request *req = ctx->req;
- TALLOC_CTX *tmp_ctx = NULL;
- struct ldb_seqnum_request *seq;
- struct ldb_seqnum_result *res;
- struct ldb_message *msg = NULL;
- struct ldb_dn *dn;
- const char *date;
- int ret = LDB_SUCCESS;
-
- ldb = ldb_module_get_ctx(module);
-
- seq = talloc_get_type(req->op.extended.data,
- struct ldb_seqnum_request);
- if (seq == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ldb_request_set_state(req, LDB_ASYNC_PENDING);
-
- if (ltdb_lock_read(module) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- res = talloc_zero(req, struct ldb_seqnum_result);
- if (res == NULL) {
- ret = LDB_ERR_OPERATIONS_ERROR;
- goto done;
- }
-
- tmp_ctx = talloc_new(req);
- if (tmp_ctx == NULL) {
- ret = LDB_ERR_OPERATIONS_ERROR;
- goto done;
- }
-
- dn = ldb_dn_new(tmp_ctx, ldb, LTDB_BASEINFO);
- if (dn == NULL) {
- ret = LDB_ERR_OPERATIONS_ERROR;
- goto done;
- }
-
- msg = ldb_msg_new(tmp_ctx);
- if (msg == NULL) {
- ret = LDB_ERR_OPERATIONS_ERROR;
- goto done;
- }
-
- ret = ltdb_search_dn1(module, dn, msg);
- if (ret != LDB_SUCCESS) {
- goto done;
- }
-
- switch (seq->type) {
- case LDB_SEQ_HIGHEST_SEQ:
- res->seq_num = ldb_msg_find_attr_as_uint64(msg, LTDB_SEQUENCE_NUMBER, 0);
- break;
- case LDB_SEQ_NEXT:
- res->seq_num = ldb_msg_find_attr_as_uint64(msg, LTDB_SEQUENCE_NUMBER, 0);
- res->seq_num++;
- break;
- case LDB_SEQ_HIGHEST_TIMESTAMP:
- date = ldb_msg_find_attr_as_string(msg, LTDB_MOD_TIMESTAMP, NULL);
- if (date) {
- res->seq_num = ldb_string_to_time(date);
- } else {
- res->seq_num = 0;
- /* zero is as good as anything when we don't know */
- }
- break;
- }
-
- *ext = talloc_zero(req, struct ldb_extended);
- if (*ext == NULL) {
- ret = LDB_ERR_OPERATIONS_ERROR;
- goto done;
- }
- (*ext)->oid = LDB_EXTENDED_SEQUENCE_NUMBER;
- (*ext)->data = talloc_steal(*ext, res);
-
-done:
- talloc_free(tmp_ctx);
- ltdb_unlock_read(module);
- return ret;
-}
-
-static void ltdb_request_done(struct ltdb_context *ctx, int error)
-{
- struct ldb_context *ldb;
- struct ldb_request *req;
- struct ldb_reply *ares;
-
- ldb = ldb_module_get_ctx(ctx->module);
- req = ctx->req;
-
- /* if we already returned an error just return */
- if (ldb_request_get_status(req) != LDB_SUCCESS) {
- return;
- }
-
- ares = talloc_zero(req, struct ldb_reply);
- if (!ares) {
- ldb_oom(ldb);
- req->callback(req, NULL);
- return;
- }
- ares->type = LDB_REPLY_DONE;
- ares->error = error;
-
- req->callback(req, ares);
-}
-
-static void ltdb_timeout(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval t,
- void *private_data)
-{
- struct ltdb_context *ctx;
- ctx = talloc_get_type(private_data, struct ltdb_context);
-
- if (!ctx->request_terminated) {
- /* request is done now */
- ltdb_request_done(ctx, LDB_ERR_TIME_LIMIT_EXCEEDED);
- }
-
- if (!ctx->request_terminated) {
- /* neutralize the spy */
- ctx->spy->ctx = NULL;
- }
- talloc_free(ctx);
-}
-
-static void ltdb_request_extended_done(struct ltdb_context *ctx,
- struct ldb_extended *ext,
- int error)
-{
- struct ldb_context *ldb;
- struct ldb_request *req;
- struct ldb_reply *ares;
-
- ldb = ldb_module_get_ctx(ctx->module);
- req = ctx->req;
-
- /* if we already returned an error just return */
- if (ldb_request_get_status(req) != LDB_SUCCESS) {
- return;
- }
-
- ares = talloc_zero(req, struct ldb_reply);
- if (!ares) {
- ldb_oom(ldb);
- req->callback(req, NULL);
- return;
- }
- ares->type = LDB_REPLY_DONE;
- ares->response = ext;
- ares->error = error;
-
- req->callback(req, ares);
-}
-
-static void ltdb_handle_extended(struct ltdb_context *ctx)
-{
- struct ldb_extended *ext = NULL;
- int ret;
-
- if (strcmp(ctx->req->op.extended.oid,
- LDB_EXTENDED_SEQUENCE_NUMBER) == 0) {
- /* get sequence number */
- ret = ltdb_sequence_number(ctx, &ext);
- } else {
- /* not recognized */
- ret = LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION;
- }
-
- ltdb_request_extended_done(ctx, ext, ret);
-}
-
-static void ltdb_callback(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval t,
- void *private_data)
-{
- struct ltdb_context *ctx;
- int ret;
-
- ctx = talloc_get_type(private_data, struct ltdb_context);
-
- if (ctx->request_terminated) {
- goto done;
- }
-
- switch (ctx->req->operation) {
- case LDB_SEARCH:
- ret = ltdb_search(ctx);
- break;
- case LDB_ADD:
- ret = ltdb_add(ctx);
- break;
- case LDB_MODIFY:
- ret = ltdb_modify(ctx);
- break;
- case LDB_DELETE:
- ret = ltdb_delete(ctx);
- break;
- case LDB_RENAME:
- ret = ltdb_rename(ctx);
- break;
- case LDB_EXTENDED:
- ltdb_handle_extended(ctx);
- goto done;
- default:
- /* no other op supported */
- ret = LDB_ERR_PROTOCOL_ERROR;
- }
-
- if (!ctx->request_terminated) {
- /* request is done now */
- ltdb_request_done(ctx, ret);
- }
-
-done:
- if (!ctx->request_terminated) {
- /* neutralize the spy */
- ctx->spy->ctx = NULL;
- }
- talloc_free(ctx);
-}
-
-static int ltdb_request_destructor(void *ptr)
-{
- struct ltdb_req_spy *spy = talloc_get_type(ptr, struct ltdb_req_spy);
-
- if (spy->ctx != NULL) {
- spy->ctx->request_terminated = true;
- }
-
- return 0;
-}
-
-static int ltdb_handle_request(struct ldb_module *module,
- struct ldb_request *req)
-{
- struct ldb_control *control_permissive;
- struct ldb_context *ldb;
- struct tevent_context *ev;
- struct ltdb_context *ac;
- struct tevent_timer *te;
- struct timeval tv;
- unsigned int i;
-
- ldb = ldb_module_get_ctx(module);
-
- control_permissive = ldb_request_get_control(req,
- LDB_CONTROL_PERMISSIVE_MODIFY_OID);
-
- for (i = 0; req->controls && req->controls[i]; i++) {
- if (req->controls[i]->critical &&
- req->controls[i] != control_permissive) {
- ldb_asprintf_errstring(ldb, "Unsupported critical extension %s",
- req->controls[i]->oid);
- return LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION;
- }
- }
-
- if (req->starttime == 0 || req->timeout == 0) {
- ldb_set_errstring(ldb, "Invalid timeout settings");
- return LDB_ERR_TIME_LIMIT_EXCEEDED;
- }
-
- ev = ldb_get_event_context(ldb);
-
- ac = talloc_zero(ldb, struct ltdb_context);
- if (ac == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->module = module;
- ac->req = req;
-
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- te = tevent_add_timer(ev, ac, tv, ltdb_callback, ac);
- if (NULL == te) {
- talloc_free(ac);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- tv.tv_sec = req->starttime + req->timeout;
- ac->timeout_event = tevent_add_timer(ev, ac, tv, ltdb_timeout, ac);
- if (NULL == ac->timeout_event) {
- talloc_free(ac);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* set a spy so that we do not try to use the request context
- * if it is freed before ltdb_callback fires */
- ac->spy = talloc(req, struct ltdb_req_spy);
- if (NULL == ac->spy) {
- talloc_free(ac);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ac->spy->ctx = ac;
-
- talloc_set_destructor((TALLOC_CTX *)ac->spy, ltdb_request_destructor);
-
- return LDB_SUCCESS;
-}
-
-static int ltdb_init_rootdse(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- ret = ldb_mod_register_control(module,
- LDB_CONTROL_PERMISSIVE_MODIFY_OID);
- /* ignore errors on this - we expect it for non-sam databases */
-
- /* there can be no module beyond the backend, just return */
- return LDB_SUCCESS;
-}
-
-static const struct ldb_module_ops ltdb_ops = {
- .name = "tdb",
- .init_context = ltdb_init_rootdse,
- .search = ltdb_handle_request,
- .add = ltdb_handle_request,
- .modify = ltdb_handle_request,
- .del = ltdb_handle_request,
- .rename = ltdb_handle_request,
- .extended = ltdb_handle_request,
- .start_transaction = ltdb_start_trans,
- .end_transaction = ltdb_end_trans,
- .prepare_commit = ltdb_prepare_commit,
- .del_transaction = ltdb_del_trans,
-};
-
-/*
- connect to the database
-*/
-static int ltdb_connect(struct ldb_context *ldb, const char *url,
- unsigned int flags, const char *options[],
- struct ldb_module **_module)
-{
- struct ldb_module *module;
- const char *path;
- int tdb_flags, open_flags;
- struct ltdb_private *ltdb;
-
- /* parse the url */
- if (strchr(url, ':')) {
- if (strncmp(url, "tdb://", 6) != 0) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Invalid tdb URL '%s'", url);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- path = url+6;
- } else {
- path = url;
- }
-
- tdb_flags = TDB_DEFAULT | TDB_SEQNUM;
-
- /* check for the 'nosync' option */
- if (flags & LDB_FLG_NOSYNC) {
- tdb_flags |= TDB_NOSYNC;
- }
-
- /* and nommap option */
- if (flags & LDB_FLG_NOMMAP) {
- tdb_flags |= TDB_NOMMAP;
- }
-
- if (flags & LDB_FLG_RDONLY) {
- open_flags = O_RDONLY;
- } else {
- open_flags = O_CREAT | O_RDWR;
- }
-
- ltdb = talloc_zero(ldb, struct ltdb_private);
- if (!ltdb) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* note that we use quite a large default hash size */
- ltdb->tdb = ltdb_wrap_open(ltdb, path, 10000,
- tdb_flags, open_flags,
- ldb_get_create_perms(ldb), ldb);
- if (!ltdb->tdb) {
- ldb_debug(ldb, LDB_DEBUG_ERROR,
- "Unable to open tdb '%s'", path);
- talloc_free(ltdb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (getenv("LDB_WARN_UNINDEXED")) {
- ltdb->warn_unindexed = true;
- }
-
- ltdb->sequence_number = 0;
-
- module = ldb_module_new(ldb, ldb, "ldb_tdb backend", &ltdb_ops);
- if (!module) {
- talloc_free(ltdb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ldb_module_set_private(module, ltdb);
- talloc_steal(module, ltdb);
-
- if (ltdb_cache_load(module) != 0) {
- talloc_free(module);
- talloc_free(ltdb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- *_module = module;
- return LDB_SUCCESS;
-}
-
-int ldb_tdb_init(const char *version)
-{
- LDB_MODULE_CHECK_VERSION(version);
- return ldb_register_backend("tdb", ltdb_connect, false);
-}
diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.h b/source4/lib/ldb/ldb_tdb/ldb_tdb.h
deleted file mode 100644
index 96ad43fbd6..0000000000
--- a/source4/lib/ldb/ldb_tdb/ldb_tdb.h
+++ /dev/null
@@ -1,139 +0,0 @@
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "tdb_compat.h"
-#include "ldb_module.h"
-
-/* this private structure is used by the ltdb backend in the
- ldb_context */
-struct ltdb_private {
- TDB_CONTEXT *tdb;
- unsigned int connect_flags;
-
- unsigned long long sequence_number;
-
- /* the low level tdb seqnum - used to avoid loading BASEINFO when
- possible */
- int tdb_seqnum;
-
- struct ltdb_cache {
- struct ldb_message *indexlist;
- struct ldb_message *attributes;
- bool one_level_indexes;
- bool attribute_indexes;
- } *cache;
-
- int in_transaction;
-
- bool check_base;
- struct ltdb_idxptr *idxptr;
- bool prepared_commit;
- int read_lock_count;
-
- bool warn_unindexed;
-};
-
-/*
- the async local context
- holds also internal search state during a full db search
-*/
-struct ltdb_req_spy {
- struct ltdb_context *ctx;
-};
-
-struct ltdb_context {
- struct ldb_module *module;
- struct ldb_request *req;
-
- bool request_terminated;
- struct ltdb_req_spy *spy;
-
- /* search stuff */
- const struct ldb_parse_tree *tree;
- struct ldb_dn *base;
- enum ldb_scope scope;
- const char * const *attrs;
- struct tevent_timer *timeout_event;
-};
-
-/* special record types */
-#define LTDB_INDEX "@INDEX"
-#define LTDB_INDEXLIST "@INDEXLIST"
-#define LTDB_IDX "@IDX"
-#define LTDB_IDXVERSION "@IDXVERSION"
-#define LTDB_IDXATTR "@IDXATTR"
-#define LTDB_IDXONE "@IDXONE"
-#define LTDB_BASEINFO "@BASEINFO"
-#define LTDB_OPTIONS "@OPTIONS"
-#define LTDB_ATTRIBUTES "@ATTRIBUTES"
-
-/* special attribute types */
-#define LTDB_SEQUENCE_NUMBER "sequenceNumber"
-#define LTDB_CHECK_BASE "checkBaseOnSearch"
-#define LTDB_MOD_TIMESTAMP "whenChanged"
-#define LTDB_OBJECTCLASS "objectClass"
-
-/* The following definitions come from lib/ldb/ldb_tdb/ldb_cache.c */
-
-int ltdb_cache_reload(struct ldb_module *module);
-int ltdb_cache_load(struct ldb_module *module);
-int ltdb_increase_sequence_number(struct ldb_module *module);
-int ltdb_check_at_attributes_values(const struct ldb_val *value);
-
-/* The following definitions come from lib/ldb/ldb_tdb/ldb_index.c */
-
-struct ldb_parse_tree;
-
-int ltdb_search_indexed(struct ltdb_context *ctx, uint32_t *);
-int ltdb_index_add_new(struct ldb_module *module, const struct ldb_message *msg);
-int ltdb_index_delete(struct ldb_module *module, const struct ldb_message *msg);
-int ltdb_index_del_element(struct ldb_module *module, struct ldb_dn *dn,
- struct ldb_message_element *el);
-int ltdb_index_add_element(struct ldb_module *module, struct ldb_dn *dn,
- struct ldb_message_element *el);
-int ltdb_index_del_value(struct ldb_module *module, struct ldb_dn *dn,
- struct ldb_message_element *el, unsigned int v_idx);
-int ltdb_reindex(struct ldb_module *module);
-int ltdb_index_transaction_start(struct ldb_module *module);
-int ltdb_index_transaction_commit(struct ldb_module *module);
-int ltdb_index_transaction_cancel(struct ldb_module *module);
-
-/* The following definitions come from lib/ldb/ldb_tdb/ldb_pack.c */
-
-int ltdb_pack_data(struct ldb_module *module,
- const struct ldb_message *message,
- TDB_DATA *data);
-void ltdb_unpack_data_free(struct ldb_module *module,
- struct ldb_message *message);
-int ltdb_unpack_data(struct ldb_module *module,
- const TDB_DATA *data,
- struct ldb_message *message);
-
-/* The following definitions come from lib/ldb/ldb_tdb/ldb_search.c */
-
-int ltdb_has_wildcard(struct ldb_module *module, const char *attr_name,
- const struct ldb_val *val);
-void ltdb_search_dn1_free(struct ldb_module *module, struct ldb_message *msg);
-int ltdb_search_dn1(struct ldb_module *module, struct ldb_dn *dn, struct ldb_message *msg);
-int ltdb_add_attr_results(struct ldb_module *module,
- TALLOC_CTX *mem_ctx,
- struct ldb_message *msg,
- const char * const attrs[],
- unsigned int *count,
- struct ldb_message ***res);
-int ltdb_filter_attrs(struct ldb_message *msg, const char * const *attrs);
-int ltdb_search(struct ltdb_context *ctx);
-
-/* The following definitions come from lib/ldb/ldb_tdb/ldb_tdb.c */
-int ltdb_lock_read(struct ldb_module *module);
-int ltdb_unlock_read(struct ldb_module *module);
-TDB_DATA ltdb_key(struct ldb_module *module, struct ldb_dn *dn);
-int ltdb_store(struct ldb_module *module, const struct ldb_message *msg, int flgs);
-int ltdb_modify_internal(struct ldb_module *module, const struct ldb_message *msg, struct ldb_request *req);
-int ltdb_delete_noindex(struct ldb_module *module, struct ldb_dn *dn);
-int ltdb_err_map(enum TDB_ERROR tdb_code);
-
-struct tdb_context *ltdb_wrap_open(TALLOC_CTX *mem_ctx,
- const char *path, int hash_size, int tdb_flags,
- int open_flags, mode_t mode,
- struct ldb_context *ldb);
diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c b/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c
deleted file mode 100644
index 16a037a6c3..0000000000
--- a/source4/lib/ldb/ldb_tdb/ldb_tdb_wrap.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "ldb_tdb.h"
-#include "dlinklist.h"
-
-/* FIXME: TDB2 does this internally, so no need to wrap multiple opens! */
-#if BUILD_TDB2
-static void ltdb_log_fn(struct tdb_context *tdb,
- enum tdb_log_level level,
- const char *message,
- struct ldb_context *ldb)
-{
- enum ldb_debug_level ldb_level;
- const char *name = tdb_name(tdb);
-
- switch (level) {
- case TDB_LOG_WARNING:
- ldb_level = LDB_DEBUG_WARNING;
- case TDB_LOG_USE_ERROR:
- case TDB_LOG_ERROR:
- ldb_level = LDB_DEBUG_FATAL;
- break;
- default:
- ldb_level = LDB_DEBUG_FATAL;
- }
-
- ldb_debug(ldb, ldb_level, "ltdb: tdb(%s): %s", name, message);
-}
-#else /* !TDB2 */
-static void ltdb_log_fn(struct tdb_context *tdb, enum tdb_debug_level level, const char *fmt, ...) PRINTF_ATTRIBUTE(3, 4);
-static void ltdb_log_fn(struct tdb_context *tdb, enum tdb_debug_level level, const char *fmt, ...)
-{
- va_list ap;
- const char *name = tdb_name(tdb);
- struct ldb_context *ldb = talloc_get_type(tdb_get_logging_private(tdb), struct ldb_context);
- enum ldb_debug_level ldb_level;
- char *message;
-
- if (ldb == NULL)
- return;
-
- va_start(ap, fmt);
- message = talloc_vasprintf(ldb, fmt, ap);
- va_end(ap);
-
- switch (level) {
- case TDB_DEBUG_FATAL:
- ldb_level = LDB_DEBUG_FATAL;
- break;
- case TDB_DEBUG_ERROR:
- ldb_level = LDB_DEBUG_ERROR;
- break;
- case TDB_DEBUG_WARNING:
- ldb_level = LDB_DEBUG_WARNING;
- break;
- case TDB_DEBUG_TRACE:
- ldb_level = LDB_DEBUG_TRACE;
- break;
- default:
- ldb_level = LDB_DEBUG_FATAL;
- }
-
- ldb_debug(ldb, ldb_level, "ltdb: tdb(%s): %s", name, message);
- talloc_free(message);
-}
-#endif
-
-/*
- the purpose of this code is to work around the braindead posix locking
- rules, to allow us to have a ldb open more than once while allowing
- locking to work
-
- TDB2 handles multiple opens, so we don't have this problem there.
-*/
-
-struct ltdb_wrap {
- struct ltdb_wrap *next, *prev;
- struct tdb_context *tdb;
- dev_t device;
- ino_t inode;
-};
-
-static struct ltdb_wrap *tdb_list;
-
-/* destroy the last connection to a tdb */
-static int ltdb_wrap_destructor(struct ltdb_wrap *w)
-{
- tdb_close(w->tdb);
- DLIST_REMOVE(tdb_list, w);
- return 0;
-}
-
-/*
- wrapped connection to a tdb database. The caller should _not_ free
- this as it is not a talloc structure (as tdb does not use talloc
- yet). It will auto-close when the caller frees the mem_ctx that is
- passed to this call
- */
-struct tdb_context *ltdb_wrap_open(TALLOC_CTX *mem_ctx,
- const char *path, int hash_size,
- int tdb_flags,
- int open_flags, mode_t mode,
- struct ldb_context *ldb)
-{
- struct ltdb_wrap *w;
- struct stat st;
-
- if (stat(path, &st) == 0) {
- for (w=tdb_list;w;w=w->next) {
- if (st.st_dev == w->device && st.st_ino == w->inode) {
- if (!talloc_reference(mem_ctx, w)) {
- return NULL;
- }
- return w->tdb;
- }
- }
- }
-
- w = talloc(mem_ctx, struct ltdb_wrap);
- if (w == NULL) {
- return NULL;
- }
-
- w->tdb = tdb_open_compat(path, hash_size, tdb_flags, open_flags, mode, ltdb_log_fn, ldb);
- if (w->tdb == NULL) {
- talloc_free(w);
- return NULL;
- }
-
- if (fstat(tdb_fd(w->tdb), &st) != 0) {
- tdb_close(w->tdb);
- talloc_free(w);
- return NULL;
- }
-
- w->device = st.st_dev;
- w->inode = st.st_ino;
-
- talloc_set_destructor(w, ltdb_wrap_destructor);
-
- DLIST_ADD(tdb_list, w);
-
- return w->tdb;
-}
diff --git a/source4/lib/ldb/mainpage.dox b/source4/lib/ldb/mainpage.dox
deleted file mode 100644
index bbd8d9c502..0000000000
--- a/source4/lib/ldb/mainpage.dox
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
-
-\mainpage ldb
-
-\section Overview
-
-ldb is a LDAP-like embedded database. It is not at all LDAP standards
-compliant, so if you want a standards compliant database then please
-see the excellent <a href="http://www.openldap.org/">OpenLDAP</a>
-project.<p>
-
-What ldb does is provide a fast database with an LDAP-like API
-designed to be used within an application. In some ways it can be seen
-as a intermediate solution between key-value pair databases and a real
-LDAP database.<p>
-
-ldb is the database engine used in Samba4.
-
-\section Features
-
-The main features that separate ldb from other solutions are:
- - Safe multi-reader, multi-writer, using byte range locking
- - LDAP-like API
- - fast operation
- - choice of local tdb, local sqlite3 or remote LDAP backends
- - integration with <a href="http://talloc.samba.org">talloc</a>
- - schema-less operation, for trivial setup
- - modules for extensions (such as schema support)
- - easy setup of indexes and attribute properties
- - ldbedit tool for database editing (reminiscent of 'vipw')
- - ldif for import/export
-
-\section Documentation
-
-ldb has limited programmer and administrator documentation:
- - a list of <a href="globals_func.html">functions</a>
- - a list of <a href="examples.html">examples</a>
- - a list of <a href="annotated.html">data structures</a>
- - a list of <a href="globals_defs.html">constants</a>
-
-If you need more information than is presented in this document, you
-may wish to look at the source code, especially the source code in the
-<a href="http://samba.org/ftp/unpacked/samba4/source/lib/ldb/tools/">tools directory</a>.
-
-ldb makes use of the LDAP Data Interchange Format (LDIF), which is
-documented in <a href="http://www.ietf.org/rfc/rfc2849.txt">RFC
-2849</a>.
-
-\section Support
-
-ldb does not currently have its own mailing list or bug tracking
-system. For now, please use the <a
-href="https://lists.samba.org/mailman/listinfo/samba-technical">samba-technical</a>
-mailing list, and the <a href="http://bugzilla.samba.org/">Samba
-bugzilla</a> bug tracking system.
-
-\section Download
-
-You can download the latest release either via rsync or anonymous
-svn. To fetch via svn use the following commands:
-
-\verbatim
- svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/ldb ldb
- svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/tdb tdb
- svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/talloc talloc
-\endverbatim
-
-To fetch via rsync use these commands:
-
-\verbatim
- rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/ldb .
- rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/tdb .
- rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/talloc .
-\endverbatim
-
-\section Credits
-
-ldb is another product of the prolific <a href="http://samba.org/~tridge/">Andrew Tridgell</a>.
-
-*/
diff --git a/source4/lib/ldb/man/ldb.3.xml b/source4/lib/ldb/man/ldb.3.xml
deleted file mode 100644
index 19d9a89e10..0000000000
--- a/source4/lib/ldb/man/ldb.3.xml
+++ /dev/null
@@ -1,262 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<refentry id="ldb.3">
-
-<refmeta>
- <refentrytitle>ldb</refentrytitle>
- <manvolnum>3</manvolnum>
-</refmeta>
-
-<refnamediv>
- <refname>ldb</refname>
- <refclass>The Samba Project</refclass>
- <refpurpose>A light-weight database library</refpurpose>
-</refnamediv>
-
-<refsynopsisdiv>
- <synopsis>#include &lt;ldb.h&gt;</synopsis>
-</refsynopsisdiv>
-
-<refsect1>
- <title>description</title>
-
- <para>
-ldb is a light weight embedded database library and API. With a
-programming interface that is very similar to LDAP, ldb can store its
-data either in a tdb(3) database or in a real LDAP database.
- </para>
-
- <para>
-When used with the tdb backend ldb does not require any database
-daemon. Instead, ldb function calls are processed immediately by the
-ldb library, which does IO directly on the database, while allowing
-multiple readers/writers using operating system byte range locks. This
-leads to an API with very low overheads, often resulting in speeds of
-more than 10x what can be achieved with a more traditional LDAP
-architecture.
- </para>
-
- <para>
-In a taxonomy of databases ldb would sit half way between key/value
-pair databases (such as berkley db or tdb) and a full LDAP
-database. With a structured attribute oriented API like LDAP and good
-indexing capabilities, ldb can be used for quite sophisticated
-applications that need a light weight database, without the
-administrative overhead of a full LDAP installation.
- </para>
-
- <para>
-Included with ldb are a number of useful command line tools for
-manipulating a ldb database. These tools are similar in style to the
-equivalent ldap command line tools.
- </para>
-
- <para>
-In its default mode of operation with a tdb backend, ldb can also be
-seen as a "schema-less LDAP". By default ldb does not require a
-schema, which greatly reduces the complexity of getting started with
-ldb databases. As the complexity of you application grows you can take
-advantage of some of the optional schema-like attributes that ldb
-offers, or you can migrate to using the full LDAP api while keeping
-your exiting ldb code.
- </para>
-
- <para>
-If you are new to ldb, then I suggest starting with the manual pages
-for ldbsearch(1) and ldbedit(1), and experimenting with a local
-database. Then I suggest you look at the ldb_connect(3) and
-ldb_search(3) manual pages.
- </para>
-</refsect1>
-
-<refsect1>
- <title>TOOLS</title>
-
- <itemizedlist>
- <listitem><para>
- <application>ldbsearch(1)</application>
- - command line ldb search utility
- </para></listitem>
-
- <listitem><para>
- <application>ldbedit(1)</application>
- - edit all or part of a ldb database using your favourite editor
- </para></listitem>
-
- <listitem><para>
- <application>ldbadd(1)</application>
- - add records to a ldb database using LDIF formatted input
- </para></listitem>
-
- <listitem><para>
- <application>ldbdel(1)</application>
- - delete records from a ldb database
- </para></listitem>
-
- <listitem><para>
- <application>ldbmodify(1)</application>
- - modify records in a ldb database using LDIF formatted input
- </para></listitem>
- </itemizedlist>
-</refsect1>
-
-<refsect1>
- <title>FUNCTIONS</title>
-
- <itemizedlist>
- <listitem><para>
- <function>ldb_connect(3)</function>
- - connect to a ldb backend
- </para></listitem>
-
- <listitem><para>
- <function>ldb_search(3)</function>
- - perform a database search
- </para></listitem>
-
- <listitem><para>
- <function>ldb_add(3)</function>
- - add a record to the database
- </para></listitem>
-
- <listitem><para>
- <function>ldb_delete(3)</function>
- - delete a record from the database
- </para></listitem>
-
- <listitem><para>
- <function>ldb_modify(3)</function>
- - modify a record in the database
- </para></listitem>
-
- <listitem><para>
- <function>ldb_errstring(3)</function>
- - retrieve extended error information from the last operation
- </para></listitem>
-
- <listitem><para>
- <function>ldb_ldif_write(3)</function>
- - write a LDIF formatted message
- </para></listitem>
-
- <listitem><para>
- <function>ldb_ldif_write_file(3)</function>
- - write a LDIF formatted message to a file
- </para></listitem>
-
- <listitem><para>
- <function>ldb_ldif_read(3)</function>
- - read a LDIF formatted message
- </para></listitem>
-
- <listitem><para>
- <function>ldb_ldif_read_free(3)</function>
- - free the result of a ldb_ldif_read()
- </para></listitem>
-
- <listitem><para>
- <function>ldb_ldif_read_file(3)</function>
- - read a LDIF message from a file
- </para></listitem>
-
- <listitem><para>
- <function>ldb_ldif_read_string(3)</function>
- - read a LDIF message from a string
- </para></listitem>
-
- <listitem><para>
- <function>ldb_msg_find_element(3)</function>
- - find an element in a ldb_message
- </para></listitem>
-
- <listitem><para>
- <function>ldb_val_equal_exact(3)</function>
- - compare two ldb_val structures
- </para></listitem>
-
- <listitem><para>
- <function>ldb_msg_find_val(3)</function>
- - find an element by value
- </para></listitem>
-
- <listitem><para>
- <function>ldb_msg_add_empty(3)</function>
- - add an empty message element to a ldb_message
- </para></listitem>
-
-
- <listitem><para>
- <function>ldb_msg_add(3)</function>
- - add a non-empty message element to a ldb_message
- </para></listitem>
-
-
- <listitem><para>
- <function>ldb_msg_element_compare(3)</function>
- - compare two ldb_message_element structures
- </para></listitem>
-
-
- <listitem><para>
- <function>ldb_msg_find_int(3)</function>
- - return an integer value from a ldb_message
- </para></listitem>
-
-
- <listitem><para>
- <function>ldb_msg_find_uint(3)</function>
- - return an unsigned integer value from a ldb_message
- </para></listitem>
-
-
- <listitem><para>
- <function>ldb_msg_find_double(3)</function>
- - return a double value from a ldb_message
- </para></listitem>
-
-
- <listitem><para>
- <function>ldb_msg_find_string(3)</function>
- - return a string value from a ldb_message
- </para></listitem>
-
-
- <listitem><para>
- <function>ldb_set_alloc(3)</function>
- - set the memory allocation function to be used by ldb
- </para></listitem>
-
-
- <listitem><para>
- <function>ldb_set_debug(3)</function>
- - set a debug handler to be used by ldb
- </para></listitem>
-
-
- <listitem><para>
- <function>ldb_set_debug_stderr(3)</function>
- - set a debug handler for stderr output
- </para></listitem>
- </itemizedlist>
-</refsect1>
-
-<refsect1>
- <title>Author</title>
-
- <para>
- ldb was written by
- <ulink url="http://samba.org/~tridge/">Andrew Tridgell</ulink>.
- </para>
-
- <para>
-If you wish to report a problem or make a suggestion then please see
-the <ulink url="http://ldb.samba.org/"/> web site for
-current contact and maintainer information.
- </para>
-
- <para>
-ldb is released under the GNU Lesser General Public License version 2
-or later. Please see the file COPYING for license details.
- </para>
-</refsect1>
-</refentry>
diff --git a/source4/lib/ldb/man/ldbadd.1.xml b/source4/lib/ldb/man/ldbadd.1.xml
deleted file mode 100644
index b77b151e2d..0000000000
--- a/source4/lib/ldb/man/ldbadd.1.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<refentry id="ldbadd.1">
-
-<refmeta>
- <refentrytitle>ldbadd</refentrytitle>
- <manvolnum>1</manvolnum>
-</refmeta>
-
-
-<refnamediv>
- <refname>ldbadd</refname>
- <refpurpose>Command-line utility for adding records to an LDB</refpurpose>
-</refnamediv>
-
-<refsynopsisdiv>
- <cmdsynopsis>
- <command>ldbadd</command>
- <arg choice="opt">-h</arg>
- <arg choice="opt">-H LDB-URL</arg>
- <arg choice="opt">ldif-file1</arg>
- <arg choice="opt">ldif-file2</arg>
- <arg choice="opt">...</arg>
- </cmdsynopsis>
-</refsynopsisdiv>
-
-<refsect1>
- <title>DESCRIPTION</title>
-
- <para>ldbadd adds records to an ldb(3) database. It reads
- the ldif(5) files specified on the command line and adds
- the records from these files to the LDB database, which is specified
- by the -H option or the LDB_URL environment variable.
- </para>
-
- <para>If - is specified as a ldb file, the ldif input is read from
- standard input.</para>
-
-</refsect1>
-
-
-<refsect1>
- <title>OPTIONS</title>
-
- <variablelist>
- <varlistentry>
- <term>-h</term>
- <listitem><para>
- Show list of available options.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-H &lt;ldb-url&gt;</term>
- <listitem><para>
- LDB URL to connect to. See ldb(3) for details.
- </para></listitem>
- </varlistentry>
-
- </variablelist>
-
-</refsect1>
-
-<refsect1>
- <title>ENVIRONMENT</title>
-
- <variablelist>
- <varlistentry><term>LDB_URL</term>
- <listitem><para>LDB URL to connect to (can be overrided by using the
- -H command-line option.)</para></listitem>
- </varlistentry>
- </variablelist>
-
-</refsect1>
-
-<refsect1>
- <title>VERSION</title>
-
- <para>This man page is correct for version 4.0 of the Samba suite.</para>
-</refsect1>
-
-<refsect1>
- <title>SEE ALSO</title>
-
- <para>ldb(3), ldbmodify, ldbdel, ldif(5)</para>
-
-</refsect1>
-
-<refsect1>
- <title>AUTHOR</title>
-
- <para> ldb was written by
- <ulink url="http://samba.org/~tridge/">Andrew Tridgell</ulink>.
- </para>
-
- <para>
-If you wish to report a problem or make a suggestion then please see
-the <ulink url="http://ldb.samba.org/"/> web site for
-current contact and maintainer information.
- </para>
-
- <para>This manpage was written by Jelmer Vernooij.</para>
-
-</refsect1>
-
-</refentry>
diff --git a/source4/lib/ldb/man/ldbdel.1.xml b/source4/lib/ldb/man/ldbdel.1.xml
deleted file mode 100644
index 41da3bc984..0000000000
--- a/source4/lib/ldb/man/ldbdel.1.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<refentry id="ldbdel.1">
-
-<refmeta>
- <refentrytitle>ldbdel</refentrytitle>
- <manvolnum>1</manvolnum>
-</refmeta>
-
-
-<refnamediv>
- <refname>ldbdel</refname>
- <refpurpose>Command-line program for deleting LDB records</refpurpose>
-</refnamediv>
-
-<refsynopsisdiv>
- <cmdsynopsis>
- <command>ldbdel</command>
- <arg choice="opt">-h</arg>
- <arg choice="opt">-H LDB-URL</arg>
- <arg choice="opt">dn</arg>
- <arg choice="opt">...</arg>
- </cmdsynopsis>
-</refsynopsisdiv>
-
-<refsect1>
- <title>DESCRIPTION</title>
-
- <para>ldbdel deletes records from an ldb(3) database.
- It deletes the records identified by the dn's specified
- on the command-line. </para>
-
- <para>ldbdel uses either the database that is specified with
- the -H option or the database specified by the LDB_URL environment
- variable.</para>
-
-</refsect1>
-
-
-<refsect1>
- <title>OPTIONS</title>
-
- <variablelist>
- <varlistentry>
- <term>-h</term>
- <listitem><para>
- Show list of available options.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-H &lt;ldb-url&gt;</term>
- <listitem><para>
- LDB URL to connect to. See ldb(3) for details.
- </para></listitem>
- </varlistentry>
-
- </variablelist>
-
-</refsect1>
-
-<refsect1>
- <title>ENVIRONMENT</title>
-
- <variablelist>
- <varlistentry><term>LDB_URL</term>
- <listitem><para>LDB URL to connect to (can be overrided by using the
- -H command-line option.)</para></listitem>
- </varlistentry>
- </variablelist>
-
-</refsect1>
-
-<refsect1>
- <title>VERSION</title>
-
- <para>This man page is correct for version 4.0 of the Samba suite.</para>
-</refsect1>
-
-<refsect1>
- <title>SEE ALSO</title>
-
- <para>ldb(3), ldbmodify, ldbadd, ldif(5)</para>
-
-</refsect1>
-
-<refsect1>
- <title>AUTHOR</title>
-
- <para> ldb was written by
- <ulink url="http://samba.org/~tridge/">Andrew Tridgell</ulink>.
- </para>
-
- <para>
-If you wish to report a problem or make a suggestion then please see
-the <ulink url="http://ldb.samba.org/"/> web site for
-current contact and maintainer information.
- </para>
-
- <para>ldbdel was written by Andrew Tridgell.</para>
-
- <para>This manpage was written by Jelmer Vernooij.</para>
-
-</refsect1>
-
-</refentry>
diff --git a/source4/lib/ldb/man/ldbedit.1.xml b/source4/lib/ldb/man/ldbedit.1.xml
deleted file mode 100644
index a2eec0579c..0000000000
--- a/source4/lib/ldb/man/ldbedit.1.xml
+++ /dev/null
@@ -1,200 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<refentry id="ldbedit.1">
-
- <refmeta>
- <refentrytitle>ldbedit</refentrytitle>
- <manvolnum>1</manvolnum>
- </refmeta>
-
-
- <refnamediv>
- <refname>ldbedit</refname>
- <refpurpose>Edit LDB databases using your preferred editor</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>ldbedit</command>
- <arg choice="opt">-?</arg>
- <arg choice="opt">--usage</arg>
- <arg choice="opt">-s base|one|sub</arg>
- <arg choice="opt">-b basedn</arg>
- <arg choice="opt">-a</arg>
- <arg choice="opt">-e editor</arg>
- <arg choice="opt">-H LDB-URL</arg>
- <arg choice="opt">expression</arg>
- <arg rep="repeat" choice="opt">attributes</arg>
- </cmdsynopsis>
-</refsynopsisdiv>
-
-<refsect1>
- <title>DESCRIPTION</title>
-
- <para>ldbedit is a utility that allows you to edit LDB entries (in
- tdb files, sqlite files or LDAP servers) using your preferred editor.
- ldbedit generates an LDIF file based on your query, allows you to edit
- the LDIF, and then merges that LDIF back into the LDB backend.
- </para>
-
-</refsect1>
-
-
- <refsect1>
- <title>OPTIONS</title>
-
- <variablelist>
- <varlistentry>
- <term>-?</term>
- <term>--help</term>
- <listitem>
- <para>
- Show list of available options, and a phrase describing what that option
- does.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>--usage</term>
- <listitem>
- <para>
- Show list of available options. This is similar to the help option,
- however it does not provide any description, and is hence shorter.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-H &lt;ldb-url&gt;</term>
- <listitem>
- <para>
- LDB URL to connect to. For a tdb database,
- this will be of the form
- tdb://<replaceable>filename</replaceable>.
- For a LDAP connection over unix domain
- sockets, this will be of the form
- ldapi://<replaceable>socket</replaceable>. For
- a (potentially remote) LDAP connection over
- TCP, this will be of the form
- ldap://<replaceable>hostname</replaceable>. For
- an SQLite database, this will be of the form
- sqlite://<replaceable>filename</replaceable>.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-s one|sub|base</term>
- <listitem><para>Search scope to use. One-level, subtree or base.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-a</term>
- <term>-all</term>
- <listitem>
- <para>Edit all records. This allows you to
- apply the same change to a number of records
- at once. You probably want to combine this
- with an expression of the form
- "objectclass=*".
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-e editor</term>
- <term>--editor editor</term>
- <listitem>
- <para>Specify the editor that should be used (overrides
- the VISUAL and EDITOR environment
- variables). If this option is not used, and
- neither VISUAL nor EDITOR environment variables
- are set, then the vi editor will be used.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-b basedn</term>
- <listitem><para>Specify Base Distinguished Name to use.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-v</term>
- <term>--verbose</term>
- <listitem>
- <para>Make ldbedit more verbose about the
- operations that are being performed. Without
- this option, ldbedit will only provide a
- summary change line.
- </para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- </refsect1>
-
- <refsect1>
- <title>ENVIRONMENT</title>
-
- <variablelist>
- <varlistentry>
- <term>LDB_URL</term>
- <listitem>
- <para>LDB URL to connect to. This can be
- overridden by using the -H command-line option.)
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>VISUAL and EDITOR</term>
- <listitem>
- <para>
- Environment variables used to determine what
- editor to use. VISUAL takes precedence over
- EDITOR, and both are overridden by the
- -e command-line option.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- </refsect1>
-
- <refsect1>
- <title>VERSION</title>
-
- <para>This man page is correct for version 4.0 of the Samba suite.</para>
- </refsect1>
-
- <refsect1>
- <title>SEE ALSO</title>
-
- <para>ldb(3), ldbmodify(1), ldbdel(1), ldif(5), vi(1)</para>
-
- </refsect1>
-
- <refsect1>
- <title>AUTHOR</title>
-
- <para>
- ldb was written by
- <ulink url="http://samba.org/~tridge/">Andrew Tridgell</ulink>.
- </para>
-
- <para>
- If you wish to report a problem or make a suggestion then please see
- the <ulink url="http://ldb.samba.org/"/> web site for
- current contact and maintainer information.
- </para>
-
- <para>
- This manpage was written by Jelmer Vernooij and updated
- by Brad Hards.
- </para>
-
- </refsect1>
-
-</refentry>
diff --git a/source4/lib/ldb/man/ldbmodify.1.xml b/source4/lib/ldb/man/ldbmodify.1.xml
deleted file mode 100644
index 9bb492ab1b..0000000000
--- a/source4/lib/ldb/man/ldbmodify.1.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<refentry id="ldbmodify.1">
-
-<refmeta>
- <refentrytitle>ldbmodify</refentrytitle>
- <manvolnum>1</manvolnum>
-</refmeta>
-
-
-<refnamediv>
- <refname>ldbmodify</refname>
- <refpurpose>Modify records in a LDB database</refpurpose>
-</refnamediv>
-
-<refsynopsisdiv>
- <cmdsynopsis>
- <command>ldbmodify</command>
- <arg choice="opt">-H LDB-URL</arg>
- <arg choice="opt">ldif-file</arg>
- </cmdsynopsis>
-</refsynopsisdiv>
-
-<refsect1>
- <title>DESCRIPTION</title>
-
- <para>
- ldbmodify changes, adds and deletes records in a LDB database.
- The changes that should be made to the LDB database are read from
- the specified LDIF-file. If - is specified as the filename, input is read from stdin.
- </para>
-
- <para>For now, see ldapmodify(1) for details on the LDIF file format.</para>
-
-</refsect1>
-
-
-<refsect1>
- <title>OPTIONS</title>
-
- <variablelist>
- <varlistentry>
- <term>-H &lt;ldb-url&gt;</term>
- <listitem><para>
- LDB URL to connect to. See ldb(3) for details.
- </para></listitem>
- </varlistentry>
- </variablelist>
-</refsect1>
-
-<refsect1>
- <title>ENVIRONMENT</title>
-
- <variablelist>
- <varlistentry><term>LDB_URL</term>
- <listitem><para>LDB URL to connect to (can be overrided by using the
- -H command-line option.)</para></listitem>
- </varlistentry>
- </variablelist>
-
-</refsect1>
-
-<refsect1>
- <title>VERSION</title>
-
- <para>This man page is correct for version 4.0 of the Samba suite.</para>
-</refsect1>
-
-<refsect1>
- <title>SEE ALSO</title>
-
- <para>ldb(3), ldbedit</para>
-
-</refsect1>
-
-<refsect1>
- <title>AUTHOR</title>
-
- <para> ldb was written by
- <ulink url="http://samba.org/~tridge/">Andrew Tridgell</ulink>.
- </para>
-
- <para>
-If you wish to report a problem or make a suggestion then please see
-the <ulink url="http://ldb.samba.org/"/> web site for
-current contact and maintainer information.
- </para>
-
- <para>This manpage was written by Jelmer Vernooij.</para>
-
-</refsect1>
-
-</refentry>
diff --git a/source4/lib/ldb/man/ldbrename.1.xml b/source4/lib/ldb/man/ldbrename.1.xml
deleted file mode 100644
index 3576bc27bb..0000000000
--- a/source4/lib/ldb/man/ldbrename.1.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<refentry id="ldbrename.1">
-
-<refmeta>
- <refentrytitle>ldbrename</refentrytitle>
- <manvolnum>1</manvolnum>
-</refmeta>
-
-
-<refnamediv>
- <refname>ldbrename</refname>
- <refpurpose>Edit LDB databases using your favorite editor</refpurpose>
-</refnamediv>
-
-<refsynopsisdiv>
- <cmdsynopsis>
- <command>ldbrename</command>
- <arg choice="opt">-h</arg>
- <arg choice="opt">-o options</arg>
- <arg choice="req">olddn</arg>
- <arg choice="req">newdb</arg>
- </cmdsynopsis>
-</refsynopsisdiv>
-
-<refsect1>
- <title>DESCRIPTION</title>
-
- <para>ldbrename is a utility that allows you to rename trees in
- an LDB database based by DN. This utility takes
- two arguments: the original
- DN name of the top element and the DN to change it to.
- </para>
-
-</refsect1>
-
-
-<refsect1>
- <title>OPTIONS</title>
-
- <variablelist>
- <varlistentry>
- <term>-h</term>
- <listitem><para>
- Show list of available options.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-H &lt;ldb-url&gt;</term>
- <listitem><para>
- LDB URL to connect to. See ldb(3) for details.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-o options</term>
- <listitem><para>Extra ldb options, such as
- modules.</para></listitem>
- </varlistentry>
-
- </variablelist>
-
-</refsect1>
-
-<refsect1>
- <title>ENVIRONMENT</title>
-
- <variablelist>
- <varlistentry><term>LDB_URL</term>
- <listitem><para>LDB URL to connect to (can be overrided by using the
- -H command-line option.)</para></listitem>
- </varlistentry>
- </variablelist>
-
-</refsect1>
-
-<refsect1>
- <title>VERSION</title>
-
- <para>This man page is correct for version 4.0 of the Samba suite.</para>
-</refsect1>
-
-<refsect1>
- <title>SEE ALSO</title>
-
- <para>ldb(3), ldbmodify, ldbdel, ldif(5)</para>
-
-</refsect1>
-
-<refsect1>
- <title>AUTHOR</title>
-
- <para> ldb was written by
- <ulink url="http://samba.org/~tridge/">Andrew Tridgell</ulink>.
- </para>
-
- <para>
-If you wish to report a problem or make a suggestion then please see
-the <ulink url="http://ldb.samba.org/"/> web site for
-current contact and maintainer information.
- </para>
-
- <para>This manpage was written by Jelmer Vernooij.</para>
-
-</refsect1>
-
-</refentry>
diff --git a/source4/lib/ldb/man/ldbsearch.1.xml b/source4/lib/ldb/man/ldbsearch.1.xml
deleted file mode 100644
index 623a5992e5..0000000000
--- a/source4/lib/ldb/man/ldbsearch.1.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-<refentry id="ldbsearch.1">
-
-<refmeta>
- <refentrytitle>ldbsearch</refentrytitle>
- <manvolnum>1</manvolnum>
-</refmeta>
-
-
-<refnamediv>
- <refname>ldbsearch</refname>
- <refpurpose>Search for records in a LDB database</refpurpose>
-</refnamediv>
-
-<refsynopsisdiv>
- <cmdsynopsis>
- <command>ldbsearch</command>
- <arg choice="opt">-h</arg>
- <arg choice="opt">-s base|one|sub</arg>
- <arg choice="opt">-b basedn</arg>
- <arg chioce="opt">-i</arg>
- <arg choice="opt">-H LDB-URL</arg>
- <arg choice="opt">expression</arg>
- <arg choice="opt">attributes</arg>
- </cmdsynopsis>
-</refsynopsisdiv>
-
-<refsect1>
- <title>DESCRIPTION</title>
-
- <para>ldbsearch searches a LDB database for records matching the
- specified expression (see the ldapsearch(1) manpage for
- a description of the expression format). For each
- record, the specified attributes are printed.
- </para>
-
-</refsect1>
-
-
-<refsect1>
- <title>OPTIONS</title>
-
- <variablelist>
- <varlistentry>
- <term>-h</term>
- <listitem><para>
- Show list of available options.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-H &lt;ldb-url&gt;</term>
- <listitem><para>
- LDB URL to connect to. See ldb(3) for details.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-s one|sub|base</term>
- <listitem><para>Search scope to use. One-level, subtree or base.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-i</term>
- <listitem><para>Read search expressions from stdin. </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term>-b basedn</term>
- <listitem><para>Specify Base DN to use.</para></listitem>
- </varlistentry>
-
- </variablelist>
-
-</refsect1>
-
-<refsect1>
- <title>ENVIRONMENT</title>
-
- <variablelist>
- <varlistentry><term>LDB_URL</term>
- <listitem><para>LDB URL to connect to (can be overrided by using the
- -H command-line option.)</para></listitem>
- </varlistentry>
- </variablelist>
-
-</refsect1>
-
-<refsect1>
- <title>VERSION</title>
-
- <para>This man page is correct for version 4.0 of the Samba suite.</para>
-</refsect1>
-
-<refsect1>
- <title>SEE ALSO</title>
-
- <para>ldb(3), ldbedit(1)</para>
-
-</refsect1>
-
-<refsect1>
- <title>AUTHOR</title>
-
- <para> ldb was written by
- <ulink url="http://samba.org/~tridge/">Andrew Tridgell</ulink>.
- </para>
-
- <para>
-If you wish to report a problem or make a suggestion then please see
-the <ulink url="http://ldb.samba.org/"/> web site for
-current contact and maintainer information.
- </para>
-
- <para>This manpage was written by Jelmer Vernooij.</para>
-
-</refsect1>
-
-</refentry>
diff --git a/source4/lib/ldb/modules/asq.c b/source4/lib/ldb/modules/asq.c
deleted file mode 100644
index 7482de826f..0000000000
--- a/source4/lib/ldb/modules/asq.c
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2005-2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb attribute scoped query control module
- *
- * Description: this module searches all the objects pointed by
- * the DNs contained in the references attribute
- *
- * Author: Simo Sorce
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_module.h"
-
-struct asq_context {
-
- enum {ASQ_SEARCH_BASE, ASQ_SEARCH_MULTI} step;
-
- struct ldb_module *module;
- struct ldb_request *req;
-
- struct ldb_asq_control *asq_ctrl;
-
- const char * const *req_attrs;
- char *req_attribute;
- enum {
- ASQ_CTRL_SUCCESS = 0,
- ASQ_CTRL_INVALID_ATTRIBUTE_SYNTAX = 21,
- ASQ_CTRL_UNWILLING_TO_PERFORM = 53,
- ASQ_CTRL_AFFECTS_MULTIPLE_DSA = 71
- } asq_ret;
-
- struct ldb_reply *base_res;
-
- struct ldb_request **reqs;
- unsigned int num_reqs;
- unsigned int cur_req;
-
- struct ldb_control **controls;
-};
-
-static struct asq_context *asq_context_init(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct asq_context *ac;
-
- ldb = ldb_module_get_ctx(module);
-
- ac = talloc_zero(req, struct asq_context);
- if (ac == NULL) {
- ldb_oom(ldb);
- return NULL;
- }
-
- ac->module = module;
- ac->req = req;
-
- return ac;
-}
-
-static int asq_search_continue(struct asq_context *ac);
-
-static int asq_search_terminate(struct asq_context *ac)
-{
- struct ldb_asq_control *asq;
- unsigned int i;
-
- if (ac->controls) {
- for (i = 0; ac->controls[i]; i++) /* count em */ ;
- } else {
- i = 0;
- }
-
- ac->controls = talloc_realloc(ac, ac->controls, struct ldb_control *, i + 2);
-
- if (ac->controls == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->controls[i] = talloc(ac->controls, struct ldb_control);
- if (ac->controls[i] == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->controls[i]->oid = LDB_CONTROL_ASQ_OID;
- ac->controls[i]->critical = 0;
-
- asq = talloc_zero(ac->controls[i], struct ldb_asq_control);
- if (asq == NULL)
- return LDB_ERR_OPERATIONS_ERROR;
-
- asq->result = ac->asq_ret;
-
- ac->controls[i]->data = asq;
-
- ac->controls[i + 1] = NULL;
-
- return ldb_module_done(ac->req, ac->controls, NULL, LDB_SUCCESS);
-}
-
-static int asq_base_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct asq_context *ac;
- int ret;
-
- ac = talloc_get_type(req->context, struct asq_context);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- switch (ares->type) {
- case LDB_REPLY_ENTRY:
- ac->base_res = talloc_move(ac, &ares);
- break;
-
- case LDB_REPLY_REFERRAL:
- /* ignore referrals */
- talloc_free(ares);
- break;
-
- case LDB_REPLY_DONE:
-
- talloc_free(ares);
-
- /* next step */
- ret = asq_search_continue(ac);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL, ret);
- }
- break;
-
- }
- return LDB_SUCCESS;
-}
-
-static int asq_reqs_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct asq_context *ac;
- int ret;
-
- ac = talloc_get_type(req->context, struct asq_context);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- switch (ares->type) {
- case LDB_REPLY_ENTRY:
- /* pass the message up to the original callback as we
- * do not have to elaborate on it any further */
- ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL, ret);
- }
- talloc_free(ares);
- break;
-
- case LDB_REPLY_REFERRAL:
- /* ignore referrals */
- talloc_free(ares);
- break;
-
- case LDB_REPLY_DONE:
-
- talloc_free(ares);
-
- ret = asq_search_continue(ac);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL, ret);
- }
- break;
- }
-
- return LDB_SUCCESS;
-}
-
-static int asq_build_first_request(struct asq_context *ac, struct ldb_request **base_req)
-{
- struct ldb_context *ldb;
- const char **base_attrs;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- ac->req_attrs = ac->req->op.search.attrs;
- ac->req_attribute = talloc_strdup(ac, ac->asq_ctrl->source_attribute);
- if (ac->req_attribute == NULL)
- return LDB_ERR_OPERATIONS_ERROR;
-
- base_attrs = talloc_array(ac, const char *, 2);
- if (base_attrs == NULL) return LDB_ERR_OPERATIONS_ERROR;
-
- base_attrs[0] = talloc_strdup(base_attrs, ac->asq_ctrl->source_attribute);
- if (base_attrs[0] == NULL) return LDB_ERR_OPERATIONS_ERROR;
-
- base_attrs[1] = NULL;
-
- ret = ldb_build_search_req(base_req, ldb, ac,
- ac->req->op.search.base,
- LDB_SCOPE_BASE,
- NULL,
- (const char * const *)base_attrs,
- NULL,
- ac, asq_base_callback,
- ac->req);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- return LDB_SUCCESS;
-}
-
-static int asq_build_multiple_requests(struct asq_context *ac, bool *terminated)
-{
- struct ldb_context *ldb;
- struct ldb_control **saved_controls;
- struct ldb_control *control;
- struct ldb_dn *dn;
- struct ldb_message_element *el;
- unsigned int i;
- int ret;
-
- if (ac->base_res == NULL) {
- return LDB_ERR_NO_SUCH_OBJECT;
- }
-
- ldb = ldb_module_get_ctx(ac->module);
-
- el = ldb_msg_find_element(ac->base_res->message, ac->req_attribute);
- /* no values found */
- if (el == NULL) {
- ac->asq_ret = ASQ_CTRL_SUCCESS;
- *terminated = true;
- return asq_search_terminate(ac);
- }
-
- ac->num_reqs = el->num_values;
- ac->cur_req = 0;
- ac->reqs = talloc_array(ac, struct ldb_request *, ac->num_reqs);
- if (ac->reqs == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- for (i = 0; i < el->num_values; i++) {
-
- dn = ldb_dn_new(ac, ldb,
- (const char *)el->values[i].data);
- if ( ! ldb_dn_validate(dn)) {
- ac->asq_ret = ASQ_CTRL_INVALID_ATTRIBUTE_SYNTAX;
- *terminated = true;
- return asq_search_terminate(ac);
- }
-
- ret = ldb_build_search_req_ex(&ac->reqs[i],
- ldb, ac,
- dn, LDB_SCOPE_BASE,
- ac->req->op.search.tree,
- ac->req_attrs,
- ac->req->controls,
- ac, asq_reqs_callback,
- ac->req);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- /* remove the ASQ control itself */
- control = ldb_request_get_control(ac->req, LDB_CONTROL_ASQ_OID);
- if (!ldb_save_controls(control, ac->reqs[i], &saved_controls)) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-static int asq_search_continue(struct asq_context *ac)
-{
- struct ldb_context *ldb;
- bool terminated = false;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- switch (ac->step) {
- case ASQ_SEARCH_BASE:
-
- /* build up the requests call chain */
- ret = asq_build_multiple_requests(ac, &terminated);
- if (ret != LDB_SUCCESS || terminated) {
- return ret;
- }
-
- ac->step = ASQ_SEARCH_MULTI;
-
- return ldb_request(ldb, ac->reqs[ac->cur_req]);
-
- case ASQ_SEARCH_MULTI:
-
- ac->cur_req++;
-
- if (ac->cur_req == ac->num_reqs) {
- /* done */
- return asq_search_terminate(ac);
- }
-
- return ldb_request(ldb, ac->reqs[ac->cur_req]);
- }
-
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-static int asq_search(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct ldb_request *base_req;
- struct ldb_control *control;
- struct asq_context *ac;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* check if there's an ASQ control */
- control = ldb_request_get_control(req, LDB_CONTROL_ASQ_OID);
- if (control == NULL) {
- /* not found go on */
- return ldb_next_request(module, req);
- }
-
- ac = asq_context_init(module, req);
- if (!ac) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- /* check the search is well formed */
- if (req->op.search.scope != LDB_SCOPE_BASE) {
- ac->asq_ret = ASQ_CTRL_UNWILLING_TO_PERFORM;
- return asq_search_terminate(ac);
- }
-
- ac->asq_ctrl = talloc_get_type(control->data, struct ldb_asq_control);
- if (!ac->asq_ctrl) {
- return LDB_ERR_PROTOCOL_ERROR;
- }
-
- ret = asq_build_first_request(ac, &base_req);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ac->step = ASQ_SEARCH_BASE;
-
- return ldb_request(ldb, base_req);
-}
-
-static int asq_init(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- ret = ldb_mod_register_control(module, LDB_CONTROL_ASQ_OID);
- if (ret != LDB_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_WARNING, "asq: Unable to register control with rootdse!");
- }
-
- return ldb_next_init(module);
-}
-
-static const struct ldb_module_ops ldb_asq_module_ops = {
- .name = "asq",
- .search = asq_search,
- .init_context = asq_init
-};
-
-int ldb_asq_init(const char *version)
-{
- LDB_MODULE_CHECK_VERSION(version);
- return ldb_register_module(&ldb_asq_module_ops);
-}
diff --git a/source4/lib/ldb/modules/paged_results.c b/source4/lib/ldb/modules/paged_results.c
deleted file mode 100644
index 2d6c62fd54..0000000000
--- a/source4/lib/ldb/modules/paged_results.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2005-2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: paged_result
- *
- * Component: ldb paged results control module
- *
- * Description: this module caches a complete search and sends back
- * results in chunks as asked by the client
- *
- * Author: Simo Sorce
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_module.h"
-
-struct message_store {
- /* keep the whole ldb_reply as an optimization
- * instead of freeing and talloc-ing the container
- * on each result */
- struct ldb_reply *r;
- struct message_store *next;
-};
-
-struct private_data;
-
-struct results_store {
-
- struct private_data *priv;
-
- char *cookie;
- time_t timestamp;
-
- struct results_store *next;
-
- struct message_store *first;
- struct message_store *last;
- int num_entries;
-
- struct message_store *first_ref;
- struct message_store *last_ref;
-
- struct ldb_control **controls;
-};
-
-struct private_data {
- unsigned int next_free_id;
- struct results_store *store;
-
-};
-
-static int store_destructor(struct results_store *del)
-{
- struct private_data *priv = del->priv;
- struct results_store *loop;
-
- if (priv->store == del) {
- priv->store = del->next;
- return 0;
- }
-
- for (loop = priv->store; loop; loop = loop->next) {
- if (loop->next == del) {
- loop->next = del->next;
- return 0;
- }
- }
-
- /* is not in list ? */
- return -1;
-}
-
-static struct results_store *new_store(struct private_data *priv)
-{
- struct results_store *newr;
- unsigned int new_id = priv->next_free_id++;
-
- /* TODO: we should have a limit on the number of
- * outstanding paged searches
- */
-
- newr = talloc(priv, struct results_store);
- if (!newr) return NULL;
-
- newr->priv = priv;
-
- newr->cookie = talloc_asprintf(newr, "%d", new_id);
- if (!newr->cookie) {
- talloc_free(newr);
- return NULL;
- }
-
- newr->timestamp = time(NULL);
-
- newr->first = NULL;
- newr->num_entries = 0;
- newr->first_ref = NULL;
- newr->controls = NULL;
-
- newr->next = priv->store;
- priv->store = newr;
-
- talloc_set_destructor(newr, store_destructor);
-
- return newr;
-}
-
-struct paged_context {
- struct ldb_module *module;
- struct ldb_request *req;
-
- struct results_store *store;
- int size;
- struct ldb_control **controls;
-};
-
-static int paged_results(struct paged_context *ac)
-{
- struct ldb_paged_control *paged;
- struct message_store *msg;
- unsigned int i, num_ctrls;
- int ret;
-
- if (ac->store == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- while (ac->store->num_entries > 0 && ac->size > 0) {
- msg = ac->store->first;
- ret = ldb_module_send_entry(ac->req, msg->r->message, msg->r->controls);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ac->store->first = msg->next;
- talloc_free(msg);
- ac->store->num_entries--;
- ac->size--;
- }
-
- while (ac->store->first_ref != NULL) {
- msg = ac->store->first_ref;
- ret = ldb_module_send_referral(ac->req, msg->r->referral);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ac->store->first_ref = msg->next;
- talloc_free(msg);
- }
-
- /* return result done */
- num_ctrls = 1;
- i = 0;
-
- if (ac->store->controls != NULL) {
- while (ac->store->controls[i]) i++; /* counting */
-
- num_ctrls += i;
- }
-
- ac->controls = talloc_array(ac, struct ldb_control *, num_ctrls +1);
- if (ac->controls == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ac->controls[num_ctrls] = NULL;
-
- for (i = 0; i < (num_ctrls -1); i++) {
- ac->controls[i] = talloc_reference(ac->controls, ac->store->controls[i]);
- }
-
- ac->controls[i] = talloc(ac->controls, struct ldb_control);
- if (ac->controls[i] == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->controls[i]->oid = talloc_strdup(ac->controls[i],
- LDB_CONTROL_PAGED_RESULTS_OID);
- if (ac->controls[i]->oid == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->controls[i]->critical = 0;
-
- paged = talloc(ac->controls[i], struct ldb_paged_control);
- if (paged == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->controls[i]->data = paged;
-
- if (ac->size > 0) {
- paged->size = 0;
- paged->cookie = NULL;
- paged->cookie_len = 0;
- } else {
- paged->size = ac->store->num_entries;
- paged->cookie = talloc_strdup(paged, ac->store->cookie);
- paged->cookie_len = strlen(paged->cookie) + 1;
- }
-
- return LDB_SUCCESS;
-}
-
-static int paged_search_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct paged_context *ac ;
- struct message_store *msg_store;
- int ret;
-
- ac = talloc_get_type(req->context, struct paged_context);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- switch (ares->type) {
- case LDB_REPLY_ENTRY:
- msg_store = talloc(ac->store, struct message_store);
- if (msg_store == NULL) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- msg_store->next = NULL;
- msg_store->r = talloc_steal(msg_store, ares);
-
- if (ac->store->first == NULL) {
- ac->store->first = msg_store;
- } else {
- ac->store->last->next = msg_store;
- }
- ac->store->last = msg_store;
-
- ac->store->num_entries++;
-
- break;
-
- case LDB_REPLY_REFERRAL:
- msg_store = talloc(ac->store, struct message_store);
- if (msg_store == NULL) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- msg_store->next = NULL;
- msg_store->r = talloc_steal(msg_store, ares);
-
- if (ac->store->first_ref == NULL) {
- ac->store->first_ref = msg_store;
- } else {
- ac->store->last_ref->next = msg_store;
- }
- ac->store->last_ref = msg_store;
-
- break;
-
- case LDB_REPLY_DONE:
- ac->store->controls = talloc_move(ac->store, &ares->controls);
- ret = paged_results(ac);
- return ldb_module_done(ac->req, ac->controls,
- ares->response, ret);
- }
-
- return LDB_SUCCESS;
-}
-
-static int paged_search(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct ldb_control *control;
- struct private_data *private_data;
- struct ldb_paged_control *paged_ctrl;
- struct ldb_control **saved_controls;
- struct ldb_request *search_req;
- struct paged_context *ac;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* check if there's a paged request control */
- control = ldb_request_get_control(req, LDB_CONTROL_PAGED_RESULTS_OID);
- if (control == NULL) {
- /* not found go on */
- return ldb_next_request(module, req);
- }
-
- paged_ctrl = talloc_get_type(control->data, struct ldb_paged_control);
- if (!paged_ctrl) {
- return LDB_ERR_PROTOCOL_ERROR;
- }
-
- private_data = talloc_get_type(ldb_module_get_private(module),
- struct private_data);
-
- ac = talloc_zero(req, struct paged_context);
- if (ac == NULL) {
- ldb_set_errstring(ldb, "Out of Memory");
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->module = module;
- ac->req = req;
- ac->size = paged_ctrl->size;
- if (ac->size < 0) {
- /* apparently some clients send more than 2^31. This
- violates the ldap standard, but we need to cope */
- ac->size = 0x7FFFFFFF;
- }
-
- /* check if it is a continuation search the store */
- if (paged_ctrl->cookie_len == 0) {
- if (paged_ctrl->size == 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->store = new_store(private_data);
- if (ac->store == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_build_search_req_ex(&search_req, ldb, ac,
- req->op.search.base,
- req->op.search.scope,
- req->op.search.tree,
- req->op.search.attrs,
- req->controls,
- ac,
- paged_search_callback,
- req);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- /* save it locally and remove it from the list */
- /* we do not need to replace them later as we
- * are keeping the original req intact */
- if (!ldb_save_controls(control, search_req, &saved_controls)) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_request(module, search_req);
-
- } else {
- struct results_store *current = NULL;
-
- /* TODO: age out old outstanding requests */
- for (current = private_data->store; current; current = current->next) {
- if (strcmp(current->cookie, paged_ctrl->cookie) == 0) {
- current->timestamp = time(NULL);
- break;
- }
- }
- if (current == NULL) {
- return LDB_ERR_UNWILLING_TO_PERFORM;
- }
-
- ac->store = current;
-
- /* check if it is an abandon */
- if (ac->size == 0) {
- return ldb_module_done(req, NULL, NULL,
- LDB_SUCCESS);
- }
-
- ret = paged_results(ac);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(req, NULL, NULL, ret);
- }
- return ldb_module_done(req, ac->controls, NULL,
- LDB_SUCCESS);
- }
-}
-
-static int paged_request_init(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- struct private_data *data;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- data = talloc(module, struct private_data);
- if (data == NULL) {
- return LDB_ERR_OTHER;
- }
-
- data->next_free_id = 1;
- data->store = NULL;
- ldb_module_set_private(module, data);
-
- ret = ldb_mod_register_control(module, LDB_CONTROL_PAGED_RESULTS_OID);
- if (ret != LDB_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_WARNING,
- "paged_results:"
- "Unable to register control with rootdse!");
- }
-
- return ldb_next_init(module);
-}
-
-static const struct ldb_module_ops ldb_paged_results_module_ops = {
- .name = "paged_results",
- .search = paged_search,
- .init_context = paged_request_init
-};
-
-int ldb_paged_results_init(const char *version)
-{
- LDB_MODULE_CHECK_VERSION(version);
- return ldb_register_module(&ldb_paged_results_module_ops);
-}
diff --git a/source4/lib/ldb/modules/paged_searches.c b/source4/lib/ldb/modules/paged_searches.c
deleted file mode 100644
index 68eeb4c76e..0000000000
--- a/source4/lib/ldb/modules/paged_searches.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2005-2008
- Copyright (C) Andrew Bartlett <abartlet@samba.org> 2009
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: paged_searches
- *
- * Component: ldb paged searches module
- *
- * Description: this module detects if the remote ldap server supports
- * paged results and use them to transparently access all objects
- *
- * Author: Simo Sorce
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_module.h"
-
-#define PS_DEFAULT_PAGE_SIZE 500
-/* 500 objects per query seem to be a decent compromise
- * the default AD limit per request is 1000 entries */
-
-struct private_data {
-
- bool paged_supported;
-};
-
-struct ps_context {
- struct ldb_module *module;
- struct ldb_request *req;
-
- bool pending;
-
- char **saved_referrals;
- unsigned int num_referrals;
-
- struct ldb_request *down_req;
-};
-
-static int check_ps_continuation(struct ps_context *ac, struct ldb_request *req, struct ldb_reply *ares)
-{
- struct ldb_context *ldb;
- struct ldb_control *rep_control, *req_control;
- struct ldb_paged_control *paged_rep_control = NULL, *paged_req_control = NULL;
- ldb = ldb_module_get_ctx(ac->module);
-
- rep_control = ldb_reply_get_control(ares, LDB_CONTROL_PAGED_RESULTS_OID);
- if (rep_control) {
- paged_rep_control = talloc_get_type(rep_control->data, struct ldb_paged_control);
- }
-
- req_control = ldb_request_get_control(req, LDB_CONTROL_PAGED_RESULTS_OID);
- paged_req_control = talloc_get_type(req_control->data, struct ldb_paged_control);
-
- if (!rep_control || !paged_rep_control) {
- if (paged_req_control->cookie) {
- /* something wrong here - why give us a control back befre, but not one now? */
- ldb_set_errstring(ldb, "paged_searches: ERROR: We got back a control from a previous page, but this time no control was returned!");
- return LDB_ERR_OPERATIONS_ERROR;
- } else {
- /* No cookie received yet, valid to just return the full data set */
-
- /* we are done */
- ac->pending = false;
- return LDB_SUCCESS;
- }
- }
-
- if (paged_rep_control->cookie_len == 0) {
- /* we are done */
- ac->pending = false;
- return LDB_SUCCESS;
- }
-
- /* more processing required */
- /* let's fill in the request control with the new cookie */
- /* if there's a reply control we must find a request
- * control matching it */
-
- if (paged_req_control->cookie) {
- talloc_free(paged_req_control->cookie);
- }
-
- paged_req_control->cookie = talloc_memdup(req_control,
- paged_rep_control->cookie,
- paged_rep_control->cookie_len);
- paged_req_control->cookie_len = paged_rep_control->cookie_len;
-
- ac->pending = true;
- return LDB_SUCCESS;
-}
-
-static int store_referral(struct ps_context *ac, char *referral)
-{
- ac->saved_referrals = talloc_realloc(ac, ac->saved_referrals, char *, ac->num_referrals + 2);
- if (!ac->saved_referrals) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->saved_referrals[ac->num_referrals] = talloc_strdup(ac->saved_referrals, referral);
- if (!ac->saved_referrals[ac->num_referrals]) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->num_referrals++;
- ac->saved_referrals[ac->num_referrals] = NULL;
-
- return LDB_SUCCESS;
-}
-
-static int send_referrals(struct ps_context *ac)
-{
- struct ldb_reply *ares;
- int ret;
- unsigned int i;
-
- for (i = 0; i < ac->num_referrals; i++) {
- ares = talloc_zero(ac->req, struct ldb_reply);
- if (!ares) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ares->type = LDB_REPLY_REFERRAL;
- ares->referral = ac->saved_referrals[i];
-
- ret = ldb_module_send_referral(ac->req, ares->referral);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-static int ps_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct ps_context *ac;
- int ret;
-
- ac = talloc_get_type(req->context, struct ps_context);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- switch (ares->type) {
- case LDB_REPLY_ENTRY:
- ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL, ret);
- }
- break;
-
- case LDB_REPLY_REFERRAL:
- ret = store_referral(ac, ares->referral);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL, ret);
- }
- break;
-
- case LDB_REPLY_DONE:
-
- ret = check_ps_continuation(ac, req, ares);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL, ret);
- }
-
- if (ac->pending) {
-
- ret = ldb_next_request(ac->module, ac->down_req);
-
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req,
- NULL, NULL, ret);
- }
-
- } else {
-
- /* send referrals */
- ret = send_referrals(ac);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req,
- NULL, NULL, ret);
- }
-
- /* send REPLY_DONE */
- return ldb_module_done(ac->req, ares->controls,
- ares->response, LDB_SUCCESS);
- }
- break;
- }
-
- talloc_free(ares);
- return LDB_SUCCESS;
-}
-
-static int ps_search(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct private_data *private_data;
- struct ps_context *ac;
- struct ldb_paged_control *control;
- int ret;
-
- private_data = talloc_get_type(ldb_module_get_private(module), struct private_data);
- ldb = ldb_module_get_ctx(module);
-
- /* check if paging is supported */
- if (!private_data || !private_data->paged_supported) {
- /* do not touch this request paged controls not
- * supported or we
- * are just not setup yet */
- return ldb_next_request(module, req);
- }
-
- ac = talloc_zero(req, struct ps_context);
- if (ac == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->module = module;
- ac->req = req;
- ac->pending = false;
- ac->saved_referrals = NULL;
- ac->num_referrals = 0;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- control = talloc(ac, struct ldb_paged_control);
- if (!control) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- control->size = PS_DEFAULT_PAGE_SIZE;
- control->cookie = NULL;
- control->cookie_len = 0;
-
- ret = ldb_build_search_req_ex(&ac->down_req, ldb, ac,
- ac->req->op.search.base,
- ac->req->op.search.scope,
- ac->req->op.search.tree,
- ac->req->op.search.attrs,
- ac->req->controls,
- ac,
- ps_callback,
- ac->req);
- LDB_REQ_SET_LOCATION(ac->down_req);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ldb_request_add_control(ac->down_req, LDB_CONTROL_PAGED_RESULTS_OID,
- true, control);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- talloc_steal(ac->down_req, control);
-
- return ldb_next_request(ac->module, ac->down_req);
-}
-
-static int check_supported_paged(struct ldb_request *req,
- struct ldb_reply *ares)
-{
- struct private_data *data;
-
- data = talloc_get_type(req->context, struct private_data);
-
- if (!ares) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
-
- switch (ares->type) {
- case LDB_REPLY_ENTRY:
- if (ldb_msg_check_string_attribute(ares->message,
- "supportedControl",
- LDB_CONTROL_PAGED_RESULTS_OID)) {
- data->paged_supported = true;
- }
- break;
-
- case LDB_REPLY_REFERRAL:
- /* ignore */
- break;
-
- case LDB_REPLY_DONE:
- return ldb_request_done(req, LDB_SUCCESS);
- }
-
- talloc_free(ares);
- return LDB_SUCCESS;
-}
-
-static int ps_init(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- static const char *attrs[] = { "supportedControl", NULL };
- struct private_data *data;
- struct ldb_dn *base;
- int ret;
- struct ldb_request *req;
-
- ldb = ldb_module_get_ctx(module);
-
- data = talloc(module, struct private_data);
- if (data == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- data->paged_supported = false;
-
- ldb_module_set_private(module, data);
-
- base = ldb_dn_new(module, ldb, "");
- if (base == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ret = ldb_build_search_req(&req, ldb, module,
- base, LDB_SCOPE_BASE,
- "(objectClass=*)",
- attrs, NULL,
- data, check_supported_paged,
- NULL);
- LDB_REQ_SET_LOCATION(req);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ldb_next_request(module, req);
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- talloc_free(base);
- talloc_free(req);
-
- return ldb_next_init(module);
-}
-
-static const struct ldb_module_ops ldb_paged_searches_module_ops = {
- .name = "paged_searches",
- .search = ps_search,
- .init_context = ps_init
-};
-
-int ldb_paged_searches_init(const char *version)
-{
- LDB_MODULE_CHECK_VERSION(version);
- return ldb_register_module(&ldb_paged_searches_module_ops);
-}
diff --git a/source4/lib/ldb/modules/rdn_name.c b/source4/lib/ldb/modules/rdn_name.c
deleted file mode 100644
index 50b63aee13..0000000000
--- a/source4/lib/ldb/modules/rdn_name.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Bartlett 2005-2009
- Copyright (C) Simo Sorce 2006-2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: rdn_name
- *
- * Component: ldb rdn name module
- *
- * Description: keep a consistent name attribute on objects manpulations
- *
- * Author: Andrew Bartlett
- *
- * Modifications:
- * - made the module async
- * Simo Sorce Mar 2006
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_module.h"
-
-struct rename_context {
- struct ldb_module *module;
- struct ldb_request *req;
-
- struct ldb_reply *ares;
-};
-
-static int rdn_name_add_callback(struct ldb_request *req,
- struct ldb_reply *ares)
-{
- struct rename_context *ac;
-
- ac = talloc_get_type(req->context, struct rename_context);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- if (ares->type == LDB_REPLY_REFERRAL) {
- return ldb_module_send_referral(ac->req, ares->referral);
- }
-
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- if (ares->type != LDB_REPLY_DONE) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- return ldb_module_done(ac->req, ares->controls,
- ares->response, LDB_SUCCESS);
-}
-
-static int rdn_name_add(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct ldb_request *down_req;
- struct rename_context *ac;
- struct ldb_message *msg;
- struct ldb_message_element *attribute;
- const struct ldb_schema_attribute *a;
- const char *rdn_name;
- const struct ldb_val *rdn_val_p;
- struct ldb_val rdn_val;
- unsigned int i;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.add.message->dn)) {
- return ldb_next_request(module, req);
- }
-
- ac = talloc_zero(req, struct rename_context);
- if (ac == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->module = module;
- ac->req = req;
-
- msg = ldb_msg_copy_shallow(req, req->op.add.message);
- if (msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- rdn_name = ldb_dn_get_rdn_name(msg->dn);
- if (rdn_name == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- rdn_val_p = ldb_dn_get_rdn_val(msg->dn);
- if (rdn_val_p == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- if (rdn_val_p->length == 0) {
- ldb_asprintf_errstring(ldb, "Empty RDN value on %s not permitted!",
- ldb_dn_get_linearized(req->op.add.message->dn));
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
- rdn_val = ldb_val_dup(msg, rdn_val_p);
-
- /* Perhaps someone above us tried to set this? Then ignore it */
- ldb_msg_remove_attr(msg, "name");
-
- ret = ldb_msg_add_value(msg, "name", &rdn_val, NULL);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- a = ldb_schema_attribute_by_name(ldb, rdn_name);
- if (a == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- attribute = ldb_msg_find_element(msg, rdn_name);
- if (!attribute) {
- /* add entry with normalised RDN information if possible */
- if (a->name != NULL) {
- ret = ldb_msg_add_value(msg, a->name, &rdn_val, NULL);
- } else {
- ret = ldb_msg_add_value(msg, rdn_name, &rdn_val, NULL);
- }
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- } else {
- /* normalise attribute name if possible */
- if (a->name != NULL) {
- attribute->name = a->name;
- }
- /* normalise attribute value */
- for (i = 0; i < attribute->num_values; i++) {
- bool matched;
- if (a->syntax->operator_fn) {
- ret = a->syntax->operator_fn(ldb, LDB_OP_EQUALITY, a,
- &rdn_val, &attribute->values[i], &matched);
- if (ret != LDB_SUCCESS) return ret;
- } else {
- matched = (a->syntax->comparison_fn(ldb, msg,
- &rdn_val, &attribute->values[i]) == 0);
- }
- if (matched) {
- /* overwrite so it matches in case */
- attribute->values[i] = rdn_val;
- break;
- }
- }
- if (i == attribute->num_values) {
- char *rdn_errstring = talloc_asprintf(ac,
- "RDN mismatch on %s: %s (%.*s) should match one of:",
- ldb_dn_get_linearized(msg->dn), rdn_name,
- (int)rdn_val.length, (const char *)rdn_val.data);
- for (i = 0; i < attribute->num_values; i++) {
- rdn_errstring = talloc_asprintf_append(
- rdn_errstring, " (%.*s)",
- (int)attribute->values[i].length,
- (const char *)attribute->values[i].data);
- }
- ldb_set_errstring(ldb, rdn_errstring);
- /* Match AD's error here */
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
- }
-
- ret = ldb_build_add_req(&down_req, ldb, req,
- msg,
- req->controls,
- ac, rdn_name_add_callback,
- req);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- talloc_steal(down_req, msg);
-
- /* go on with the call chain */
- return ldb_next_request(module, down_req);
-}
-
-static int rdn_modify_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct rename_context *ac;
-
- ac = talloc_get_type(req->context, struct rename_context);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- if (ares->type == LDB_REPLY_REFERRAL) {
- return ldb_module_send_referral(ac->req, ares->referral);
- }
-
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- /* the only supported reply right now is a LDB_REPLY_DONE */
- if (ares->type != LDB_REPLY_DONE) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- /* send saved controls eventually */
- return ldb_module_done(ac->req, ac->ares->controls,
- ac->ares->response, LDB_SUCCESS);
-}
-
-static int rdn_rename_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct ldb_context *ldb;
- struct rename_context *ac;
- struct ldb_request *mod_req;
- const char *rdn_name;
- const struct ldb_val *rdn_val_p;
- struct ldb_val rdn_val;
- struct ldb_message *msg;
- int ret;
-
- ac = talloc_get_type(req->context, struct rename_context);
- ldb = ldb_module_get_ctx(ac->module);
-
- if (!ares) {
- goto error;
- }
-
- if (ares->type == LDB_REPLY_REFERRAL) {
- return ldb_module_send_referral(ac->req, ares->referral);
- }
-
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- /* the only supported reply right now is a LDB_REPLY_DONE */
- if (ares->type != LDB_REPLY_DONE) {
- goto error;
- }
-
- /* save reply for caller */
- ac->ares = talloc_steal(ac, ares);
-
- msg = ldb_msg_new(ac);
- if (msg == NULL) {
- goto error;
- }
- msg->dn = ldb_dn_copy(msg, ac->req->op.rename.newdn);
- if (msg->dn == NULL) {
- goto error;
- }
-
- rdn_name = ldb_dn_get_rdn_name(ac->req->op.rename.newdn);
- if (rdn_name == NULL) {
- goto error;
- }
-
- rdn_val_p = ldb_dn_get_rdn_val(msg->dn);
- if (rdn_val_p == NULL) {
- goto error;
- }
- if (rdn_val_p->length == 0) {
- ldb_asprintf_errstring(ldb, "Empty RDN value on %s not permitted!",
- ldb_dn_get_linearized(req->op.rename.olddn));
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_NAMING_VIOLATION);
- }
- rdn_val = ldb_val_dup(msg, rdn_val_p);
-
- if (ldb_msg_add_empty(msg, rdn_name, LDB_FLAG_MOD_REPLACE, NULL) != 0) {
- goto error;
- }
- if (ldb_msg_add_value(msg, rdn_name, &rdn_val, NULL) != 0) {
- goto error;
- }
- if (ldb_msg_add_empty(msg, "name", LDB_FLAG_MOD_REPLACE, NULL) != 0) {
- goto error;
- }
- if (ldb_msg_add_value(msg, "name", &rdn_val, NULL) != 0) {
- goto error;
- }
-
- ret = ldb_build_mod_req(&mod_req, ldb,
- ac, msg, NULL,
- ac, rdn_modify_callback,
- req);
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(ac->req, NULL, NULL, ret);
- }
- talloc_steal(mod_req, msg);
-
- /* go on with the call chain */
- return ldb_next_request(ac->module, mod_req);
-
-error:
- return ldb_module_done(ac->req, NULL, NULL, LDB_ERR_OPERATIONS_ERROR);
-}
-
-static int rdn_name_rename(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- struct rename_context *ac;
- struct ldb_request *down_req;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.rename.newdn)) {
- return ldb_next_request(module, req);
- }
-
- ac = talloc_zero(req, struct rename_context);
- if (ac == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->module = module;
- ac->req = req;
-
- ret = ldb_build_rename_req(&down_req,
- ldb,
- ac,
- req->op.rename.olddn,
- req->op.rename.newdn,
- req->controls,
- ac,
- rdn_rename_callback,
- req);
-
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- /* rename first, modify "name" if rename is ok */
- return ldb_next_request(module, down_req);
-}
-
-static int rdn_name_modify(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- const struct ldb_val *rdn_val_p;
-
- ldb = ldb_module_get_ctx(module);
-
- /* do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.mod.message->dn)) {
- return ldb_next_request(module, req);
- }
-
- rdn_val_p = ldb_dn_get_rdn_val(req->op.mod.message->dn);
- if (rdn_val_p == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- if (rdn_val_p->length == 0) {
- ldb_asprintf_errstring(ldb, "Empty RDN value on %s not permitted!",
- ldb_dn_get_linearized(req->op.mod.message->dn));
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- if (ldb_msg_find_element(req->op.mod.message, "distinguishedName")) {
- ldb_asprintf_errstring(ldb, "Modify of 'distinguishedName' on %s not permitted, must use 'rename' operation instead",
- ldb_dn_get_linearized(req->op.mod.message->dn));
- return LDB_ERR_CONSTRAINT_VIOLATION;
- }
-
- if (ldb_msg_find_element(req->op.mod.message, "name")) {
- ldb_asprintf_errstring(ldb, "Modify of 'name' on %s not permitted, must use 'rename' operation instead",
- ldb_dn_get_linearized(req->op.mod.message->dn));
- return LDB_ERR_NOT_ALLOWED_ON_RDN;
- }
-
- if (ldb_msg_find_element(req->op.mod.message, ldb_dn_get_rdn_name(req->op.mod.message->dn))) {
- ldb_asprintf_errstring(ldb, "Modify of RDN '%s' on %s not permitted, must use 'rename' operation instead",
- ldb_dn_get_rdn_name(req->op.mod.message->dn), ldb_dn_get_linearized(req->op.mod.message->dn));
- return LDB_ERR_NOT_ALLOWED_ON_RDN;
- }
-
- /* All OK, they kept their fingers out of the special attributes */
- return ldb_next_request(module, req);
-}
-
-static int rdn_name_search(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_context *ldb;
- const char *rdn_name;
- const struct ldb_val *rdn_val_p;
-
- ldb = ldb_module_get_ctx(module);
-
- /* do not manipulate our control entries */
- if (ldb_dn_is_special(req->op.search.base)) {
- return ldb_next_request(module, req);
- }
-
- rdn_name = ldb_dn_get_rdn_name(req->op.search.base);
- rdn_val_p = ldb_dn_get_rdn_val(req->op.search.base);
- if ((rdn_name != NULL) && (rdn_val_p == NULL)) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- if ((rdn_val_p != NULL) && (rdn_val_p->length == 0)) {
- ldb_asprintf_errstring(ldb, "Empty RDN value on %s not permitted!",
- ldb_dn_get_linearized(req->op.search.base));
- return LDB_ERR_INVALID_DN_SYNTAX;
- }
-
- return ldb_next_request(module, req);
-}
-
-static const struct ldb_module_ops ldb_rdn_name_module_ops = {
- .name = "rdn_name",
- .add = rdn_name_add,
- .modify = rdn_name_modify,
- .rename = rdn_name_rename,
- .search = rdn_name_search
-};
-
-int ldb_rdn_name_init(const char *version)
-{
- LDB_MODULE_CHECK_VERSION(version);
- return ldb_register_module(&ldb_rdn_name_module_ops);
-}
diff --git a/source4/lib/ldb/modules/skel.c b/source4/lib/ldb/modules/skel.c
deleted file mode 100644
index 1ce3ec1df9..0000000000
--- a/source4/lib/ldb/modules/skel.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb skel module
- *
- * Description: example module
- *
- * Author: Simo Sorce
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_module.h"
-
-struct private_data {
-
- char *some_private_data;
-};
-
-/* search */
-static int skel_search(struct ldb_module *module, struct ldb_request *req)
-{
- return ldb_next_request(module, req);
-}
-
-/* add */
-static int skel_add(struct ldb_module *module, struct ldb_request *req){
- return ldb_next_request(module, req);
-}
-
-/* modify */
-static int skel_modify(struct ldb_module *module, struct ldb_request *req)
-{
- return ldb_next_request(module, req);
-}
-
-/* delete */
-static int skel_delete(struct ldb_module *module, struct ldb_request *req)
-{
- return ldb_next_request(module, req);
-}
-
-/* rename */
-static int skel_rename(struct ldb_module *module, struct ldb_request *req)
-{
- return ldb_next_request(module, req);
-}
-
-/* start a transaction */
-static int skel_start_trans(struct ldb_module *module)
-{
- return ldb_next_start_trans(module);
-}
-
-/* end a transaction */
-static int skel_end_trans(struct ldb_module *module)
-{
- return ldb_next_end_trans(module);
-}
-
-/* delete a transaction */
-static int skel_del_trans(struct ldb_module *module)
-{
- return ldb_next_del_trans(module);
-}
-
-static int skel_destructor(struct ldb_module *ctx)
-{
- struct private_data *data;
-
- data = talloc_get_type(ldb_module_get_private(ctx), struct private_data);
-
- /* put your clean-up functions here */
- if (data->some_private_data) talloc_free(data->some_private_data);
-
- return 0;
-}
-
-static int skel_request(struct ldb_module *module, struct ldb_request *req)
-{
- return ldb_next_request(module, req);
-}
-
-static int skel_init(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- struct private_data *data;
-
- ldb = ldb_module_get_ctx(module);
-
- data = talloc(module, struct private_data);
- if (data == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- data->some_private_data = NULL;
- ldb_module_set_private(module, data);
-
- talloc_set_destructor (module, skel_destructor);
-
- return ldb_next_init(module);
-}
-
-static const struct ldb_module_ops ldb_skel_module_ops = {
- .name = "skel",
- .init_context = skel_init,
- .search = skel_search,
- .add = skel_add,
- .modify = skel_modify,
- .del = skel_delete,
- .rename = skel_rename,
- .request = skel_request,
- .start_transaction = skel_start_trans,
- .end_transaction = skel_end_trans,
- .del_transaction = skel_del_trans,
-};
-
-int ldb_skel_init(const char *version)
-{
- LDB_MODULE_CHECK_VERSION(version);
- return ldb_register_module(&ldb_skel_module_ops);
-}
diff --git a/source4/lib/ldb/modules/sort.c b/source4/lib/ldb/modules/sort.c
deleted file mode 100644
index c6fce2d96e..0000000000
--- a/source4/lib/ldb/modules/sort.c
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Simo Sorce 2005-2008
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldb server side sort control module
- *
- * Description: this module sorts the results of a search
- *
- * Author: Simo Sorce
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_module.h"
-
-struct opaque {
- struct ldb_context *ldb;
- const struct ldb_attrib_handler *h;
- const char *attribute;
- int reverse;
- int result;
-};
-
-struct sort_context {
- struct ldb_module *module;
-
- const char *attributeName;
- const char *orderingRule;
- int reverse;
-
- struct ldb_request *req;
- struct ldb_message **msgs;
- char **referrals;
- unsigned int num_msgs;
- unsigned int num_refs;
-
- const struct ldb_schema_attribute *a;
- int sort_result;
-};
-
-static int build_response(void *mem_ctx, struct ldb_control ***ctrls, int result, const char *desc)
-{
- struct ldb_control **controls;
- struct ldb_sort_resp_control *resp;
- unsigned int i;
-
- if (*ctrls) {
- controls = *ctrls;
- for (i = 0; controls[i]; i++);
- controls = talloc_realloc(mem_ctx, controls, struct ldb_control *, i + 2);
- } else {
- i = 0;
- controls = talloc_array(mem_ctx, struct ldb_control *, 2);
- }
- if (! controls )
- return LDB_ERR_OPERATIONS_ERROR;
-
- *ctrls = controls;
-
- controls[i+1] = NULL;
- controls[i] = talloc(controls, struct ldb_control);
- if (! controls[i] )
- return LDB_ERR_OPERATIONS_ERROR;
-
- controls[i]->oid = LDB_CONTROL_SORT_RESP_OID;
- controls[i]->critical = 0;
-
- resp = talloc(controls[i], struct ldb_sort_resp_control);
- if (! resp )
- return LDB_ERR_OPERATIONS_ERROR;
-
- resp->result = result;
- resp->attr_desc = talloc_strdup(resp, desc);
-
- if (! resp->attr_desc )
- return LDB_ERR_OPERATIONS_ERROR;
-
- controls[i]->data = resp;
-
- return LDB_SUCCESS;
-}
-
-static int sort_compare(struct ldb_message **msg1, struct ldb_message **msg2, void *opaque)
-{
- struct sort_context *ac = talloc_get_type(opaque, struct sort_context);
- struct ldb_message_element *el1, *el2;
- struct ldb_context *ldb;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- if (ac->sort_result != 0) {
- /* an error occurred previously,
- * let's exit the sorting by returning always 0 */
- return 0;
- }
-
- el1 = ldb_msg_find_element(*msg1, ac->attributeName);
- el2 = ldb_msg_find_element(*msg2, ac->attributeName);
-
- if (!el1 && el2) {
- return 1;
- }
- if (el1 && !el2) {
- return -1;
- }
- if (!el1 && !el2) {
- return 0;
- }
-
- if (ac->reverse)
- return ac->a->syntax->comparison_fn(ldb, ac, &el2->values[0], &el1->values[0]);
-
- return ac->a->syntax->comparison_fn(ldb, ac, &el1->values[0], &el2->values[0]);
-}
-
-static int server_sort_results(struct sort_context *ac)
-{
- struct ldb_context *ldb;
- struct ldb_reply *ares;
- unsigned int i;
- int ret;
-
- ldb = ldb_module_get_ctx(ac->module);
-
- ac->a = ldb_schema_attribute_by_name(ldb, ac->attributeName);
- ac->sort_result = 0;
-
- LDB_TYPESAFE_QSORT(ac->msgs, ac->num_msgs, ac, sort_compare);
-
- if (ac->sort_result != LDB_SUCCESS) {
- return ac->sort_result;
- }
-
- for (i = 0; i < ac->num_msgs; i++) {
- ares = talloc_zero(ac, struct ldb_reply);
- if (!ares) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ares->type = LDB_REPLY_ENTRY;
- ares->message = talloc_move(ares, &ac->msgs[i]);
-
- ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- for (i = 0; i < ac->num_refs; i++) {
- ares = talloc_zero(ac, struct ldb_reply);
- if (!ares) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ares->type = LDB_REPLY_REFERRAL;
- ares->referral = talloc_move(ares, &ac->referrals[i]);
-
- ret = ldb_module_send_referral(ac->req, ares->referral);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
- }
-
- return LDB_SUCCESS;
-}
-
-static int server_sort_search_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct sort_context *ac;
- struct ldb_context *ldb;
- int ret;
-
- ac = talloc_get_type(req->context, struct sort_context);
- ldb = ldb_module_get_ctx(ac->module);
-
- if (!ares) {
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ares->error);
- }
-
- switch (ares->type) {
- case LDB_REPLY_ENTRY:
- ac->msgs = talloc_realloc(ac, ac->msgs, struct ldb_message *, ac->num_msgs + 2);
- if (! ac->msgs) {
- talloc_free(ares);
- ldb_oom(ldb);
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- ac->msgs[ac->num_msgs] = talloc_steal(ac->msgs, ares->message);
- ac->num_msgs++;
- ac->msgs[ac->num_msgs] = NULL;
-
- break;
-
- case LDB_REPLY_REFERRAL:
- ac->referrals = talloc_realloc(ac, ac->referrals, char *, ac->num_refs + 2);
- if (! ac->referrals) {
- talloc_free(ares);
- ldb_oom(ldb);
- return ldb_module_done(ac->req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- ac->referrals[ac->num_refs] = talloc_steal(ac->referrals, ares->referral);
- ac->num_refs++;
- ac->referrals[ac->num_refs] = NULL;
-
- break;
-
- case LDB_REPLY_DONE:
-
- ret = server_sort_results(ac);
- return ldb_module_done(ac->req, ares->controls,
- ares->response, ret);
- }
-
- talloc_free(ares);
- return LDB_SUCCESS;
-}
-
-static int server_sort_search(struct ldb_module *module, struct ldb_request *req)
-{
- struct ldb_control *control;
- struct ldb_server_sort_control **sort_ctrls;
- struct ldb_control **saved_controls;
- struct ldb_control **controls;
- struct ldb_request *down_req;
- struct sort_context *ac;
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- /* check if there's a server sort control */
- control = ldb_request_get_control(req, LDB_CONTROL_SERVER_SORT_OID);
- if (control == NULL) {
- /* not found go on */
- return ldb_next_request(module, req);
- }
-
- ac = talloc_zero(req, struct sort_context);
- if (ac == NULL) {
- ldb_oom(ldb);
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ac->module = module;
- ac->req = req;
-
- sort_ctrls = talloc_get_type(control->data, struct ldb_server_sort_control *);
- if (!sort_ctrls) {
- return LDB_ERR_PROTOCOL_ERROR;
- }
-
- /* FIXME: we do not support more than one attribute for sorting right now */
- /* FIXME: we need to check if the attribute type exist or return an error */
-
- if (sort_ctrls[1] != NULL) {
- if (control->critical) {
-
- /* callback immediately */
- ret = build_response(req, &controls,
- LDB_ERR_UNWILLING_TO_PERFORM,
- "sort control is not complete yet");
- if (ret != LDB_SUCCESS) {
- return ldb_module_done(req, NULL, NULL,
- LDB_ERR_OPERATIONS_ERROR);
- }
-
- return ldb_module_done(req, controls, NULL, ret);
- } else {
- /* just pass the call down and don't do any sorting */
- return ldb_next_request(module, req);
- }
- }
-
- ac->attributeName = sort_ctrls[0]->attributeName;
- ac->orderingRule = sort_ctrls[0]->orderingRule;
- ac->reverse = sort_ctrls[0]->reverse;
-
- ret = ldb_build_search_req_ex(&down_req, ldb, ac,
- req->op.search.base,
- req->op.search.scope,
- req->op.search.tree,
- req->op.search.attrs,
- req->controls,
- ac,
- server_sort_search_callback,
- req);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- /* save it locally and remove it from the list */
- /* we do not need to replace them later as we
- * are keeping the original req intact */
- if (!ldb_save_controls(control, down_req, &saved_controls)) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- return ldb_next_request(module, down_req);
-}
-
-static int server_sort_init(struct ldb_module *module)
-{
- struct ldb_context *ldb;
- int ret;
-
- ldb = ldb_module_get_ctx(module);
-
- ret = ldb_mod_register_control(module, LDB_CONTROL_SERVER_SORT_OID);
- if (ret != LDB_SUCCESS) {
- ldb_debug(ldb, LDB_DEBUG_WARNING,
- "server_sort:"
- "Unable to register control with rootdse!");
- }
-
- return ldb_next_init(module);
-}
-
-static const struct ldb_module_ops ldb_server_sort_module_ops = {
- .name = "server_sort",
- .search = server_sort_search,
- .init_context = server_sort_init
-};
-
-int ldb_server_sort_init(const char *version)
-{
- LDB_MODULE_CHECK_VERSION(version);
- return ldb_register_module(&ldb_server_sort_module_ops);
-}
diff --git a/source4/lib/ldb/nssldb/README.txt b/source4/lib/ldb/nssldb/README.txt
deleted file mode 100644
index ddba62b380..0000000000
--- a/source4/lib/ldb/nssldb/README.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-
-This test code requires a tdb that is configured for to use the asq module.
-You can do that adding the following record to a tdb:
-
-dn: @MODULES
-@LIST: asq
-
-Other modules can be used as well (like rdn_name for example)
-
-The uidNumber 0 and the gidNumber 0 are considered invalid.
-
-The user records should contain the followin attributes:
-uid (required) the user name
-userPassword (optional) the user password (if not present "LDB" is
- returned in the password field)
-uidNumber (required) the user uid
-gidNumber (required) the user primary gid
-gecos (optional) the GECOS
-homeDirectory (required) the home directory
-loginShell (required) the login shell
-memberOf (required) all the groups the user is member of should
- be reported here using their DNs. The
- primary group as well.
-
-The group accounts should contain the following attributes:
-cn (required) the group name
-uesrPassword (optional) the group password (if not present "LDB" is
- returned in the password field)
-gidNumber (required) the group gid
-member (optional) the DNs of the member users, also the ones
- that have this group as primary
-
-
-SSS
diff --git a/source4/lib/ldb/nssldb/ldb-grp.c b/source4/lib/ldb/nssldb/ldb-grp.c
deleted file mode 100644
index 5e7556dc73..0000000000
--- a/source4/lib/ldb/nssldb/ldb-grp.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- LDB nsswitch module
-
- Copyright (C) Simo Sorce 2006
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "ldb-nss.h"
-
-extern struct _ldb_nss_context *_ldb_nss_ctx;
-
-const char *_ldb_nss_gr_attrs[] = {
- "cn",
- "userPassword",
- "gidNumber",
- NULL
-};
-
-const char *_ldb_nss_mem_attrs[] = {
- "uid",
- NULL
-};
-
-#define _NSS_LDB_ENOMEM(amem) \
- do { \
- if ( ! amem) { \
- errno = ENOMEM; \
- talloc_free(memctx); \
- return NSS_STATUS_UNAVAIL; \
- } \
- } while(0)
-
-/* This setgrent, getgrent, endgrent is not very efficient */
-
-NSS_STATUS _nss_ldb_setgrent(void)
-{
- int ret;
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- _ldb_nss_ctx->gr_cur = 0;
- if (_ldb_nss_ctx->gr_res != NULL) {
- talloc_free(_ldb_nss_ctx->gr_res);
- _ldb_nss_ctx->gr_res = NULL;
- }
-
- ret = ldb_search(_ldb_nss_ctx->ldb,
- _ldb_nss_ctx->ldb,
- &_ldb_nss_ctx->gr_res,
- _ldb_nss_ctx->base,
- LDB_SCOPE_SUBTREE,
- _ldb_nss_gr_attrs,
- _LDB_NSS_GRENT_FILTER);
- if (ret != LDB_SUCCESS) {
- return NSS_STATUS_UNAVAIL;
- }
-
- return NSS_STATUS_SUCCESS;
-}
-
-NSS_STATUS _nss_ldb_endgrent(void)
-{
- int ret;
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- _ldb_nss_ctx->gr_cur = 0;
- if (_ldb_nss_ctx->gr_res) {
- talloc_free(_ldb_nss_ctx->gr_res);
- _ldb_nss_ctx->gr_res = NULL;
- }
-
- return NSS_STATUS_SUCCESS;
-}
-
-NSS_STATUS _nss_ldb_getgrent_r(struct group *result_buf, char *buffer, size_t buflen, int *errnop)
-{
- int ret;
- struct ldb_result *res;
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- *errnop = 0;
-
- if (_ldb_nss_ctx->gr_cur >= _ldb_nss_ctx->gr_res->count) {
- /* already returned all entries */
- return NSS_STATUS_NOTFOUND;
- }
-
- res = talloc_zero(_ldb_nss_ctx->gr_res, struct ldb_result);
- if ( ! res) {
- errno = *errnop = ENOMEM;
- _ldb_nss_ctx->gr_cur++; /* skip this entry */
- return NSS_STATUS_UNAVAIL;
- }
-
- ret = _ldb_nss_group_request(&res,
- _ldb_nss_ctx->gr_res->msgs[_ldb_nss_ctx->gr_cur]->dn,
- _ldb_nss_mem_attrs,
- "member");
-
- if (ret != NSS_STATUS_SUCCESS) {
- *errnop = errno;
- talloc_free(res);
- _ldb_nss_ctx->gr_cur++; /* skip this entry */
- return ret;
- }
-
- ret = _ldb_nss_fill_group(result_buf,
- buffer,
- buflen,
- errnop,
- _ldb_nss_ctx->gr_res->msgs[_ldb_nss_ctx->gr_cur],
- res);
-
- talloc_free(res);
-
- if (ret != NSS_STATUS_SUCCESS) {
- if (ret != NSS_STATUS_TRYAGAIN) {
- _ldb_nss_ctx->gr_cur++; /* skip this entry */
- }
- return ret;
- }
-
- /* this entry is ok, increment counter to nex entry */
- _ldb_nss_ctx->gr_cur++;
-
- return NSS_STATUS_SUCCESS;
-}
-
-NSS_STATUS _nss_ldb_getgrnam_r(const char *name, struct group *result_buf, char *buffer, size_t buflen, int *errnop)
-{
- int ret;
- char *filter;
- TALLOC_CTX *ctx;
- struct ldb_result *gr_res;
- struct ldb_result *mem_res;
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- ctx = talloc_new(_ldb_nss_ctx->ldb);
- if ( ! ctx) {
- *errnop = errno = ENOMEM;
- return NSS_STATUS_UNAVAIL;
- }
-
- /* build the filter for this uid */
- filter = talloc_asprintf(ctx, _LDB_NSS_GRNAM_FILTER, name);
- if (filter == NULL) {
- /* this is a fatal error */
- *errnop = errno = ENOMEM;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- /* search the entry */
- ret = ldb_search(_ldb_nss_ctx->ldb,
- _ldb_nss_ctx->ldb,
- &gr_res,
- _ldb_nss_ctx->base,
- LDB_SCOPE_SUBTREE,
- _ldb_nss_gr_attrs,
- filter);
- if (ret != LDB_SUCCESS) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- talloc_steal(ctx, gr_res);
-
- /* if none found return */
- if (gr_res->count == 0) {
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_NOTFOUND;
- goto done;
- }
-
- if (gr_res->count != 1) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- mem_res = talloc_zero(ctx, struct ldb_result);
- if ( ! mem_res) {
- errno = *errnop = ENOMEM;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- ret = _ldb_nss_group_request(&mem_res,
- gr_res->msgs[0]->dn,
- _ldb_nss_mem_attrs,
- "member");
-
- if (ret != NSS_STATUS_SUCCESS) {
- *errnop = errno;
- goto done;
- }
-
- ret = _ldb_nss_fill_group(result_buf,
- buffer,
- buflen,
- errnop,
- gr_res->msgs[0],
- mem_res);
-
- if (ret != NSS_STATUS_SUCCESS) {
- goto done;
- }
-
- ret = NSS_STATUS_SUCCESS;
-done:
- talloc_free(ctx);
- return ret;
-}
-
-NSS_STATUS _nss_ldb_getgrgid_r(gid_t gid, struct group *result_buf, char *buffer, size_t buflen, int *errnop)
-{
- int ret;
- char *filter;
- TALLOC_CTX *ctx;
- struct ldb_result *gr_res;
- struct ldb_result *mem_res;
-
- if (gid == 0) { /* we don't serve root gid by policy */
- *errnop = errno = ENOENT;
- return NSS_STATUS_NOTFOUND;
- }
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- ctx = talloc_new(_ldb_nss_ctx->ldb);
- if ( ! ctx) {
- *errnop = errno = ENOMEM;
- return NSS_STATUS_UNAVAIL;
- }
-
- /* build the filter for this uid */
- filter = talloc_asprintf(ctx, _LDB_NSS_GRGID_FILTER, gid);
- if (filter == NULL) {
- /* this is a fatal error */
- *errnop = errno = ENOMEM;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- /* search the entry */
- ret = ldb_search(_ldb_nss_ctx->ldb,
- _ldb_nss_ctx->ldb,
- &gr_res,
- _ldb_nss_ctx->base,
- LDB_SCOPE_SUBTREE,
- _ldb_nss_gr_attrs,
- filter);
- if (ret != LDB_SUCCESS) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- talloc_steal(ctx, gr_res);
-
- /* if none found return */
- if (gr_res->count == 0) {
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_NOTFOUND;
- goto done;
- }
-
- if (gr_res->count != 1) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- mem_res = talloc_zero(ctx, struct ldb_result);
- if ( ! mem_res) {
- errno = *errnop = ENOMEM;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- ret = _ldb_nss_group_request(&mem_res,
- gr_res->msgs[0]->dn,
- _ldb_nss_mem_attrs,
- "member");
-
- if (ret != NSS_STATUS_SUCCESS) {
- *errnop = errno;
- goto done;
- }
-
- ret = _ldb_nss_fill_group(result_buf,
- buffer,
- buflen,
- errnop,
- gr_res->msgs[0],
- mem_res);
-
- if (ret != NSS_STATUS_SUCCESS) {
- goto done;
- }
-
- ret = NSS_STATUS_SUCCESS;
-done:
- talloc_free(ctx);
- return ret;
-}
-
-NSS_STATUS _nss_ldb_initgroups_dyn(const char *user, gid_t group, long int *start, long int *size, gid_t **groups, long int limit, int *errnop)
-{
- int ret;
- char *filter;
- const char * attrs[] = { "uidNumber", "gidNumber", NULL };
- struct ldb_result *uid_res;
- struct ldb_result *mem_res;
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- mem_res = talloc_zero(_ldb_nss_ctx, struct ldb_result);
- if ( ! mem_res) {
- errno = *errnop = ENOMEM;
- return NSS_STATUS_UNAVAIL;
- }
-
- /* build the filter for this name */
- filter = talloc_asprintf(mem_res, _LDB_NSS_PWNAM_FILTER, user);
- if (filter == NULL) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- /* search the entry */
- ret = ldb_search(_ldb_nss_ctx->ldb,
- _ldb_nss_ctx->ldb,
- &uid_res,
- _ldb_nss_ctx->base,
- LDB_SCOPE_SUBTREE,
- attrs,
- filter);
- if (ret != LDB_SUCCESS) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- talloc_steal(mem_res, uid_res);
-
- /* if none found return */
- if (uid_res->count == 0) {
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_NOTFOUND;
- goto done;
- }
-
- if (uid_res->count != 1) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- ret = _ldb_nss_group_request(&mem_res,
- uid_res->msgs[0]->dn,
- attrs,
- "memberOf");
-
- if (ret != NSS_STATUS_SUCCESS) {
- *errnop = errno;
- goto done;
- }
-
- ret = _ldb_nss_fill_initgr(group,
- limit,
- start,
- size,
- groups,
- errnop,
- mem_res);
-
- if (ret != NSS_STATUS_SUCCESS) {
- goto done;
- }
-
- ret = NSS_STATUS_SUCCESS;
-
-done:
- talloc_free(mem_res);
- return ret;
-}
diff --git a/source4/lib/ldb/nssldb/ldb-nss.c b/source4/lib/ldb/nssldb/ldb-nss.c
deleted file mode 100644
index 92b0635561..0000000000
--- a/source4/lib/ldb/nssldb/ldb-nss.c
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- LDB nsswitch module
-
- Copyright (C) Simo Sorce 2006
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "ldb-nss.h"
-
-struct _ldb_nss_context *_ldb_nss_ctx = NULL;
-
-NSS_STATUS _ldb_nss_init(void)
-{
- int ret;
-
- pid_t mypid = getpid();
-
- if (_ldb_nss_ctx != NULL) {
- if (_ldb_nss_ctx->pid == mypid) {
- /* already initialized */
- return NSS_STATUS_SUCCESS;
- } else {
- /* we are in a forked child now, reinitialize */
- talloc_free(_ldb_nss_ctx);
- _ldb_nss_ctx = NULL;
- }
- }
-
- _ldb_nss_ctx = talloc_named(NULL, 0, "_ldb_nss_ctx(%u)", mypid);
- if (_ldb_nss_ctx == NULL) {
- return NSS_STATUS_UNAVAIL;
- }
-
- _ldb_nss_ctx->pid = mypid;
-
- _ldb_nss_ctx->ldb = ldb_init(_ldb_nss_ctx, NULL);
- if (_ldb_nss_ctx->ldb == NULL) {
- goto failed;
- }
-
- ret = ldb_connect(_ldb_nss_ctx->ldb, _LDB_NSS_URL, LDB_FLG_RDONLY, NULL);
- if (ret != LDB_SUCCESS) {
- goto failed;
- }
-
- _ldb_nss_ctx->base = ldb_dn_new(_ldb_nss_ctx, _ldb_nss_ctx->ldb, _LDB_NSS_BASEDN);
- if ( ! ldb_dn_validate(_ldb_nss_ctx->base)) {
- goto failed;
- }
-
- _ldb_nss_ctx->pw_cur = 0;
- _ldb_nss_ctx->pw_res = NULL;
- _ldb_nss_ctx->gr_cur = 0;
- _ldb_nss_ctx->gr_res = NULL;
-
- return NSS_STATUS_SUCCESS;
-
-failed:
- /* talloc_free(_ldb_nss_ctx); */
- _ldb_nss_ctx = NULL;
- return NSS_STATUS_UNAVAIL;
-}
-
-NSS_STATUS _ldb_nss_fill_passwd(struct passwd *result,
- char *buffer,
- int buflen,
- int *errnop,
- struct ldb_message *msg)
-{
- int len;
- int bufpos;
- const char *tmp;
-
- bufpos = 0;
-
- /* get username */
- tmp = ldb_msg_find_attr_as_string(msg, "uid", NULL);
- if (tmp == NULL) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- return NSS_STATUS_UNAVAIL;
- }
- len = strlen(tmp)+1;
- if (bufpos + len > buflen) {
- /* buffer too small */
- *errnop = errno = EAGAIN;
- return NSS_STATUS_TRYAGAIN;
- }
- memcpy(&buffer[bufpos], tmp, len);
- result->pw_name = &buffer[bufpos];
- bufpos += len;
-
- /* get userPassword */
- tmp = ldb_msg_find_attr_as_string(msg, "userPassword", NULL);
- if (tmp == NULL) {
- tmp = "LDB";
- }
- len = strlen(tmp)+1;
- if (bufpos + len > buflen) {
- /* buffer too small */
- *errnop = errno = EAGAIN;
- return NSS_STATUS_TRYAGAIN;
- }
- memcpy(&buffer[bufpos], tmp, len);
- result->pw_passwd = &buffer[bufpos];
- bufpos += len;
-
- /* this backend never serves an uid 0 user */
- result->pw_uid = ldb_msg_find_attr_as_int(msg, "uidNumber", 0);
- if (result->pw_uid == 0) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- return NSS_STATUS_UNAVAIL;
- }
-
- result->pw_gid = ldb_msg_find_attr_as_int(msg, "gidNumber", 0);
- if (result->pw_gid == 0) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- return NSS_STATUS_UNAVAIL;
- }
-
- /* get gecos */
- tmp = ldb_msg_find_attr_as_string(msg, "gecos", NULL);
- if (tmp == NULL) {
- tmp = "";
- }
- len = strlen(tmp)+1;
- if (bufpos + len > buflen) {
- /* buffer too small */
- *errnop = errno = EAGAIN;
- return NSS_STATUS_TRYAGAIN;
- }
- memcpy(&buffer[bufpos], tmp, len);
- result->pw_gecos = &buffer[bufpos];
- bufpos += len;
-
- /* get homeDirectory */
- tmp = ldb_msg_find_attr_as_string(msg, "homeDirectory", NULL);
- if (tmp == NULL) {
- tmp = "";
- }
- len = strlen(tmp)+1;
- if (bufpos + len > buflen) {
- /* buffer too small */
- *errnop = errno = EAGAIN;
- return NSS_STATUS_TRYAGAIN;
- }
- memcpy(&buffer[bufpos], tmp, len);
- result->pw_dir = &buffer[bufpos];
- bufpos += len;
-
- /* get shell */
- tmp = ldb_msg_find_attr_as_string(msg, "loginShell", NULL);
- if (tmp == NULL) {
- tmp = "";
- }
- len = strlen(tmp)+1;
- if (bufpos + len > buflen) {
- /* buffer too small */
- *errnop = errno = EAGAIN;
- return NSS_STATUS_TRYAGAIN;
- }
- memcpy(&buffer[bufpos], tmp, len);
- result->pw_shell = &buffer[bufpos];
- bufpos += len;
-
- return NSS_STATUS_SUCCESS;
-}
-
-NSS_STATUS _ldb_nss_fill_group(struct group *result,
- char *buffer,
- int buflen,
- int *errnop,
- struct ldb_message *group,
- struct ldb_result *members)
-{
- const char *tmp;
- size_t len;
- size_t bufpos;
- size_t lsize;
- unsigned int i;
-
- bufpos = 0;
-
- /* get group name */
- tmp = ldb_msg_find_attr_as_string(group, "cn", NULL);
- if (tmp == NULL) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- return NSS_STATUS_UNAVAIL;
- }
- len = strlen(tmp)+1;
- if (bufpos + len > buflen) {
- /* buffer too small */
- *errnop = errno = EAGAIN;
- return NSS_STATUS_TRYAGAIN;
- }
- memcpy(&buffer[bufpos], tmp, len);
- result->gr_name = &buffer[bufpos];
- bufpos += len;
-
- /* get userPassword */
- tmp = ldb_msg_find_attr_as_string(group, "userPassword", NULL);
- if (tmp == NULL) {
- tmp = "LDB";
- }
- len = strlen(tmp)+1;
- if (bufpos + len > buflen) {
- /* buffer too small */
- *errnop = errno = EAGAIN;
- return NSS_STATUS_TRYAGAIN;
- }
- memcpy(&buffer[bufpos], tmp, len);
- result->gr_passwd = &buffer[bufpos];
- bufpos += len;
-
- result->gr_gid = ldb_msg_find_attr_as_int(group, "gidNumber", 0);
- if (result->gr_gid == 0) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- return NSS_STATUS_UNAVAIL;
- }
-
- /* check if there is enough memory for the list of pointers */
- lsize = (members->count + 1) * sizeof(char *);
-
- /* align buffer on pointer boundary */
- bufpos += (sizeof(char*) - ((unsigned long)(buffer) % sizeof(char*)));
- if ((buflen - bufpos) < lsize) {
- /* buffer too small */
- *errnop = errno = EAGAIN;
- return NSS_STATUS_TRYAGAIN;
- }
-
- result->gr_mem = (char **)&buffer[bufpos];
- bufpos += lsize;
-
- for (i = 0; i < members->count; i++) {
- tmp = ldb_msg_find_attr_as_string(members->msgs[i], "uid", NULL);
- if (tmp == NULL) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- return NSS_STATUS_UNAVAIL;
- }
- len = strlen(tmp)+1;
- if (bufpos + len > buflen) {
- /* buffer too small */
- *errnop = errno = EAGAIN;
- return NSS_STATUS_TRYAGAIN;
- }
- memcpy(&buffer[bufpos], tmp, len);
- result->gr_mem[i] = &buffer[bufpos];
- bufpos += len;
- }
-
- result->gr_mem[i] = NULL;
-
- return NSS_STATUS_SUCCESS;
-}
-
-NSS_STATUS _ldb_nss_fill_initgr(gid_t group,
- long int limit,
- long int *start,
- long int *size,
- gid_t **groups,
- int *errnop,
- struct ldb_result *grlist)
-{
- NSS_STATUS ret;
- unsigned int i;
-
- for (i = 0; i < grlist->count; i++) {
-
- if (limit && (*start > limit)) {
- /* TODO: warn no all groups were reported */
- *errnop = 0;
- ret = NSS_STATUS_SUCCESS;
- goto done;
- }
-
- if (*start == *size) {
- /* buffer full, enlarge it */
- long int gs;
- gid_t *gm;
-
- gs = (*size) + 32;
- if (limit && (gs > limit)) {
- gs = limit;
- }
-
- gm = (gid_t *)realloc((*groups), gs * sizeof(gid_t));
- if ( ! gm) {
- *errnop = ENOMEM;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- *groups = gm;
- *size = gs;
- }
-
- (*groups)[*start] = ldb_msg_find_attr_as_int(grlist->msgs[i], "gidNumber", 0);
- if ((*groups)[*start] == 0 || (*groups)[*start] == group) {
- /* skip root group or primary group */
- continue;
- }
- (*start)++;
-
- }
-
- *errnop = 0;
- ret = NSS_STATUS_SUCCESS;
-done:
- return ret;
-}
-
-#define _LDB_NSS_ALLOC_CHECK(mem) do { if (!mem) { errno = ENOMEM; return NSS_STATUS_UNAVAIL; } } while(0)
-
-NSS_STATUS _ldb_nss_group_request(struct ldb_result **_res,
- struct ldb_dn *group_dn,
- const char * const *attrs,
- const char *mattr)
-{
- struct ldb_control **ctrls;
- struct ldb_control *ctrl;
- struct ldb_asq_control *asqc;
- struct ldb_request *req;
- int ret;
- struct ldb_result *res = *_res;
-
- ctrls = talloc_array(res, struct ldb_control *, 2);
- _LDB_NSS_ALLOC_CHECK(ctrls);
-
- ctrl = talloc(ctrls, struct ldb_control);
- _LDB_NSS_ALLOC_CHECK(ctrl);
-
- asqc = talloc(ctrl, struct ldb_asq_control);
- _LDB_NSS_ALLOC_CHECK(asqc);
-
- asqc->source_attribute = talloc_strdup(asqc, mattr);
- _LDB_NSS_ALLOC_CHECK(asqc->source_attribute);
-
- asqc->request = 1;
- asqc->src_attr_len = strlen(asqc->source_attribute);
- ctrl->oid = LDB_CONTROL_ASQ_OID;
- ctrl->critical = 1;
- ctrl->data = asqc;
- ctrls[0] = ctrl;
- ctrls[1] = NULL;
-
- ret = ldb_build_search_req(
- &req,
- _ldb_nss_ctx->ldb,
- res,
- group_dn,
- LDB_SCOPE_BASE,
- "(objectClass=*)",
- attrs,
- ctrls,
- res,
- ldb_search_default_callback);
-
- if (ret != LDB_SUCCESS) {
- errno = ENOENT;
- return NSS_STATUS_UNAVAIL;
- }
-
- ldb_set_timeout(_ldb_nss_ctx->ldb, req, 0);
-
- ret = ldb_request(_ldb_nss_ctx->ldb, req);
-
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- } else {
- talloc_free(req);
- return NSS_STATUS_UNAVAIL;
- }
-
- talloc_free(req);
- return NSS_STATUS_SUCCESS;
-}
-
diff --git a/source4/lib/ldb/nssldb/ldb-nss.h b/source4/lib/ldb/nssldb/ldb-nss.h
deleted file mode 100644
index 583876fea6..0000000000
--- a/source4/lib/ldb/nssldb/ldb-nss.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- LDB nsswitch module
-
- Copyright (C) Simo Sorce 2006
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _LDB_NSS
-#define _LDB_NSS
-
-#include "includes.h"
-#include "ldb/include/includes.h"
-
-#include <nss.h>
-#include <pwd.h>
-#include <grp.h>
-
-#define _LDB_NSS_URL "etc/users.ldb"
-#define _LDB_NSS_BASEDN "CN=Users,CN=System"
-#define _LDB_NSS_PWENT_FILTER "(&(objectClass=posixAccount)(!(uidNumber=0))(!(gidNumber=0)))"
-#define _LDB_NSS_PWUID_FILTER "(&(objectClass=posixAccount)(uidNumber=%d)(!(gidNumber=0)))"
-#define _LDB_NSS_PWNAM_FILTER "(&(objectClass=posixAccount)(uid=%s)(!(uidNumber=0))(!(gidNumber=0)))"
-
-#define _LDB_NSS_GRENT_FILTER "(&(objectClass=posixGroup)(!(gidNumber=0)))"
-#define _LDB_NSS_GRGID_FILTER "(&(objectClass=posixGroup)(gidNumber=%d)))"
-#define _LDB_NSS_GRNAM_FILTER "(&(objectClass=posixGroup)(cn=%s)(!(gidNumber=0)))"
-
-typedef enum nss_status NSS_STATUS;
-
-struct _ldb_nss_context {
-
- pid_t pid;
-
- struct ldb_context *ldb;
- struct ldb_dn *base;
-
- int pw_cur;
- struct ldb_result *pw_res;
-
- int gr_cur;
- struct ldb_result *gr_res;
-};
-
-NSS_STATUS _ldb_nss_init(void);
-
-NSS_STATUS _ldb_nss_fill_passwd(struct passwd *result,
- char *buffer,
- int buflen,
- int *errnop,
- struct ldb_message *msg);
-
-NSS_STATUS _ldb_nss_fill_group(struct group *result,
- char *buffer,
- int buflen,
- int *errnop,
- struct ldb_message *group,
- struct ldb_result *members);
-
-NSS_STATUS _ldb_nss_fill_initgr(gid_t group,
- long int limit,
- long int *start,
- long int *size,
- gid_t **groups,
- int *errnop,
- struct ldb_result *grlist);
-
-NSS_STATUS _ldb_nss_group_request(struct ldb_result **res,
- struct ldb_dn *group_dn,
- const char * const *attrs,
- const char *mattr);
-
-#endif /* _LDB_NSS */
diff --git a/source4/lib/ldb/nssldb/ldb-pwd.c b/source4/lib/ldb/nssldb/ldb-pwd.c
deleted file mode 100644
index 6ab103a6fe..0000000000
--- a/source4/lib/ldb/nssldb/ldb-pwd.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- LDB nsswitch module
-
- Copyright (C) Simo Sorce 2006
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "ldb-nss.h"
-
-extern struct _ldb_nss_context *_ldb_nss_ctx;
-
-const char *_ldb_nss_pw_attrs[] = {
- "uid",
- "userPassword",
- "uidNumber",
- "gidNumber",
- "gecos",
- "homeDirectory",
- "loginShell",
- NULL
-};
-
-NSS_STATUS _nss_ldb_setpwent(void)
-{
- int ret;
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- _ldb_nss_ctx->pw_cur = 0;
- if (_ldb_nss_ctx->pw_res != NULL) {
- talloc_free(_ldb_nss_ctx->pw_res);
- _ldb_nss_ctx->pw_res = NULL;
- }
-
- ret = ldb_search(_ldb_nss_ctx->ldb,
- _ldb_nss_ctx->ldb,
- &_ldb_nss_ctx->pw_res,
- _ldb_nss_ctx->base,
- LDB_SCOPE_SUBTREE,
- _ldb_nss_pw_attrs,
- _LDB_NSS_PWENT_FILTER);
- if (ret != LDB_SUCCESS) {
- return NSS_STATUS_UNAVAIL;
- }
-
- return NSS_STATUS_SUCCESS;
-}
-
-NSS_STATUS _nss_ldb_endpwent(void)
-{
- int ret;
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- _ldb_nss_ctx->pw_cur = 0;
- if (_ldb_nss_ctx->pw_res) {
- talloc_free(_ldb_nss_ctx->pw_res);
- _ldb_nss_ctx->pw_res = NULL;
- }
-
- return NSS_STATUS_SUCCESS;
-}
-
-NSS_STATUS _nss_ldb_getpwent_r(struct passwd *result_buf,
- char *buffer,
- int buflen,
- int *errnop)
-{
- int ret;
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- *errnop = 0;
-
- if (_ldb_nss_ctx->pw_cur >= _ldb_nss_ctx->pw_res->count) {
- /* already returned all entries */
- return NSS_STATUS_NOTFOUND;
- }
-
- ret = _ldb_nss_fill_passwd(result_buf,
- buffer,
- buflen,
- errnop,
- _ldb_nss_ctx->pw_res->msgs[_ldb_nss_ctx->pw_cur]);
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- _ldb_nss_ctx->pw_cur++;
-
- return NSS_STATUS_SUCCESS;
-}
-
-NSS_STATUS _nss_ldb_getpwuid_r(uid_t uid, struct passwd *result_buf, char *buffer, size_t buflen, int *errnop)
-{
- int ret;
- char *filter;
- struct ldb_result *res;
-
- if (uid == 0) { /* we don't serve root uid by policy */
- *errnop = errno = ENOENT;
- return NSS_STATUS_NOTFOUND;
- }
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- /* build the filter for this uid */
- filter = talloc_asprintf(_ldb_nss_ctx, _LDB_NSS_PWUID_FILTER, uid);
- if (filter == NULL) {
- /* this is a fatal error */
- *errnop = errno = ENOMEM;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- /* search the entry */
- ret = ldb_search(_ldb_nss_ctx->ldb,
- _ldb_nss_ctx->ldb,
- &res,
- _ldb_nss_ctx->base,
- LDB_SCOPE_SUBTREE,
- _ldb_nss_pw_attrs,
- filter);
- if (ret != LDB_SUCCESS) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- /* if none found return */
- if (res->count == 0) {
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_NOTFOUND;
- goto done;
- }
-
- if (res->count != 1) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- /* fill in the passwd struct */
- ret = _ldb_nss_fill_passwd(result_buf,
- buffer,
- buflen,
- errnop,
- res->msgs[0]);
-
-done:
- talloc_free(filter);
- talloc_free(res);
- return ret;
-}
-
-NSS_STATUS _nss_ldb_getpwnam_r(const char *name, struct passwd *result_buf, char *buffer, size_t buflen, int *errnop)
-{
- int ret;
- char *filter;
- struct ldb_result *res;
-
- ret = _ldb_nss_init();
- if (ret != NSS_STATUS_SUCCESS) {
- return ret;
- }
-
- /* build the filter for this name */
- filter = talloc_asprintf(_ldb_nss_ctx, _LDB_NSS_PWNAM_FILTER, name);
- if (filter == NULL) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- /* search the entry */
- ret = ldb_search(_ldb_nss_ctx->ldb,
- _ldb_nss_ctx->ldb,
- &res,
- _ldb_nss_ctx->base,
- LDB_SCOPE_SUBTREE,
- _ldb_nss_pw_attrs,
- filter);
- if (ret != LDB_SUCCESS) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- /* if none found return */
- if (res->count == 0) {
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_NOTFOUND;
- goto done;
- }
-
- if (res->count != 1) {
- /* this is a fatal error */
- *errnop = errno = ENOENT;
- ret = NSS_STATUS_UNAVAIL;
- goto done;
- }
-
- /* fill in the passwd struct */
- ret = _ldb_nss_fill_passwd(result_buf,
- buffer,
- buflen,
- errnop,
- res->msgs[0]);
-
-done:
- talloc_free(filter);
- talloc_free(res);
- return ret;
-}
-
diff --git a/source4/lib/ldb/pyldb-util.pc.in b/source4/lib/ldb/pyldb-util.pc.in
deleted file mode 100644
index 348ae8b95d..0000000000
--- a/source4/lib/ldb/pyldb-util.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-modulesdir=@LDB_MODULESDIR@
-
-Name: pyldb-util
-Description: Python bindings for LDB
-Version: @PACKAGE_VERSION@
-Requires: ldb
-Libs: @LIB_RPATH@ -L${libdir} -lpyldb-util
-Cflags: -I${includedir}
-URL: http://ldb.samba.org/
diff --git a/source4/lib/ldb/pyldb.c b/source4/lib/ldb/pyldb.c
deleted file mode 100644
index e2a2e7180e..0000000000
--- a/source4/lib/ldb/pyldb.c
+++ /dev/null
@@ -1,3302 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
-
- Python interface to ldb.
-
- Copyright (C) 2005,2006 Tim Potter <tpot@samba.org>
- Copyright (C) 2006 Simo Sorce <idra@samba.org>
- Copyright (C) 2007-2010 Jelmer Vernooij <jelmer@samba.org>
- Copyright (C) 2009-2010 Matthias Dieter Wallnöfer
- Copyright (C) 2009-2011 Andrew Tridgell
- Copyright (C) 2009-2011 Andrew Bartlett
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <Python.h>
-#include <pytalloc.h>
-#include "ldb_private.h"
-#include "pyldb.h"
-
-void initldb(void);
-static PyObject *PyLdbMessage_FromMessage(struct ldb_message *msg);
-static PyObject *PyExc_LdbError;
-
-staticforward PyTypeObject PyLdbControl;
-staticforward PyTypeObject PyLdbResult;
-staticforward PyTypeObject PyLdbMessage;
-staticforward PyTypeObject PyLdbModule;
-staticforward PyTypeObject PyLdbDn;
-staticforward PyTypeObject PyLdb;
-staticforward PyTypeObject PyLdbMessageElement;
-staticforward PyTypeObject PyLdbTree;
-static PyObject *PyLdb_FromLdbContext(struct ldb_context *ldb_ctx);
-static PyObject *PyLdbModule_FromModule(struct ldb_module *mod);
-static struct ldb_message_element *PyObject_AsMessageElement(
- TALLOC_CTX *mem_ctx,
- PyObject *set_obj,
- unsigned int flags,
- const char *attr_name);
-
-/* There's no Py_ssize_t in 2.4, apparently */
-#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5
-typedef int Py_ssize_t;
-typedef inquiry lenfunc;
-typedef intargfunc ssizeargfunc;
-#endif
-
-#ifndef Py_RETURN_NONE
-#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
-#endif
-
-#define SIGN(a) (((a) == 0)?0:((a) < 0?-1:1))
-
-
-
-static PyObject *py_ldb_control_str(PyLdbControlObject *self)
-{
- if (self->data != NULL) {
- char* control = ldb_control_to_string(self->mem_ctx, self->data);
- if (control == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- return PyString_FromString(control);
- } else {
- return PyString_FromFormat("ldb control");
- }
-}
-
-static void py_ldb_control_dealloc(PyLdbControlObject *self)
-{
- if (self->mem_ctx != NULL) {
- talloc_free(self->mem_ctx);
- }
- self->data = NULL;
- self->ob_type->tp_free(self);
-}
-
-static PyObject *py_ldb_control_get_oid(PyLdbControlObject *self)
-{
- return PyString_FromString(self->data->oid);
-}
-
-static PyObject *py_ldb_control_get_critical(PyLdbControlObject *self)
-{
- return PyBool_FromLong(self->data->critical);
-}
-
-static PyObject *py_ldb_control_set_critical(PyLdbControlObject *self, PyObject *value, void *closure)
-{
- if (PyObject_IsTrue(value)) {
- self->data->critical = true;
- } else {
- self->data->critical = false;
- }
- return 0;
-}
-
-static PyObject *py_ldb_control_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
-{
- char *data = NULL;
- const char * const kwnames[] = { "ldb", "data", NULL };
- struct ldb_control *parsed_controls;
- PyLdbControlObject *ret;
- PyObject *py_ldb;
- TALLOC_CTX *mem_ctx;
- struct ldb_context *ldb_ctx;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Os",
- discard_const_p(char *, kwnames),
- &py_ldb, &data))
- return NULL;
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- ldb_ctx = PyLdb_AsLdbContext(py_ldb);
- parsed_controls = ldb_parse_control_from_string(ldb_ctx, mem_ctx, data);
-
- if (!parsed_controls) {
- talloc_free(mem_ctx);
- PyErr_SetString(PyExc_ValueError, "unable to parse control string");
- return NULL;
- }
-
- ret = PyObject_New(PyLdbControlObject, type);
- if (ret == NULL) {
- PyErr_NoMemory();
- talloc_free(mem_ctx);
- return NULL;
- }
-
- ret->mem_ctx = mem_ctx;
-
- ret->data = talloc_move(mem_ctx, &parsed_controls);
- if (ret->data == NULL) {
- Py_DECREF(ret);
- PyErr_NoMemory();
- talloc_free(mem_ctx);
- return NULL;
- }
-
- return (PyObject *)ret;
-}
-
-static PyGetSetDef py_ldb_control_getset[] = {
- { discard_const_p(char, "oid"), (getter)py_ldb_control_get_oid, NULL, NULL },
- { discard_const_p(char, "critical"), (getter)py_ldb_control_get_critical, (setter)py_ldb_control_set_critical, NULL },
- { NULL }
-};
-
-static PyTypeObject PyLdbControl = {
- .tp_name = "ldb.control",
- .tp_dealloc = (destructor)py_ldb_control_dealloc,
- .tp_getattro = PyObject_GenericGetAttr,
- .tp_basicsize = sizeof(PyLdbControlObject),
- .tp_getset = py_ldb_control_getset,
- .tp_doc = "LDB control.",
- .tp_str = (reprfunc)py_ldb_control_str,
- .tp_new = py_ldb_control_new,
- .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-};
-
-static void PyErr_SetLdbError(PyObject *error, int ret, struct ldb_context *ldb_ctx)
-{
- if (ret == LDB_ERR_PYTHON_EXCEPTION)
- return; /* Python exception should already be set, just keep that */
-
- PyErr_SetObject(error,
- Py_BuildValue(discard_const_p(char, "(i,s)"), ret,
- ldb_ctx == NULL?ldb_strerror(ret):ldb_errstring(ldb_ctx)));
-}
-
-static PyObject *PyObject_FromLdbValue(struct ldb_val *val)
-{
- return PyString_FromStringAndSize((const char *)val->data, val->length);
-}
-
-/**
- * Create a Python object from a ldb_result.
- *
- * @param result LDB result to convert
- * @return Python object with converted result (a list object)
- */
-static PyObject *PyLdbControl_FromControl(struct ldb_control *control)
-{
- TALLOC_CTX *ctl_ctx = talloc_new(NULL);
- PyLdbControlObject *ctrl;
- if (ctl_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- ctrl = (PyLdbControlObject *)PyLdbControl.tp_alloc(&PyLdbControl, 0);
- if (ctrl == NULL) {
- talloc_free(ctl_ctx);
- PyErr_NoMemory();
- return NULL;
- }
- ctrl->mem_ctx = ctl_ctx;
- ctrl->data = talloc_steal(ctrl->mem_ctx, control);
- if (ctrl->data == NULL) {
- Py_DECREF(ctrl);
- PyErr_NoMemory();
- return NULL;
- }
- return (PyObject*) ctrl;
-}
-
-/**
- * Create a Python object from a ldb_result.
- *
- * @param result LDB result to convert
- * @return Python object with converted result (a list object)
- */
-static PyObject *PyLdbResult_FromResult(struct ldb_result *result)
-{
- PyLdbResultObject *ret;
- PyObject *list, *controls, *referals;
- Py_ssize_t i;
-
- if (result == NULL) {
- Py_RETURN_NONE;
- }
-
- ret = (PyLdbResultObject *)PyLdbResult.tp_alloc(&PyLdbResult, 0);
- if (ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- list = PyList_New(result->count);
- if (list == NULL) {
- PyErr_NoMemory();
- Py_DECREF(ret);
- return NULL;
- }
-
- for (i = 0; i < result->count; i++) {
- PyList_SetItem(list, i, PyLdbMessage_FromMessage(result->msgs[i]));
- }
-
- ret->mem_ctx = talloc_new(NULL);
- if (ret->mem_ctx == NULL) {
- Py_DECREF(list);
- Py_DECREF(ret);
- PyErr_NoMemory();
- return NULL;
- }
-
- ret->msgs = list;
-
- if (result->controls) {
- controls = PyList_New(1);
- if (controls == NULL) {
- Py_DECREF(ret);
- PyErr_NoMemory();
- return NULL;
- }
- for (i=0; result->controls[i]; i++) {
- PyObject *ctrl = (PyObject*) PyLdbControl_FromControl(result->controls[i]);
- if (ctrl == NULL) {
- Py_DECREF(ret);
- Py_DECREF(controls);
- PyErr_NoMemory();
- return NULL;
- }
- PyList_SetItem(controls, i, ctrl);
- }
- } else {
- /*
- * No controls so we keep an empty list
- */
- controls = PyList_New(0);
- if (controls == NULL) {
- Py_DECREF(ret);
- PyErr_NoMemory();
- return NULL;
- }
- }
-
- ret->controls = controls;
-
- i = 0;
-
- while (result->refs && result->refs[i]) {
- i++;
- }
-
- referals = PyList_New(i);
- if (referals == NULL) {
- Py_DECREF(ret);
- PyErr_NoMemory();
- return NULL;
- }
-
- for (i = 0;result->refs && result->refs[i]; i++) {
- PyList_SetItem(referals, i, PyString_FromString(result->refs[i]));
- }
- ret->referals = referals;
- return (PyObject *)ret;
-}
-
-/**
- * Create a LDB Result from a Python object.
- * If conversion fails, NULL will be returned and a Python exception set.
- *
- * @param mem_ctx Memory context in which to allocate the LDB Result
- * @param obj Python object to convert
- * @return a ldb_result, or NULL if the conversion failed
- */
-static struct ldb_result *PyLdbResult_AsResult(TALLOC_CTX *mem_ctx,
- PyObject *obj)
-{
- struct ldb_result *res;
- Py_ssize_t i;
-
- if (obj == Py_None)
- return NULL;
-
- res = talloc_zero(mem_ctx, struct ldb_result);
- res->count = PyList_Size(obj);
- res->msgs = talloc_array(res, struct ldb_message *, res->count);
- for (i = 0; i < res->count; i++) {
- PyObject *item = PyList_GetItem(obj, i);
- res->msgs[i] = PyLdbMessage_AsMessage(item);
- }
- return res;
-}
-
-static PyObject *py_ldb_dn_validate(PyLdbDnObject *self)
-{
- return PyBool_FromLong(ldb_dn_validate(self->dn));
-}
-
-static PyObject *py_ldb_dn_is_valid(PyLdbDnObject *self)
-{
- return PyBool_FromLong(ldb_dn_is_valid(self->dn));
-}
-
-static PyObject *py_ldb_dn_is_special(PyLdbDnObject *self)
-{
- return PyBool_FromLong(ldb_dn_is_special(self->dn));
-}
-
-static PyObject *py_ldb_dn_is_null(PyLdbDnObject *self)
-{
- return PyBool_FromLong(ldb_dn_is_null(self->dn));
-}
-
-static PyObject *py_ldb_dn_get_casefold(PyLdbDnObject *self)
-{
- return PyString_FromString(ldb_dn_get_casefold(self->dn));
-}
-
-static PyObject *py_ldb_dn_get_linearized(PyLdbDnObject *self)
-{
- return PyString_FromString(ldb_dn_get_linearized(self->dn));
-}
-
-static PyObject *py_ldb_dn_canonical_str(PyLdbDnObject *self)
-{
- return PyString_FromString(ldb_dn_canonical_string(self->dn, self->dn));
-}
-
-static PyObject *py_ldb_dn_canonical_ex_str(PyLdbDnObject *self)
-{
- return PyString_FromString(ldb_dn_canonical_ex_string(self->dn, self->dn));
-}
-
-static PyObject *py_ldb_dn_extended_str(PyLdbDnObject *self, PyObject *args, PyObject *kwargs)
-{
- const char * const kwnames[] = { "mode", NULL };
- int mode = 1;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i",
- discard_const_p(char *, kwnames),
- &mode))
- return NULL;
- return PyString_FromString(ldb_dn_get_extended_linearized(self->dn, self->dn, mode));
-}
-
-static PyObject *py_ldb_dn_get_extended_component(PyLdbDnObject *self, PyObject *args)
-{
- char *name;
- const struct ldb_val *val;
-
- if (!PyArg_ParseTuple(args, "s", &name))
- return NULL;
- val = ldb_dn_get_extended_component(self->dn, name);
- if (val == NULL) {
- Py_RETURN_NONE;
- }
-
- return PyString_FromStringAndSize((const char *)val->data, val->length);
-}
-
-static PyObject *py_ldb_dn_set_extended_component(PyLdbDnObject *self, PyObject *args)
-{
- char *name;
- PyObject *value;
- int err;
-
- if (!PyArg_ParseTuple(args, "sO", &name, &value))
- return NULL;
-
- if (value == Py_None) {
- err = ldb_dn_set_extended_component(self->dn, name, NULL);
- } else {
- struct ldb_val val;
- if (!PyString_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "Expected a string argument");
- return NULL;
- }
- val.data = (uint8_t *)PyString_AsString(value);
- val.length = PyString_Size(value);
- err = ldb_dn_set_extended_component(self->dn, name, &val);
- }
-
- if (err != LDB_SUCCESS) {
- PyErr_SetString(PyExc_TypeError, "Failed to set extended component");
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_dn_repr(PyLdbDnObject *self)
-{
- return PyString_FromFormat("Dn(%s)", PyObject_REPR(PyString_FromString(ldb_dn_get_linearized(self->dn))));
-}
-
-static PyObject *py_ldb_dn_check_special(PyLdbDnObject *self, PyObject *args)
-{
- char *name;
-
- if (!PyArg_ParseTuple(args, "s", &name))
- return NULL;
-
- return ldb_dn_check_special(self->dn, name)?Py_True:Py_False;
-}
-
-static int py_ldb_dn_compare(PyLdbDnObject *dn1, PyLdbDnObject *dn2)
-{
- int ret;
- ret = ldb_dn_compare(dn1->dn, dn2->dn);
- if (ret < 0) ret = -1;
- if (ret > 0) ret = 1;
- return ret;
-}
-
-static PyObject *py_ldb_dn_get_parent(PyLdbDnObject *self)
-{
- struct ldb_dn *dn = PyLdbDn_AsDn((PyObject *)self);
- struct ldb_dn *parent;
- PyLdbDnObject *py_ret;
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
-
- parent = ldb_dn_get_parent(mem_ctx, dn);
- if (parent == NULL) {
- talloc_free(mem_ctx);
- Py_RETURN_NONE;
- }
-
- py_ret = (PyLdbDnObject *)PyLdbDn.tp_alloc(&PyLdbDn, 0);
- if (py_ret == NULL) {
- PyErr_NoMemory();
- talloc_free(mem_ctx);
- return NULL;
- }
- py_ret->mem_ctx = mem_ctx;
- py_ret->dn = parent;
- return (PyObject *)py_ret;
-}
-
-#define dn_ldb_ctx(dn) ((struct ldb_context *)dn)
-
-static PyObject *py_ldb_dn_add_child(PyLdbDnObject *self, PyObject *args)
-{
- PyObject *py_other;
- struct ldb_dn *dn, *other;
- if (!PyArg_ParseTuple(args, "O", &py_other))
- return NULL;
-
- dn = PyLdbDn_AsDn((PyObject *)self);
-
- if (!PyObject_AsDn(NULL, py_other, dn_ldb_ctx(dn), &other))
- return NULL;
-
- return ldb_dn_add_child(dn, other)?Py_True:Py_False;
-}
-
-static PyObject *py_ldb_dn_add_base(PyLdbDnObject *self, PyObject *args)
-{
- PyObject *py_other;
- struct ldb_dn *other, *dn;
- if (!PyArg_ParseTuple(args, "O", &py_other))
- return NULL;
-
- dn = PyLdbDn_AsDn((PyObject *)self);
-
- if (!PyObject_AsDn(NULL, py_other, dn_ldb_ctx(dn), &other))
- return NULL;
-
- return ldb_dn_add_base(dn, other)?Py_True:Py_False;
-}
-
-static PyMethodDef py_ldb_dn_methods[] = {
- { "validate", (PyCFunction)py_ldb_dn_validate, METH_NOARGS,
- "S.validate() -> bool\n"
- "Validate DN is correct." },
- { "is_valid", (PyCFunction)py_ldb_dn_is_valid, METH_NOARGS,
- "S.is_valid() -> bool\n" },
- { "is_special", (PyCFunction)py_ldb_dn_is_special, METH_NOARGS,
- "S.is_special() -> bool\n"
- "Check whether this is a special LDB DN." },
- { "is_null", (PyCFunction)py_ldb_dn_is_null, METH_NOARGS,
- "Check whether this is a null DN." },
- { "get_casefold", (PyCFunction)py_ldb_dn_get_casefold, METH_NOARGS,
- NULL },
- { "get_linearized", (PyCFunction)py_ldb_dn_get_linearized, METH_NOARGS,
- NULL },
- { "canonical_str", (PyCFunction)py_ldb_dn_canonical_str, METH_NOARGS,
- "S.canonical_str() -> string\n"
- "Canonical version of this DN (like a posix path)." },
- { "canonical_ex_str", (PyCFunction)py_ldb_dn_canonical_ex_str, METH_NOARGS,
- "S.canonical_ex_str() -> string\n"
- "Canonical version of this DN (like a posix path, with terminating newline)." },
- { "extended_str", (PyCFunction)py_ldb_dn_extended_str, METH_VARARGS | METH_KEYWORDS,
- "S.extended_str(mode=1) -> string\n"
- "Extended version of this DN" },
- { "parent", (PyCFunction)py_ldb_dn_get_parent, METH_NOARGS,
- "S.parent() -> dn\n"
- "Get the parent for this DN." },
- { "add_child", (PyCFunction)py_ldb_dn_add_child, METH_VARARGS,
- "S.add_child(dn) -> None\n"
- "Add a child DN to this DN." },
- { "add_base", (PyCFunction)py_ldb_dn_add_base, METH_VARARGS,
- "S.add_base(dn) -> None\n"
- "Add a base DN to this DN." },
- { "check_special", (PyCFunction)py_ldb_dn_check_special, METH_VARARGS,
- "S.check_special(name) -> bool\n\n"
- "Check if name is a special DN name"},
- { "get_extended_component", (PyCFunction)py_ldb_dn_get_extended_component, METH_VARARGS,
- "S.get_extended_component(name) -> string\n\n"
- "returns a DN extended component as a binary string"},
- { "set_extended_component", (PyCFunction)py_ldb_dn_set_extended_component, METH_VARARGS,
- "S.set_extended_component(name, value) -> string\n\n"
- "set a DN extended component as a binary string"},
- { NULL }
-};
-
-static Py_ssize_t py_ldb_dn_len(PyLdbDnObject *self)
-{
- return ldb_dn_get_comp_num(PyLdbDn_AsDn((PyObject *)self));
-}
-
-static PyObject *py_ldb_dn_concat(PyLdbDnObject *self, PyObject *py_other)
-{
- struct ldb_dn *dn = PyLdbDn_AsDn((PyObject *)self),
- *other;
- PyLdbDnObject *py_ret;
-
- if (!PyObject_AsDn(NULL, py_other, NULL, &other))
- return NULL;
-
- py_ret = (PyLdbDnObject *)PyLdbDn.tp_alloc(&PyLdbDn, 0);
- if (py_ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- py_ret->mem_ctx = talloc_new(NULL);
- py_ret->dn = ldb_dn_copy(py_ret->mem_ctx, dn);
- ldb_dn_add_child(py_ret->dn, other);
- return (PyObject *)py_ret;
-}
-
-static PySequenceMethods py_ldb_dn_seq = {
- .sq_length = (lenfunc)py_ldb_dn_len,
- .sq_concat = (binaryfunc)py_ldb_dn_concat,
-};
-
-static PyObject *py_ldb_dn_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
-{
- struct ldb_dn *ret;
- char *str;
- PyObject *py_ldb;
- struct ldb_context *ldb_ctx;
- TALLOC_CTX *mem_ctx;
- PyLdbDnObject *py_ret;
- const char * const kwnames[] = { "ldb", "dn", NULL };
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Os",
- discard_const_p(char *, kwnames),
- &py_ldb, &str))
- return NULL;
-
- ldb_ctx = PyLdb_AsLdbContext(py_ldb);
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- ret = ldb_dn_new(mem_ctx, ldb_ctx, str);
- if (!ldb_dn_validate(ret)) {
- talloc_free(mem_ctx);
- PyErr_SetString(PyExc_ValueError, "unable to parse dn string");
- return NULL;
- }
-
- py_ret = (PyLdbDnObject *)type->tp_alloc(type, 0);
- if (ret == NULL) {
- talloc_free(mem_ctx);
- PyErr_NoMemory();
- return NULL;
- }
- py_ret->mem_ctx = mem_ctx;
- py_ret->dn = ret;
- return (PyObject *)py_ret;
-}
-
-static void py_ldb_dn_dealloc(PyLdbDnObject *self)
-{
- talloc_free(self->mem_ctx);
- PyObject_Del(self);
-}
-
-static PyTypeObject PyLdbDn = {
- .tp_name = "ldb.Dn",
- .tp_methods = py_ldb_dn_methods,
- .tp_str = (reprfunc)py_ldb_dn_get_linearized,
- .tp_repr = (reprfunc)py_ldb_dn_repr,
- .tp_compare = (cmpfunc)py_ldb_dn_compare,
- .tp_as_sequence = &py_ldb_dn_seq,
- .tp_doc = "A LDB distinguished name.",
- .tp_new = py_ldb_dn_new,
- .tp_dealloc = (destructor)py_ldb_dn_dealloc,
- .tp_basicsize = sizeof(PyLdbDnObject),
- .tp_flags = Py_TPFLAGS_DEFAULT,
-};
-
-/* Debug */
-static void py_ldb_debug(void *context, enum ldb_debug_level level, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3, 0);
-static void py_ldb_debug(void *context, enum ldb_debug_level level, const char *fmt, va_list ap)
-{
- PyObject *fn = (PyObject *)context;
- PyObject_CallFunction(fn, discard_const_p(char, "(i,O)"), level, PyString_FromFormatV(fmt, ap));
-}
-
-static PyObject *py_ldb_set_debug(PyLdbObject *self, PyObject *args)
-{
- PyObject *cb;
-
- if (!PyArg_ParseTuple(args, "O", &cb))
- return NULL;
-
- Py_INCREF(cb);
- /* FIXME: Where do we DECREF cb ? */
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ldb_set_debug(self->ldb_ctx, py_ldb_debug, cb), PyLdb_AsLdbContext(self));
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_set_create_perms(PyTypeObject *self, PyObject *args)
-{
- unsigned int perms;
- if (!PyArg_ParseTuple(args, "I", &perms))
- return NULL;
-
- ldb_set_create_perms(PyLdb_AsLdbContext(self), perms);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_set_modules_dir(PyTypeObject *self, PyObject *args)
-{
- char *modules_dir;
- if (!PyArg_ParseTuple(args, "s", &modules_dir))
- return NULL;
-
- ldb_set_modules_dir(PyLdb_AsLdbContext(self), modules_dir);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_transaction_start(PyLdbObject *self)
-{
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ldb_transaction_start(PyLdb_AsLdbContext(self)), PyLdb_AsLdbContext(self));
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_transaction_commit(PyLdbObject *self)
-{
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ldb_transaction_commit(PyLdb_AsLdbContext(self)), PyLdb_AsLdbContext(self));
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_transaction_prepare_commit(PyLdbObject *self)
-{
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ldb_transaction_prepare_commit(PyLdb_AsLdbContext(self)), PyLdb_AsLdbContext(self));
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_transaction_cancel(PyLdbObject *self)
-{
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ldb_transaction_cancel(PyLdb_AsLdbContext(self)), PyLdb_AsLdbContext(self));
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_setup_wellknown_attributes(PyLdbObject *self)
-{
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ldb_setup_wellknown_attributes(PyLdb_AsLdbContext(self)), PyLdb_AsLdbContext(self));
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_repr(PyLdbObject *self)
-{
- return PyString_FromFormat("<ldb connection>");
-}
-
-static PyObject *py_ldb_get_root_basedn(PyLdbObject *self)
-{
- struct ldb_dn *dn = ldb_get_root_basedn(PyLdb_AsLdbContext(self));
- if (dn == NULL)
- Py_RETURN_NONE;
- return PyLdbDn_FromDn(dn);
-}
-
-
-static PyObject *py_ldb_get_schema_basedn(PyLdbObject *self)
-{
- struct ldb_dn *dn = ldb_get_schema_basedn(PyLdb_AsLdbContext(self));
- if (dn == NULL)
- Py_RETURN_NONE;
- return PyLdbDn_FromDn(dn);
-}
-
-static PyObject *py_ldb_get_config_basedn(PyLdbObject *self)
-{
- struct ldb_dn *dn = ldb_get_config_basedn(PyLdb_AsLdbContext(self));
- if (dn == NULL)
- Py_RETURN_NONE;
- return PyLdbDn_FromDn(dn);
-}
-
-static PyObject *py_ldb_get_default_basedn(PyLdbObject *self)
-{
- struct ldb_dn *dn = ldb_get_default_basedn(PyLdb_AsLdbContext(self));
- if (dn == NULL)
- Py_RETURN_NONE;
- return PyLdbDn_FromDn(dn);
-}
-
-static const char **PyList_AsStringList(TALLOC_CTX *mem_ctx, PyObject *list,
- const char *paramname)
-{
- const char **ret;
- Py_ssize_t i;
- if (!PyList_Check(list)) {
- PyErr_Format(PyExc_TypeError, "%s is not a list", paramname);
- return NULL;
- }
- ret = talloc_array(NULL, const char *, PyList_Size(list)+1);
- if (ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- for (i = 0; i < PyList_Size(list); i++) {
- PyObject *item = PyList_GetItem(list, i);
- if (!PyString_Check(item)) {
- PyErr_Format(PyExc_TypeError, "%s should be strings", paramname);
- return NULL;
- }
- ret[i] = talloc_strndup(ret, PyString_AsString(item),
- PyString_Size(item));
- }
- ret[i] = NULL;
- return ret;
-}
-
-static int py_ldb_init(PyLdbObject *self, PyObject *args, PyObject *kwargs)
-{
- const char * const kwnames[] = { "url", "flags", "options", NULL };
- char *url = NULL;
- PyObject *py_options = Py_None;
- const char **options;
- unsigned int flags = 0;
- int ret;
- struct ldb_context *ldb;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|zIO:Ldb.__init__",
- discard_const_p(char *, kwnames),
- &url, &flags, &py_options))
- return -1;
-
- ldb = PyLdb_AsLdbContext(self);
-
- if (py_options == Py_None) {
- options = NULL;
- } else {
- options = PyList_AsStringList(ldb, py_options, "options");
- if (options == NULL)
- return -1;
- }
-
- if (url != NULL) {
- ret = ldb_connect(ldb, url, flags, options);
- if (ret != LDB_SUCCESS) {
- PyErr_SetLdbError(PyExc_LdbError, ret, ldb);
- return -1;
- }
- }
-
- talloc_free(options);
- return 0;
-}
-
-static PyObject *py_ldb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
-{
- PyLdbObject *ret;
- struct ldb_context *ldb;
- ret = (PyLdbObject *)type->tp_alloc(type, 0);
- if (ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ret->mem_ctx = talloc_new(NULL);
- ldb = ldb_init(ret->mem_ctx, NULL);
-
- if (ldb == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- ret->ldb_ctx = ldb;
- return (PyObject *)ret;
-}
-
-static PyObject *py_ldb_connect(PyLdbObject *self, PyObject *args, PyObject *kwargs)
-{
- char *url;
- unsigned int flags = 0;
- PyObject *py_options = Py_None;
- int ret;
- const char **options;
- const char * const kwnames[] = { "url", "flags", "options", NULL };
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|zIO",
- discard_const_p(char *, kwnames),
- &url, &flags, &py_options))
- return NULL;
-
- if (py_options == Py_None) {
- options = NULL;
- } else {
- options = PyList_AsStringList(NULL, py_options, "options");
- if (options == NULL)
- return NULL;
- }
-
- ret = ldb_connect(PyLdb_AsLdbContext(self), url, flags, options);
- talloc_free(options);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, PyLdb_AsLdbContext(self));
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_modify(PyLdbObject *self, PyObject *args, PyObject *kwargs)
-{
- PyObject *py_msg;
- PyObject *py_controls = Py_None;
- struct ldb_context *ldb_ctx;
- struct ldb_request *req;
- struct ldb_control **parsed_controls;
- struct ldb_message *msg;
- int ret;
- TALLOC_CTX *mem_ctx;
- bool validate=true;
- const char * const kwnames[] = { "message", "controls", "validate", NULL };
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Ob",
- discard_const_p(char *, kwnames),
- &py_msg, &py_controls, &validate))
- return NULL;
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ldb_ctx = PyLdb_AsLdbContext(self);
-
- if (py_controls == Py_None) {
- parsed_controls = NULL;
- } else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
- parsed_controls = ldb_parse_control_strings(ldb_ctx, mem_ctx, controls);
- talloc_free(controls);
- }
-
- if (!PyLdbMessage_Check(py_msg)) {
- PyErr_SetString(PyExc_TypeError, "Expected Ldb Message");
- talloc_free(mem_ctx);
- return NULL;
- }
- msg = PyLdbMessage_AsMessage(py_msg);
-
- if (validate) {
- ret = ldb_msg_sanity_check(ldb_ctx, msg);
- if (ret != LDB_SUCCESS) {
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
- talloc_free(mem_ctx);
- return NULL;
- }
- }
-
- ret = ldb_build_mod_req(&req, ldb_ctx, mem_ctx, msg, parsed_controls,
- NULL, ldb_op_default_callback, NULL);
- if (ret != LDB_SUCCESS) {
- PyErr_SetString(PyExc_TypeError, "failed to build request");
- talloc_free(mem_ctx);
- return NULL;
- }
-
- /* do request and autostart a transaction */
- /* Then let's LDB handle the message error in case of pb as they are meaningful */
-
- ret = ldb_transaction_start(ldb_ctx);
- if (ret != LDB_SUCCESS) {
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
- }
-
- ret = ldb_request(ldb_ctx, req);
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
- if (ret == LDB_SUCCESS) {
- ret = ldb_transaction_commit(ldb_ctx);
- } else {
- ldb_transaction_cancel(ldb_ctx);
- if (ldb_ctx->err_string == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb_ctx, "%s (%d)", ldb_strerror(ret), ret);
- }
- }
-
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
-
- Py_RETURN_NONE;
-}
-
-
-/**
- * Obtain a ldb message from a Python Dictionary object.
- *
- * @param mem_ctx Memory context
- * @param py_obj Python Dictionary object
- * @param ldb_ctx LDB context
- * @param mod_flags Flags to be set on every message element
- * @return ldb_message on success or NULL on failure
- */
-static struct ldb_message *PyDict_AsMessage(TALLOC_CTX *mem_ctx,
- PyObject *py_obj,
- struct ldb_context *ldb_ctx,
- unsigned int mod_flags)
-{
- struct ldb_message *msg;
- unsigned int msg_pos = 0;
- Py_ssize_t dict_pos = 0;
- PyObject *key, *value;
- struct ldb_message_element *msg_el;
- PyObject *dn_value = PyDict_GetItemString(py_obj, "dn");
-
- msg = ldb_msg_new(mem_ctx);
- msg->elements = talloc_zero_array(msg, struct ldb_message_element, PyDict_Size(py_obj));
-
- if (dn_value) {
- if (!PyObject_AsDn(msg, dn_value, ldb_ctx, &msg->dn)) {
- PyErr_SetString(PyExc_TypeError, "unable to import dn object");
- return NULL;
- }
- if (msg->dn == NULL) {
- PyErr_SetString(PyExc_TypeError, "dn set but not found");
- return NULL;
- }
- } else {
- PyErr_SetString(PyExc_TypeError, "no dn set");
- return NULL;
- }
-
- while (PyDict_Next(py_obj, &dict_pos, &key, &value)) {
- char *key_str = PyString_AsString(key);
- if (strcmp(key_str, "dn") != 0) {
- msg_el = PyObject_AsMessageElement(msg->elements, value,
- mod_flags, key_str);
- if (msg_el == NULL) {
- PyErr_SetString(PyExc_TypeError, "unable to import element");
- return NULL;
- }
- memcpy(&msg->elements[msg_pos], msg_el, sizeof(*msg_el));
- msg_pos++;
- }
- }
-
- msg->num_elements = msg_pos;
-
- return msg;
-}
-
-static PyObject *py_ldb_add(PyLdbObject *self, PyObject *args, PyObject *kwargs)
-{
- PyObject *py_obj;
- int ret;
- struct ldb_context *ldb_ctx;
- struct ldb_request *req;
- struct ldb_message *msg = NULL;
- PyObject *py_controls = Py_None;
- TALLOC_CTX *mem_ctx;
- struct ldb_control **parsed_controls;
- const char * const kwnames[] = { "message", "controls", NULL };
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O",
- discard_const_p(char *, kwnames),
- &py_obj, &py_controls))
- return NULL;
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ldb_ctx = PyLdb_AsLdbContext(self);
-
- if (py_controls == Py_None) {
- parsed_controls = NULL;
- } else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
- parsed_controls = ldb_parse_control_strings(ldb_ctx, mem_ctx, controls);
- talloc_free(controls);
- }
-
- if (PyLdbMessage_Check(py_obj)) {
- msg = PyLdbMessage_AsMessage(py_obj);
- } else if (PyDict_Check(py_obj)) {
- msg = PyDict_AsMessage(mem_ctx, py_obj, ldb_ctx, LDB_FLAG_MOD_ADD);
- } else {
- PyErr_SetString(PyExc_TypeError,
- "Dictionary or LdbMessage object expected!");
- }
-
- if (!msg) {
- /* we should have a PyErr already set */
- talloc_free(mem_ctx);
- return NULL;
- }
-
- ret = ldb_msg_sanity_check(ldb_ctx, msg);
- if (ret != LDB_SUCCESS) {
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
- talloc_free(mem_ctx);
- return NULL;
- }
-
- ret = ldb_build_add_req(&req, ldb_ctx, mem_ctx, msg, parsed_controls,
- NULL, ldb_op_default_callback, NULL);
- if (ret != LDB_SUCCESS) {
- PyErr_SetString(PyExc_TypeError, "failed to build request");
- talloc_free(mem_ctx);
- return NULL;
- }
-
- /* do request and autostart a transaction */
- /* Then let's LDB handle the message error in case of pb as they are meaningful */
-
- ret = ldb_transaction_start(ldb_ctx);
- if (ret != LDB_SUCCESS) {
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
- }
-
- ret = ldb_request(ldb_ctx, req);
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
- if (ret == LDB_SUCCESS) {
- ret = ldb_transaction_commit(ldb_ctx);
- } else {
- ldb_transaction_cancel(ldb_ctx);
- if (ldb_ctx->err_string == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb_ctx, "%s (%d)", ldb_strerror(ret), ret);
- }
- }
-
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_delete(PyLdbObject *self, PyObject *args, PyObject *kwargs)
-{
- PyObject *py_dn;
- struct ldb_dn *dn;
- int ret;
- struct ldb_context *ldb_ctx;
- struct ldb_request *req;
- PyObject *py_controls = Py_None;
- TALLOC_CTX *mem_ctx;
- struct ldb_control **parsed_controls;
- const char * const kwnames[] = { "dn", "controls", NULL };
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O",
- discard_const_p(char *, kwnames),
- &py_dn, &py_controls))
- return NULL;
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ldb_ctx = PyLdb_AsLdbContext(self);
-
- if (py_controls == Py_None) {
- parsed_controls = NULL;
- } else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
- parsed_controls = ldb_parse_control_strings(ldb_ctx, mem_ctx, controls);
- talloc_free(controls);
- }
-
- if (!PyObject_AsDn(mem_ctx, py_dn, ldb_ctx, &dn)) {
- talloc_free(mem_ctx);
- return NULL;
- }
-
- ret = ldb_build_del_req(&req, ldb_ctx, mem_ctx, dn, parsed_controls,
- NULL, ldb_op_default_callback, NULL);
- if (ret != LDB_SUCCESS) {
- PyErr_SetString(PyExc_TypeError, "failed to build request");
- talloc_free(mem_ctx);
- return NULL;
- }
-
- /* do request and autostart a transaction */
- /* Then let's LDB handle the message error in case of pb as they are meaningful */
-
- ret = ldb_transaction_start(ldb_ctx);
- if (ret != LDB_SUCCESS) {
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
- }
-
- ret = ldb_request(ldb_ctx, req);
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
- if (ret == LDB_SUCCESS) {
- ret = ldb_transaction_commit(ldb_ctx);
- } else {
- ldb_transaction_cancel(ldb_ctx);
- if (ldb_ctx->err_string == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb_ctx, "%s (%d)", ldb_strerror(ret), ret);
- }
- }
-
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_rename(PyLdbObject *self, PyObject *args, PyObject *kwargs)
-{
- PyObject *py_dn1, *py_dn2;
- struct ldb_dn *dn1, *dn2;
- int ret;
- struct ldb_context *ldb;
- TALLOC_CTX *mem_ctx;
- PyObject *py_controls = Py_None;
- struct ldb_control **parsed_controls;
- struct ldb_context *ldb_ctx;
- struct ldb_request *req;
- const char * const kwnames[] = { "dn1", "dn2", "controls", NULL };
-
- ldb_ctx = PyLdb_AsLdbContext(self);
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|O",
- discard_const_p(char *, kwnames),
- &py_dn1, &py_dn2, &py_controls))
- return NULL;
-
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ldb = PyLdb_AsLdbContext(self);
-
- if (py_controls == Py_None) {
- parsed_controls = NULL;
- } else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
- parsed_controls = ldb_parse_control_strings(ldb_ctx, mem_ctx, controls);
- talloc_free(controls);
- }
-
-
- if (!PyObject_AsDn(mem_ctx, py_dn1, ldb, &dn1)) {
- talloc_free(mem_ctx);
- return NULL;
- }
-
- if (!PyObject_AsDn(mem_ctx, py_dn2, ldb, &dn2)) {
- talloc_free(mem_ctx);
- return NULL;
- }
-
- ret = ldb_build_rename_req(&req, ldb_ctx, mem_ctx, dn1, dn2, parsed_controls,
- NULL, ldb_op_default_callback, NULL);
- if (ret != LDB_SUCCESS) {
- PyErr_SetString(PyExc_TypeError, "failed to build request");
- talloc_free(mem_ctx);
- return NULL;
- }
-
- /* do request and autostart a transaction */
- /* Then let's LDB handle the message error in case of pb as they are meaningful */
-
- ret = ldb_transaction_start(ldb_ctx);
- if (ret != LDB_SUCCESS) {
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
- }
-
- ret = ldb_request(ldb_ctx, req);
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
- if (ret == LDB_SUCCESS) {
- ret = ldb_transaction_commit(ldb_ctx);
- } else {
- ldb_transaction_cancel(ldb_ctx);
- if (ldb_ctx->err_string == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb_ctx, "%s (%d)", ldb_strerror(ret), ret);
- }
- }
-
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_schema_attribute_remove(PyLdbObject *self, PyObject *args)
-{
- char *name;
- if (!PyArg_ParseTuple(args, "s", &name))
- return NULL;
-
- ldb_schema_attribute_remove(PyLdb_AsLdbContext(self), name);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_schema_attribute_add(PyLdbObject *self, PyObject *args)
-{
- char *attribute, *syntax;
- unsigned int flags;
- int ret;
- if (!PyArg_ParseTuple(args, "sIs", &attribute, &flags, &syntax))
- return NULL;
-
- ret = ldb_schema_attribute_add(PyLdb_AsLdbContext(self), attribute, flags, syntax);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, PyLdb_AsLdbContext(self));
-
- Py_RETURN_NONE;
-}
-
-static PyObject *ldb_ldif_to_pyobject(struct ldb_ldif *ldif)
-{
- if (ldif == NULL) {
- Py_RETURN_NONE;
- } else {
- /* We don't want this attached to the 'ldb' any more */
- return Py_BuildValue(discard_const_p(char, "(iO)"),
- ldif->changetype,
- PyLdbMessage_FromMessage(ldif->msg));
- }
-}
-
-
-static PyObject *py_ldb_write_ldif(PyLdbObject *self, PyObject *args)
-{
- int changetype;
- PyObject *py_msg;
- struct ldb_ldif ldif;
- PyObject *ret;
- char *string;
- TALLOC_CTX *mem_ctx;
-
- if (!PyArg_ParseTuple(args, "Oi", &py_msg, &changetype))
- return NULL;
-
- if (!PyLdbMessage_Check(py_msg)) {
- PyErr_SetString(PyExc_TypeError, "Expected Ldb Message for msg");
- return NULL;
- }
-
- ldif.msg = PyLdbMessage_AsMessage(py_msg);
- ldif.changetype = changetype;
-
- mem_ctx = talloc_new(NULL);
-
- string = ldb_ldif_write_string(PyLdb_AsLdbContext(self), mem_ctx, &ldif);
- if (!string) {
- PyErr_SetString(PyExc_KeyError, "Failed to generate LDIF");
- return NULL;
- }
-
- ret = PyString_FromString(string);
-
- talloc_free(mem_ctx);
-
- return ret;
-}
-
-static PyObject *py_ldb_parse_ldif(PyLdbObject *self, PyObject *args)
-{
- PyObject *list;
- struct ldb_ldif *ldif;
- const char *s;
-
- TALLOC_CTX *mem_ctx;
-
- if (!PyArg_ParseTuple(args, "s", &s))
- return NULL;
-
- mem_ctx = talloc_new(NULL);
- if (!mem_ctx) {
- Py_RETURN_NONE;
- }
-
- list = PyList_New(0);
- while (s && *s != '\0') {
- ldif = ldb_ldif_read_string(self->ldb_ctx, &s);
- talloc_steal(mem_ctx, ldif);
- if (ldif) {
- PyList_Append(list, ldb_ldif_to_pyobject(ldif));
- } else {
- PyErr_SetString(PyExc_ValueError, "unable to parse ldif string");
- talloc_free(mem_ctx);
- return NULL;
- }
- }
- talloc_free(mem_ctx); /* The pyobject already has a reference to the things it needs */
- return PyObject_GetIter(list);
-}
-
-static PyObject *py_ldb_msg_diff(PyLdbObject *self, PyObject *args)
-{
- int ldb_ret;
- PyObject *py_msg_old;
- PyObject *py_msg_new;
- struct ldb_message *diff;
- struct ldb_context *ldb;
- PyObject *py_ret;
-
- if (!PyArg_ParseTuple(args, "OO", &py_msg_old, &py_msg_new))
- return NULL;
-
- if (!PyLdbMessage_Check(py_msg_old)) {
- PyErr_SetString(PyExc_TypeError, "Expected Ldb Message for old message");
- return NULL;
- }
-
- if (!PyLdbMessage_Check(py_msg_new)) {
- PyErr_SetString(PyExc_TypeError, "Expected Ldb Message for new message");
- return NULL;
- }
-
- ldb = PyLdb_AsLdbContext(self);
- ldb_ret = ldb_msg_difference(ldb, ldb,
- PyLdbMessage_AsMessage(py_msg_old),
- PyLdbMessage_AsMessage(py_msg_new),
- &diff);
- if (ldb_ret != LDB_SUCCESS) {
- PyErr_SetString(PyExc_RuntimeError, "Failed to generate the Ldb Message diff");
- return NULL;
- }
-
- py_ret = PyLdbMessage_FromMessage(diff);
-
- talloc_unlink(ldb, diff);
-
- return py_ret;
-}
-
-static PyObject *py_ldb_schema_format_value(PyLdbObject *self, PyObject *args)
-{
- const struct ldb_schema_attribute *a;
- struct ldb_val old_val;
- struct ldb_val new_val;
- TALLOC_CTX *mem_ctx;
- PyObject *ret;
- char *element_name;
- PyObject *val;
-
- if (!PyArg_ParseTuple(args, "sO", &element_name, &val))
- return NULL;
-
- mem_ctx = talloc_new(NULL);
-
- old_val.data = (uint8_t *)PyString_AsString(val);
- old_val.length = PyString_Size(val);
-
- a = ldb_schema_attribute_by_name(PyLdb_AsLdbContext(self), element_name);
-
- if (a == NULL) {
- Py_RETURN_NONE;
- }
-
- if (a->syntax->ldif_write_fn(PyLdb_AsLdbContext(self), mem_ctx, &old_val, &new_val) != 0) {
- talloc_free(mem_ctx);
- Py_RETURN_NONE;
- }
-
- ret = PyString_FromStringAndSize((const char *)new_val.data, new_val.length);
-
- talloc_free(mem_ctx);
-
- return ret;
-}
-
-static PyObject *py_ldb_search(PyLdbObject *self, PyObject *args, PyObject *kwargs)
-{
- PyObject *py_base = Py_None;
- int scope = LDB_SCOPE_DEFAULT;
- char *expr = NULL;
- PyObject *py_attrs = Py_None;
- PyObject *py_controls = Py_None;
- const char * const kwnames[] = { "base", "scope", "expression", "attrs", "controls", NULL };
- int ret;
- struct ldb_result *res;
- struct ldb_request *req;
- const char **attrs;
- struct ldb_context *ldb_ctx;
- struct ldb_control **parsed_controls;
- struct ldb_dn *base;
- PyObject *py_ret;
- TALLOC_CTX *mem_ctx;
-
- /* type "int" rather than "enum" for "scope" is intentional */
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OizOO",
- discard_const_p(char *, kwnames),
- &py_base, &scope, &expr, &py_attrs, &py_controls))
- return NULL;
-
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ldb_ctx = PyLdb_AsLdbContext(self);
-
- if (py_attrs == Py_None) {
- attrs = NULL;
- } else {
- attrs = PyList_AsStringList(mem_ctx, py_attrs, "attrs");
- if (attrs == NULL) {
- talloc_free(mem_ctx);
- return NULL;
- }
- }
-
- if (py_base == Py_None) {
- base = ldb_get_default_basedn(ldb_ctx);
- } else {
- if (!PyObject_AsDn(ldb_ctx, py_base, ldb_ctx, &base)) {
- talloc_free(attrs);
- return NULL;
- }
- }
-
- if (py_controls == Py_None) {
- parsed_controls = NULL;
- } else {
- const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
- parsed_controls = ldb_parse_control_strings(ldb_ctx, mem_ctx, controls);
- talloc_free(controls);
- }
-
- res = talloc_zero(mem_ctx, struct ldb_result);
- if (res == NULL) {
- PyErr_NoMemory();
- talloc_free(mem_ctx);
- return NULL;
- }
-
- ret = ldb_build_search_req(&req, ldb_ctx, mem_ctx,
- base,
- scope,
- expr,
- attrs,
- parsed_controls,
- res,
- ldb_search_default_callback,
- NULL);
-
- if (ret != LDB_SUCCESS) {
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
- return NULL;
- }
-
- talloc_steal(req, attrs);
-
- ret = ldb_request(ldb_ctx, req);
-
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
- if (ret != LDB_SUCCESS) {
- talloc_free(mem_ctx);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
- return NULL;
- }
-
- py_ret = PyLdbResult_FromResult(res);
-
- talloc_free(mem_ctx);
-
- return py_ret;
-}
-
-static PyObject *py_ldb_get_opaque(PyLdbObject *self, PyObject *args)
-{
- char *name;
- void *data;
-
- if (!PyArg_ParseTuple(args, "s", &name))
- return NULL;
-
- data = ldb_get_opaque(PyLdb_AsLdbContext(self), name);
-
- if (data == NULL)
- Py_RETURN_NONE;
-
- /* FIXME: More interpretation */
-
- return Py_True;
-}
-
-static PyObject *py_ldb_set_opaque(PyLdbObject *self, PyObject *args)
-{
- char *name;
- PyObject *data;
-
- if (!PyArg_ParseTuple(args, "sO", &name, &data))
- return NULL;
-
- /* FIXME: More interpretation */
-
- ldb_set_opaque(PyLdb_AsLdbContext(self), name, data);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_modules(PyLdbObject *self)
-{
- struct ldb_context *ldb = PyLdb_AsLdbContext(self);
- PyObject *ret = PyList_New(0);
- struct ldb_module *mod;
-
- for (mod = ldb->modules; mod; mod = mod->next) {
- PyList_Append(ret, PyLdbModule_FromModule(mod));
- }
-
- return ret;
-}
-
-static PyObject *py_ldb_sequence_number(PyLdbObject *self, PyObject *args)
-{
- struct ldb_context *ldb = PyLdb_AsLdbContext(self);
- int type, ret;
- uint64_t value;
-
- if (!PyArg_ParseTuple(args, "i", &type))
- return NULL;
-
- /* FIXME: More interpretation */
-
- ret = ldb_sequence_number(ldb, type, &value);
-
- if (ret != LDB_SUCCESS) {
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb);
- return NULL;
- }
- return PyLong_FromLongLong(value);
-}
-static PyMethodDef py_ldb_methods[] = {
- { "set_debug", (PyCFunction)py_ldb_set_debug, METH_VARARGS,
- "S.set_debug(callback) -> None\n"
- "Set callback for LDB debug messages.\n"
- "The callback should accept a debug level and debug text." },
- { "set_create_perms", (PyCFunction)py_ldb_set_create_perms, METH_VARARGS,
- "S.set_create_perms(mode) -> None\n"
- "Set mode to use when creating new LDB files." },
- { "set_modules_dir", (PyCFunction)py_ldb_set_modules_dir, METH_VARARGS,
- "S.set_modules_dir(path) -> None\n"
- "Set path LDB should search for modules" },
- { "transaction_start", (PyCFunction)py_ldb_transaction_start, METH_NOARGS,
- "S.transaction_start() -> None\n"
- "Start a new transaction." },
- { "transaction_prepare_commit", (PyCFunction)py_ldb_transaction_prepare_commit, METH_NOARGS,
- "S.transaction_prepare_commit() -> None\n"
- "prepare to commit a new transaction (2-stage commit)." },
- { "transaction_commit", (PyCFunction)py_ldb_transaction_commit, METH_NOARGS,
- "S.transaction_commit() -> None\n"
- "commit a new transaction." },
- { "transaction_cancel", (PyCFunction)py_ldb_transaction_cancel, METH_NOARGS,
- "S.transaction_cancel() -> None\n"
- "cancel a new transaction." },
- { "setup_wellknown_attributes", (PyCFunction)py_ldb_setup_wellknown_attributes, METH_NOARGS,
- NULL },
- { "get_root_basedn", (PyCFunction)py_ldb_get_root_basedn, METH_NOARGS,
- NULL },
- { "get_schema_basedn", (PyCFunction)py_ldb_get_schema_basedn, METH_NOARGS,
- NULL },
- { "get_default_basedn", (PyCFunction)py_ldb_get_default_basedn, METH_NOARGS,
- NULL },
- { "get_config_basedn", (PyCFunction)py_ldb_get_config_basedn, METH_NOARGS,
- NULL },
- { "connect", (PyCFunction)py_ldb_connect, METH_VARARGS|METH_KEYWORDS,
- "S.connect(url, flags=0, options=None) -> None\n"
- "Connect to a LDB URL." },
- { "modify", (PyCFunction)py_ldb_modify, METH_VARARGS|METH_KEYWORDS,
- "S.modify(message, controls=None, validate=False) -> None\n"
- "Modify an entry." },
- { "add", (PyCFunction)py_ldb_add, METH_VARARGS|METH_KEYWORDS,
- "S.add(message, controls=None) -> None\n"
- "Add an entry." },
- { "delete", (PyCFunction)py_ldb_delete, METH_VARARGS|METH_KEYWORDS,
- "S.delete(dn, controls=None) -> None\n"
- "Remove an entry." },
- { "rename", (PyCFunction)py_ldb_rename, METH_VARARGS|METH_KEYWORDS,
- "S.rename(old_dn, new_dn, controls=None) -> None\n"
- "Rename an entry." },
- { "search", (PyCFunction)py_ldb_search, METH_VARARGS|METH_KEYWORDS,
- "S.search(base=None, scope=None, expression=None, attrs=None, controls=None) -> msgs\n"
- "Search in a database.\n"
- "\n"
- ":param base: Optional base DN to search\n"
- ":param scope: Search scope (SCOPE_BASE, SCOPE_ONELEVEL or SCOPE_SUBTREE)\n"
- ":param expression: Optional search expression\n"
- ":param attrs: Attributes to return (defaults to all)\n"
- ":param controls: Optional list of controls\n"
- ":return: Iterator over Message objects\n"
- },
- { "schema_attribute_remove", (PyCFunction)py_ldb_schema_attribute_remove, METH_VARARGS,
- NULL },
- { "schema_attribute_add", (PyCFunction)py_ldb_schema_attribute_add, METH_VARARGS,
- NULL },
- { "schema_format_value", (PyCFunction)py_ldb_schema_format_value, METH_VARARGS,
- NULL },
- { "parse_ldif", (PyCFunction)py_ldb_parse_ldif, METH_VARARGS,
- "S.parse_ldif(ldif) -> iter(messages)\n"
- "Parse a string formatted using LDIF." },
- { "write_ldif", (PyCFunction)py_ldb_write_ldif, METH_VARARGS,
- "S.write_ldif(message, changetype) -> ldif\n"
- "Print the message as a string formatted using LDIF." },
- { "msg_diff", (PyCFunction)py_ldb_msg_diff, METH_VARARGS,
- "S.msg_diff(Message) -> Message\n"
- "Return an LDB Message of the difference between two Message objects." },
- { "get_opaque", (PyCFunction)py_ldb_get_opaque, METH_VARARGS,
- "S.get_opaque(name) -> value\n"
- "Get an opaque value set on this LDB connection. \n"
- ":note: The returned value may not be useful in Python."
- },
- { "set_opaque", (PyCFunction)py_ldb_set_opaque, METH_VARARGS,
- "S.set_opaque(name, value) -> None\n"
- "Set an opaque value on this LDB connection. \n"
- ":note: Passing incorrect values may cause crashes." },
- { "modules", (PyCFunction)py_ldb_modules, METH_NOARGS,
- "S.modules() -> list\n"
- "Return the list of modules on this LDB connection " },
- { "sequence_number", (PyCFunction)py_ldb_sequence_number, METH_VARARGS,
- "S.sequence_number(type) -> value\n"
- "Return the value of the sequence according to the requested type" },
- { NULL },
-};
-
-static PyObject *PyLdbModule_FromModule(struct ldb_module *mod)
-{
- PyLdbModuleObject *ret;
-
- ret = (PyLdbModuleObject *)PyLdbModule.tp_alloc(&PyLdbModule, 0);
- if (ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ret->mem_ctx = talloc_new(NULL);
- ret->mod = talloc_reference(ret->mem_ctx, mod);
- return (PyObject *)ret;
-}
-
-static PyObject *py_ldb_get_firstmodule(PyLdbObject *self, void *closure)
-{
- return PyLdbModule_FromModule(PyLdb_AsLdbContext(self)->modules);
-}
-
-static PyGetSetDef py_ldb_getset[] = {
- { discard_const_p(char, "firstmodule"), (getter)py_ldb_get_firstmodule, NULL, NULL },
- { NULL }
-};
-
-static int py_ldb_contains(PyLdbObject *self, PyObject *obj)
-{
- struct ldb_context *ldb_ctx = PyLdb_AsLdbContext(self);
- struct ldb_dn *dn;
- struct ldb_result *result;
- unsigned int count;
- int ret;
-
- if (!PyObject_AsDn(ldb_ctx, obj, ldb_ctx, &dn)) {
- return -1;
- }
-
- ret = ldb_search(ldb_ctx, ldb_ctx, &result, dn, LDB_SCOPE_BASE, NULL,
- NULL);
- if (ret != LDB_SUCCESS) {
- PyErr_SetLdbError(PyExc_LdbError, ret, ldb_ctx);
- return -1;
- }
-
- count = result->count;
-
- talloc_free(result);
-
- if (count > 1) {
- PyErr_Format(PyExc_RuntimeError,
- "Searching for [%s] dn gave %u results!",
- ldb_dn_get_linearized(dn),
- count);
- return -1;
- }
-
- return count;
-}
-
-static PySequenceMethods py_ldb_seq = {
- .sq_contains = (objobjproc)py_ldb_contains,
-};
-
-static PyObject *PyLdb_FromLdbContext(struct ldb_context *ldb_ctx)
-{
- PyLdbObject *ret;
-
- ret = (PyLdbObject *)PyLdb.tp_alloc(&PyLdb, 0);
- if (ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ret->mem_ctx = talloc_new(NULL);
- ret->ldb_ctx = talloc_reference(ret->mem_ctx, ldb_ctx);
- return (PyObject *)ret;
-}
-
-static void py_ldb_dealloc(PyLdbObject *self)
-{
- talloc_free(self->mem_ctx);
- self->ob_type->tp_free(self);
-}
-
-static PyTypeObject PyLdb = {
- .tp_name = "ldb.Ldb",
- .tp_methods = py_ldb_methods,
- .tp_repr = (reprfunc)py_ldb_repr,
- .tp_new = py_ldb_new,
- .tp_init = (initproc)py_ldb_init,
- .tp_dealloc = (destructor)py_ldb_dealloc,
- .tp_getset = py_ldb_getset,
- .tp_getattro = PyObject_GenericGetAttr,
- .tp_basicsize = sizeof(PyLdbObject),
- .tp_doc = "Connection to a LDB database.",
- .tp_as_sequence = &py_ldb_seq,
- .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-};
-
-static void py_ldb_result_dealloc(PyLdbResultObject *self)
-{
- talloc_free(self->mem_ctx);
- Py_DECREF(self->msgs);
- Py_DECREF(self->referals);
- Py_DECREF(self->controls);
- self->ob_type->tp_free(self);
-}
-
-static PyObject *py_ldb_result_get_msgs(PyLdbResultObject *self, void *closure)
-{
- Py_INCREF(self->msgs);
- return self->msgs;
-}
-
-static PyObject *py_ldb_result_get_controls(PyLdbResultObject *self, void *closure)
-{
- Py_INCREF(self->controls);
- return self->controls;
-}
-
-static PyObject *py_ldb_result_get_referals(PyLdbResultObject *self, void *closure)
-{
- Py_INCREF(self->referals);
- return self->referals;
-}
-
-static PyObject *py_ldb_result_get_count(PyLdbResultObject *self, void *closure)
-{
- Py_ssize_t size;
- if (self->msgs == NULL) {
- PyErr_SetString(PyExc_AttributeError, "Count attribute is meaningless in this context");
- return NULL;
- }
- size = PyList_Size(self->msgs);
- return PyInt_FromLong(size);
-}
-
-static PyGetSetDef py_ldb_result_getset[] = {
- { discard_const_p(char, "controls"), (getter)py_ldb_result_get_controls, NULL, NULL },
- { discard_const_p(char, "msgs"), (getter)py_ldb_result_get_msgs, NULL, NULL },
- { discard_const_p(char, "referals"), (getter)py_ldb_result_get_referals, NULL, NULL },
- { discard_const_p(char, "count"), (getter)py_ldb_result_get_count, NULL, NULL },
- { NULL }
-};
-
-static PyObject *py_ldb_result_iter(PyLdbResultObject *self)
-{
- return PyObject_GetIter(self->msgs);
-}
-
-static Py_ssize_t py_ldb_result_len(PyLdbResultObject *self)
-{
- return PySequence_Size(self->msgs);
-}
-
-static PyObject *py_ldb_result_find(PyLdbResultObject *self, Py_ssize_t idx)
-{
- return PySequence_GetItem(self->msgs, idx);
-}
-
-static PySequenceMethods py_ldb_result_seq = {
- .sq_length = (lenfunc)py_ldb_result_len,
- .sq_item = (ssizeargfunc)py_ldb_result_find,
-};
-
-static PyObject *py_ldb_result_repr(PyLdbObject *self)
-{
- return PyString_FromFormat("<ldb result>");
-}
-
-
-static PyTypeObject PyLdbResult = {
- .tp_name = "ldb.Result",
- .tp_repr = (reprfunc)py_ldb_result_repr,
- .tp_dealloc = (destructor)py_ldb_result_dealloc,
- .tp_iter = (getiterfunc)py_ldb_result_iter,
- .tp_getset = py_ldb_result_getset,
- .tp_getattro = PyObject_GenericGetAttr,
- .tp_basicsize = sizeof(PyLdbResultObject),
- .tp_as_sequence = &py_ldb_result_seq,
- .tp_doc = "LDB result.",
- .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-};
-
-static PyObject *py_ldb_module_repr(PyLdbModuleObject *self)
-{
- return PyString_FromFormat("<ldb module '%s'>", PyLdbModule_AsModule(self)->ops->name);
-}
-
-static PyObject *py_ldb_module_str(PyLdbModuleObject *self)
-{
- return PyString_FromString(PyLdbModule_AsModule(self)->ops->name);
-}
-
-static PyObject *py_ldb_module_start_transaction(PyLdbModuleObject *self)
-{
- PyLdbModule_AsModule(self)->ops->start_transaction(PyLdbModule_AsModule(self));
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_module_end_transaction(PyLdbModuleObject *self)
-{
- PyLdbModule_AsModule(self)->ops->end_transaction(PyLdbModule_AsModule(self));
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_module_del_transaction(PyLdbModuleObject *self)
-{
- PyLdbModule_AsModule(self)->ops->del_transaction(PyLdbModule_AsModule(self));
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_module_search(PyLdbModuleObject *self, PyObject *args, PyObject *kwargs)
-{
- PyObject *py_base, *py_tree, *py_attrs, *py_ret;
- int ret, scope;
- struct ldb_request *req;
- const char * const kwnames[] = { "base", "scope", "tree", "attrs", NULL };
- struct ldb_module *mod;
- const char * const*attrs;
-
- /* type "int" rather than "enum" for "scope" is intentional */
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OiOO",
- discard_const_p(char *, kwnames),
- &py_base, &scope, &py_tree, &py_attrs))
- return NULL;
-
- mod = self->mod;
-
- if (py_attrs == Py_None) {
- attrs = NULL;
- } else {
- attrs = PyList_AsStringList(NULL, py_attrs, "attrs");
- if (attrs == NULL)
- return NULL;
- }
-
- ret = ldb_build_search_req(&req, mod->ldb, NULL, PyLdbDn_AsDn(py_base),
- scope, NULL /* expr */, attrs,
- NULL /* controls */, NULL, NULL, NULL);
-
- talloc_steal(req, attrs);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, mod->ldb);
-
- req->op.search.res = NULL;
-
- ret = mod->ops->search(mod, req);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, mod->ldb);
-
- py_ret = PyLdbResult_FromResult(req->op.search.res);
-
- talloc_free(req);
-
- return py_ret;
-}
-
-
-static PyObject *py_ldb_module_add(PyLdbModuleObject *self, PyObject *args)
-{
- struct ldb_request *req;
- PyObject *py_message;
- int ret;
- struct ldb_module *mod;
-
- if (!PyArg_ParseTuple(args, "O", &py_message))
- return NULL;
-
- req = talloc_zero(NULL, struct ldb_request);
- req->operation = LDB_ADD;
- req->op.add.message = PyLdbMessage_AsMessage(py_message);
-
- mod = PyLdbModule_AsModule(self);
- ret = mod->ops->add(mod, req);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, mod->ldb);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_module_modify(PyLdbModuleObject *self, PyObject *args)
-{
- int ret;
- struct ldb_request *req;
- PyObject *py_message;
- struct ldb_module *mod;
-
- if (!PyArg_ParseTuple(args, "O", &py_message))
- return NULL;
-
- req = talloc_zero(NULL, struct ldb_request);
- req->operation = LDB_MODIFY;
- req->op.mod.message = PyLdbMessage_AsMessage(py_message);
-
- mod = PyLdbModule_AsModule(self);
- ret = mod->ops->modify(mod, req);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, mod->ldb);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_module_delete(PyLdbModuleObject *self, PyObject *args)
-{
- int ret;
- struct ldb_request *req;
- PyObject *py_dn;
-
- if (!PyArg_ParseTuple(args, "O", &py_dn))
- return NULL;
-
- req = talloc_zero(NULL, struct ldb_request);
- req->operation = LDB_DELETE;
- req->op.del.dn = PyLdbDn_AsDn(py_dn);
-
- ret = PyLdbModule_AsModule(self)->ops->del(PyLdbModule_AsModule(self), req);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, NULL);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_module_rename(PyLdbModuleObject *self, PyObject *args)
-{
- int ret;
- struct ldb_request *req;
- PyObject *py_dn1, *py_dn2;
-
- if (!PyArg_ParseTuple(args, "OO", &py_dn1, &py_dn2))
- return NULL;
-
- req = talloc_zero(NULL, struct ldb_request);
-
- req->operation = LDB_RENAME;
- req->op.rename.olddn = PyLdbDn_AsDn(py_dn1);
- req->op.rename.newdn = PyLdbDn_AsDn(py_dn2);
-
- ret = PyLdbModule_AsModule(self)->ops->rename(PyLdbModule_AsModule(self), req);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, NULL);
-
- Py_RETURN_NONE;
-}
-
-static PyMethodDef py_ldb_module_methods[] = {
- { "search", (PyCFunction)py_ldb_module_search, METH_VARARGS|METH_KEYWORDS, NULL },
- { "add", (PyCFunction)py_ldb_module_add, METH_VARARGS, NULL },
- { "modify", (PyCFunction)py_ldb_module_modify, METH_VARARGS, NULL },
- { "rename", (PyCFunction)py_ldb_module_rename, METH_VARARGS, NULL },
- { "delete", (PyCFunction)py_ldb_module_delete, METH_VARARGS, NULL },
- { "start_transaction", (PyCFunction)py_ldb_module_start_transaction, METH_NOARGS, NULL },
- { "end_transaction", (PyCFunction)py_ldb_module_end_transaction, METH_NOARGS, NULL },
- { "del_transaction", (PyCFunction)py_ldb_module_del_transaction, METH_NOARGS, NULL },
- { NULL },
-};
-
-static void py_ldb_module_dealloc(PyLdbModuleObject *self)
-{
- talloc_free(self->mem_ctx);
- PyObject_Del(self);
-}
-
-static PyTypeObject PyLdbModule = {
- .tp_name = "ldb.LdbModule",
- .tp_methods = py_ldb_module_methods,
- .tp_repr = (reprfunc)py_ldb_module_repr,
- .tp_str = (reprfunc)py_ldb_module_str,
- .tp_basicsize = sizeof(PyLdbModuleObject),
- .tp_dealloc = (destructor)py_ldb_module_dealloc,
- .tp_flags = Py_TPFLAGS_DEFAULT,
-};
-
-
-/**
- * Create a ldb_message_element from a Python object.
- *
- * This will accept any sequence objects that contains strings, or
- * a string object.
- *
- * A reference to set_obj will be borrowed.
- *
- * @param mem_ctx Memory context
- * @param set_obj Python object to convert
- * @param flags ldb_message_element flags to set
- * @param attr_name Name of the attribute
- * @return New ldb_message_element, allocated as child of mem_ctx
- */
-static struct ldb_message_element *PyObject_AsMessageElement(
- TALLOC_CTX *mem_ctx,
- PyObject *set_obj,
- unsigned int flags,
- const char *attr_name)
-{
- struct ldb_message_element *me;
-
- if (PyLdbMessageElement_Check(set_obj)) {
- PyLdbMessageElementObject *set_obj_as_me = (PyLdbMessageElementObject *)set_obj;
- /* We have to talloc_reference() the memory context, not the pointer
- * which may not actually be it's own context */
- if (talloc_reference(mem_ctx, set_obj_as_me->mem_ctx)) {
- return PyLdbMessageElement_AsMessageElement(set_obj);
- }
- return NULL;
- }
-
- me = talloc(mem_ctx, struct ldb_message_element);
- if (me == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- me->name = talloc_strdup(me, attr_name);
- me->flags = flags;
- if (PyString_Check(set_obj)) {
- me->num_values = 1;
- me->values = talloc_array(me, struct ldb_val, me->num_values);
- me->values[0].length = PyString_Size(set_obj);
- me->values[0].data = talloc_memdup(me,
- (uint8_t *)PyString_AsString(set_obj), me->values[0].length+1);
- } else if (PySequence_Check(set_obj)) {
- Py_ssize_t i;
- me->num_values = PySequence_Size(set_obj);
- me->values = talloc_array(me, struct ldb_val, me->num_values);
- for (i = 0; i < me->num_values; i++) {
- PyObject *obj = PySequence_GetItem(set_obj, i);
- if (!PyString_Check(obj)) {
- PyErr_Format(PyExc_TypeError,
- "Expected string as element %zd in list", i);
- talloc_free(me);
- return NULL;
- }
-
- me->values[i].length = PyString_Size(obj);
- me->values[i].data = talloc_memdup(me,
- (uint8_t *)PyString_AsString(obj), me->values[i].length+1);
- }
- } else {
- talloc_free(me);
- me = NULL;
- }
-
- return me;
-}
-
-
-static PyObject *ldb_msg_element_to_set(struct ldb_context *ldb_ctx,
- struct ldb_message_element *me)
-{
- Py_ssize_t i;
- PyObject *result;
-
- /* Python << 2.5 doesn't have PySet_New and PySet_Add. */
- result = PyList_New(me->num_values);
-
- for (i = 0; i < me->num_values; i++) {
- PyList_SetItem(result, i,
- PyObject_FromLdbValue(&me->values[i]));
- }
-
- return result;
-}
-
-static PyObject *py_ldb_msg_element_get(PyLdbMessageElementObject *self, PyObject *args)
-{
- unsigned int i;
- if (!PyArg_ParseTuple(args, "I", &i))
- return NULL;
- if (i >= PyLdbMessageElement_AsMessageElement(self)->num_values)
- Py_RETURN_NONE;
-
- return PyObject_FromLdbValue(&(PyLdbMessageElement_AsMessageElement(self)->values[i]));
-}
-
-static PyObject *py_ldb_msg_element_flags(PyLdbMessageElementObject *self, PyObject *args)
-{
- struct ldb_message_element *el = PyLdbMessageElement_AsMessageElement(self);
- return PyInt_FromLong(el->flags);
-}
-
-static PyObject *py_ldb_msg_element_set_flags(PyLdbMessageElementObject *self, PyObject *args)
-{
- unsigned int flags;
- struct ldb_message_element *el;
- if (!PyArg_ParseTuple(args, "I", &flags))
- return NULL;
-
- el = PyLdbMessageElement_AsMessageElement(self);
- el->flags = flags;
- Py_RETURN_NONE;
-}
-
-static PyMethodDef py_ldb_msg_element_methods[] = {
- { "get", (PyCFunction)py_ldb_msg_element_get, METH_VARARGS, NULL },
- { "set_flags", (PyCFunction)py_ldb_msg_element_set_flags, METH_VARARGS, NULL },
- { "flags", (PyCFunction)py_ldb_msg_element_flags, METH_NOARGS, NULL },
- { NULL },
-};
-
-static Py_ssize_t py_ldb_msg_element_len(PyLdbMessageElementObject *self)
-{
- return PyLdbMessageElement_AsMessageElement(self)->num_values;
-}
-
-static PyObject *py_ldb_msg_element_find(PyLdbMessageElementObject *self, Py_ssize_t idx)
-{
- struct ldb_message_element *el = PyLdbMessageElement_AsMessageElement(self);
- if (idx < 0 || idx >= el->num_values) {
- PyErr_SetString(PyExc_IndexError, "Out of range");
- return NULL;
- }
- return PyString_FromStringAndSize((char *)el->values[idx].data, el->values[idx].length);
-}
-
-static PySequenceMethods py_ldb_msg_element_seq = {
- .sq_length = (lenfunc)py_ldb_msg_element_len,
- .sq_item = (ssizeargfunc)py_ldb_msg_element_find,
-};
-
-static int py_ldb_msg_element_cmp(PyLdbMessageElementObject *self, PyLdbMessageElementObject *other)
-{
- int ret = ldb_msg_element_compare(PyLdbMessageElement_AsMessageElement(self),
- PyLdbMessageElement_AsMessageElement(other));
- return SIGN(ret);
-}
-
-static PyObject *py_ldb_msg_element_iter(PyLdbMessageElementObject *self)
-{
- return PyObject_GetIter(ldb_msg_element_to_set(NULL, PyLdbMessageElement_AsMessageElement(self)));
-}
-
-static PyObject *PyLdbMessageElement_FromMessageElement(struct ldb_message_element *el, TALLOC_CTX *mem_ctx)
-{
- PyLdbMessageElementObject *ret;
- ret = PyObject_New(PyLdbMessageElementObject, &PyLdbMessageElement);
- if (ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ret->mem_ctx = talloc_new(NULL);
- if (talloc_reference(ret->mem_ctx, mem_ctx) == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ret->el = el;
- return (PyObject *)ret;
-}
-
-static PyObject *py_ldb_msg_element_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
-{
- PyObject *py_elements = NULL;
- struct ldb_message_element *el;
- unsigned int flags = 0;
- char *name = NULL;
- const char * const kwnames[] = { "elements", "flags", "name", NULL };
- PyLdbMessageElementObject *ret;
- TALLOC_CTX *mem_ctx;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OIs",
- discard_const_p(char *, kwnames),
- &py_elements, &flags, &name))
- return NULL;
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- el = talloc_zero(mem_ctx, struct ldb_message_element);
- if (el == NULL) {
- PyErr_NoMemory();
- talloc_free(mem_ctx);
- return NULL;
- }
-
- if (py_elements != NULL) {
- Py_ssize_t i;
- if (PyString_Check(py_elements)) {
- el->num_values = 1;
- el->values = talloc_array(el, struct ldb_val, 1);
- if (el->values == NULL) {
- talloc_free(mem_ctx);
- PyErr_NoMemory();
- return NULL;
- }
- el->values[0].length = PyString_Size(py_elements);
- el->values[0].data = talloc_memdup(el->values,
- (uint8_t *)PyString_AsString(py_elements), el->values[0].length+1);
- } else if (PySequence_Check(py_elements)) {
- el->num_values = PySequence_Size(py_elements);
- el->values = talloc_array(el, struct ldb_val, el->num_values);
- if (el->values == NULL) {
- talloc_free(mem_ctx);
- PyErr_NoMemory();
- return NULL;
- }
- for (i = 0; i < el->num_values; i++) {
- PyObject *item = PySequence_GetItem(py_elements, i);
- if (item == NULL) {
- talloc_free(mem_ctx);
- return NULL;
- }
- if (!PyString_Check(item)) {
- PyErr_Format(PyExc_TypeError,
- "Expected string as element %zd in list", i);
- talloc_free(mem_ctx);
- return NULL;
- }
- el->values[i].length = PyString_Size(item);
- el->values[i].data = talloc_memdup(el,
- (uint8_t *)PyString_AsString(item), el->values[i].length+1);
- }
- } else {
- PyErr_SetString(PyExc_TypeError,
- "Expected string or list");
- talloc_free(mem_ctx);
- return NULL;
- }
- }
-
- el->flags = flags;
- el->name = talloc_strdup(el, name);
-
- ret = PyObject_New(PyLdbMessageElementObject, type);
- if (ret == NULL) {
- talloc_free(mem_ctx);
- return NULL;
- }
-
- ret->mem_ctx = mem_ctx;
- ret->el = el;
- return (PyObject *)ret;
-}
-
-static PyObject *py_ldb_msg_element_repr(PyLdbMessageElementObject *self)
-{
- char *element_str = NULL;
- Py_ssize_t i;
- struct ldb_message_element *el = PyLdbMessageElement_AsMessageElement(self);
- PyObject *ret;
-
- for (i = 0; i < el->num_values; i++) {
- PyObject *o = py_ldb_msg_element_find(self, i);
- if (element_str == NULL)
- element_str = talloc_strdup(NULL, PyObject_REPR(o));
- else
- element_str = talloc_asprintf_append(element_str, ",%s", PyObject_REPR(o));
- }
-
- if (element_str != NULL) {
- ret = PyString_FromFormat("MessageElement([%s])", element_str);
- talloc_free(element_str);
- } else {
- ret = PyString_FromString("MessageElement([])");
- }
-
- return ret;
-}
-
-static PyObject *py_ldb_msg_element_str(PyLdbMessageElementObject *self)
-{
- struct ldb_message_element *el = PyLdbMessageElement_AsMessageElement(self);
-
- if (el->num_values == 1)
- return PyString_FromStringAndSize((char *)el->values[0].data, el->values[0].length);
- else
- Py_RETURN_NONE;
-}
-
-static void py_ldb_msg_element_dealloc(PyLdbMessageElementObject *self)
-{
- talloc_free(self->mem_ctx);
- PyObject_Del(self);
-}
-
-static PyTypeObject PyLdbMessageElement = {
- .tp_name = "ldb.MessageElement",
- .tp_basicsize = sizeof(PyLdbMessageElementObject),
- .tp_dealloc = (destructor)py_ldb_msg_element_dealloc,
- .tp_repr = (reprfunc)py_ldb_msg_element_repr,
- .tp_str = (reprfunc)py_ldb_msg_element_str,
- .tp_methods = py_ldb_msg_element_methods,
- .tp_compare = (cmpfunc)py_ldb_msg_element_cmp,
- .tp_iter = (getiterfunc)py_ldb_msg_element_iter,
- .tp_as_sequence = &py_ldb_msg_element_seq,
- .tp_new = py_ldb_msg_element_new,
- .tp_flags = Py_TPFLAGS_DEFAULT,
-};
-
-
-static PyObject *py_ldb_msg_from_dict(PyTypeObject *type, PyObject *args)
-{
- PyObject *py_ldb;
- PyObject *py_dict;
- PyObject *py_ret;
- struct ldb_message *msg;
- struct ldb_context *ldb_ctx;
- unsigned int mod_flags = LDB_FLAG_MOD_REPLACE;
-
- if (!PyArg_ParseTuple(args, "O!O!|I",
- &PyLdb, &py_ldb, &PyDict_Type, &py_dict,
- &mod_flags)) {
- return NULL;
- }
-
- /* mask only flags we are going to use */
- mod_flags = LDB_FLAG_MOD_TYPE(mod_flags);
- if (!mod_flags) {
- PyErr_SetString(PyExc_ValueError,
- "FLAG_MOD_ADD, FLAG_MOD_REPLACE or FLAG_MOD_DELETE"
- " expected as mod_flag value");
- return NULL;
- }
-
- ldb_ctx = PyLdb_AsLdbContext(py_ldb);
-
- msg = PyDict_AsMessage(ldb_ctx, py_dict, ldb_ctx, mod_flags);
- if (!msg) {
- return NULL;
- }
-
- py_ret = PyLdbMessage_FromMessage(msg);
-
- talloc_unlink(ldb_ctx, msg);
-
- return py_ret;
-}
-
-static PyObject *py_ldb_msg_remove_attr(PyLdbMessageObject *self, PyObject *args)
-{
- char *name;
- if (!PyArg_ParseTuple(args, "s", &name))
- return NULL;
-
- ldb_msg_remove_attr(self->msg, name);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_ldb_msg_keys(PyLdbMessageObject *self)
-{
- struct ldb_message *msg = PyLdbMessage_AsMessage(self);
- Py_ssize_t i, j = 0;
- PyObject *obj = PyList_New(msg->num_elements+(msg->dn != NULL?1:0));
- if (msg->dn != NULL) {
- PyList_SetItem(obj, j, PyString_FromString("dn"));
- j++;
- }
- for (i = 0; i < msg->num_elements; i++) {
- PyList_SetItem(obj, j, PyString_FromString(msg->elements[i].name));
- j++;
- }
- return obj;
-}
-
-static PyObject *py_ldb_msg_getitem_helper(PyLdbMessageObject *self, PyObject *py_name)
-{
- struct ldb_message_element *el;
- char *name;
- struct ldb_message *msg = PyLdbMessage_AsMessage(self);
- if (!PyString_Check(py_name)) {
- PyErr_SetNone(PyExc_TypeError);
- return NULL;
- }
- name = PyString_AsString(py_name);
- if (!strcmp(name, "dn"))
- return PyLdbDn_FromDn(msg->dn);
- el = ldb_msg_find_element(msg, name);
- if (el == NULL) {
- return NULL;
- }
- return (PyObject *)PyLdbMessageElement_FromMessageElement(el, msg->elements);
-}
-
-static PyObject *py_ldb_msg_getitem(PyLdbMessageObject *self, PyObject *py_name)
-{
- PyObject *ret = py_ldb_msg_getitem_helper(self, py_name);
- if (ret == NULL) {
- PyErr_SetString(PyExc_KeyError, "No such element");
- return NULL;
- }
- return ret;
-}
-
-static PyObject *py_ldb_msg_get(PyLdbMessageObject *self, PyObject *args)
-{
- PyObject *name, *ret, *retobj;
- retobj = NULL;
- if (!PyArg_ParseTuple(args, "O|O", &name, &retobj))
- return NULL;
-
- ret = py_ldb_msg_getitem_helper(self, name);
- if (ret == NULL) {
- if (PyErr_Occurred())
- return NULL;
- if (retobj != NULL) {
- return retobj;
- } else {
- Py_RETURN_NONE;
- }
- }
- return ret;
-}
-
-static PyObject *py_ldb_msg_items(PyLdbMessageObject *self)
-{
- struct ldb_message *msg = PyLdbMessage_AsMessage(self);
- Py_ssize_t i, j = 0;
- PyObject *l = PyList_New(msg->num_elements + (msg->dn == NULL?0:1));
- if (msg->dn != NULL) {
- PyList_SetItem(l, 0, Py_BuildValue("(sO)", "dn", PyLdbDn_FromDn(msg->dn)));
- j++;
- }
- for (i = 0; i < msg->num_elements; i++, j++) {
- PyObject *py_el = PyLdbMessageElement_FromMessageElement(&msg->elements[i], msg->elements);
- PyObject *value = Py_BuildValue("(sO)", msg->elements[i].name, py_el);
- PyList_SetItem(l, j, value);
- }
- return l;
-}
-
-static PyObject *py_ldb_msg_elements(PyLdbMessageObject *self)
-{
- struct ldb_message *msg = PyLdbMessage_AsMessage(self);
- Py_ssize_t i = 0;
- PyObject *l = PyList_New(msg->num_elements);
- for (i = 0; i < msg->num_elements; i++) {
- PyList_SetItem(l, i, PyLdbMessageElement_FromMessageElement(&msg->elements[i], msg->elements));
- }
- return l;
-}
-
-static PyObject *py_ldb_msg_add(PyLdbMessageObject *self, PyObject *args)
-{
- struct ldb_message *msg = PyLdbMessage_AsMessage(self);
- PyLdbMessageElementObject *py_element;
- int ret;
- struct ldb_message_element *el;
-
- if (!PyArg_ParseTuple(args, "O!", &PyLdbMessageElement, &py_element))
- return NULL;
-
- el = talloc_reference(msg, py_element->el);
- if (el == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- ret = ldb_msg_add(msg, el, el->flags);
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, NULL);
-
- Py_RETURN_NONE;
-}
-
-static PyMethodDef py_ldb_msg_methods[] = {
- { "from_dict", (PyCFunction)py_ldb_msg_from_dict, METH_CLASS | METH_VARARGS,
- "Message.from_dict(ldb, dict, mod_flag=FLAG_MOD_REPLACE) -> ldb.Message\n"
- "Class method to create ldb.Message object from Dictionary.\n"
- "mod_flag is one of FLAG_MOD_ADD, FLAG_MOD_REPLACE or FLAG_MOD_DELETE."},
- { "keys", (PyCFunction)py_ldb_msg_keys, METH_NOARGS,
- "S.keys() -> list\n\n"
- "Return sequence of all attribute names." },
- { "remove", (PyCFunction)py_ldb_msg_remove_attr, METH_VARARGS,
- "S.remove(name)\n\n"
- "Remove all entries for attributes with the specified name."},
- { "get", (PyCFunction)py_ldb_msg_get, METH_VARARGS, NULL },
- { "items", (PyCFunction)py_ldb_msg_items, METH_NOARGS, NULL },
- { "elements", (PyCFunction)py_ldb_msg_elements, METH_NOARGS, NULL },
- { "add", (PyCFunction)py_ldb_msg_add, METH_VARARGS,
- "S.append(element)\n\n"
- "Add an element to this message." },
- { NULL },
-};
-
-static PyObject *py_ldb_msg_iter(PyLdbMessageObject *self)
-{
- PyObject *list, *iter;
-
- list = py_ldb_msg_keys(self);
- iter = PyObject_GetIter(list);
- Py_DECREF(list);
- return iter;
-}
-
-static int py_ldb_msg_setitem(PyLdbMessageObject *self, PyObject *name, PyObject *value)
-{
- char *attr_name;
-
- if (!PyString_Check(name)) {
- PyErr_SetNone(PyExc_TypeError);
- return -1;
- }
-
- attr_name = PyString_AsString(name);
- if (value == NULL) {
- /* delitem */
- ldb_msg_remove_attr(self->msg, attr_name);
- } else {
- struct ldb_message_element *el = PyObject_AsMessageElement(self->msg,
- value, 0, attr_name);
- if (el == NULL)
- return -1;
- ldb_msg_remove_attr(PyLdbMessage_AsMessage(self), attr_name);
- ldb_msg_add(PyLdbMessage_AsMessage(self), el, el->flags);
- }
- return 0;
-}
-
-static Py_ssize_t py_ldb_msg_length(PyLdbMessageObject *self)
-{
- return PyLdbMessage_AsMessage(self)->num_elements;
-}
-
-static PyMappingMethods py_ldb_msg_mapping = {
- .mp_length = (lenfunc)py_ldb_msg_length,
- .mp_subscript = (binaryfunc)py_ldb_msg_getitem,
- .mp_ass_subscript = (objobjargproc)py_ldb_msg_setitem,
-};
-
-static PyObject *py_ldb_msg_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
-{
- const char * const kwnames[] = { "dn", NULL };
- struct ldb_message *ret;
- TALLOC_CTX *mem_ctx;
- PyObject *pydn = NULL;
- PyLdbMessageObject *py_ret;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O",
- discard_const_p(char *, kwnames),
- &pydn))
- return NULL;
-
- mem_ctx = talloc_new(NULL);
- if (mem_ctx == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- ret = ldb_msg_new(mem_ctx);
- if (ret == NULL) {
- talloc_free(mem_ctx);
- PyErr_NoMemory();
- return NULL;
- }
-
- if (pydn != NULL) {
- struct ldb_dn *dn;
- if (!PyObject_AsDn(NULL, pydn, NULL, &dn)) {
- talloc_free(mem_ctx);
- return NULL;
- }
- ret->dn = talloc_reference(ret, dn);
- }
-
- py_ret = (PyLdbMessageObject *)type->tp_alloc(type, 0);
- if (py_ret == NULL) {
- PyErr_NoMemory();
- talloc_free(mem_ctx);
- return NULL;
- }
-
- py_ret->mem_ctx = mem_ctx;
- py_ret->msg = ret;
- return (PyObject *)py_ret;
-}
-
-static PyObject *PyLdbMessage_FromMessage(struct ldb_message *msg)
-{
- PyLdbMessageObject *ret;
-
- ret = (PyLdbMessageObject *)PyLdbMessage.tp_alloc(&PyLdbMessage, 0);
- if (ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- ret->mem_ctx = talloc_new(NULL);
- ret->msg = talloc_reference(ret->mem_ctx, msg);
- return (PyObject *)ret;
-}
-
-static PyObject *py_ldb_msg_get_dn(PyLdbMessageObject *self, void *closure)
-{
- struct ldb_message *msg = PyLdbMessage_AsMessage(self);
- return PyLdbDn_FromDn(msg->dn);
-}
-
-static int py_ldb_msg_set_dn(PyLdbMessageObject *self, PyObject *value, void *closure)
-{
- struct ldb_message *msg = PyLdbMessage_AsMessage(self);
- if (!PyLdbDn_Check(value)) {
- PyErr_SetNone(PyExc_TypeError);
- return -1;
- }
-
- msg->dn = talloc_reference(msg, PyLdbDn_AsDn(value));
- return 0;
-}
-
-static PyGetSetDef py_ldb_msg_getset[] = {
- { discard_const_p(char, "dn"), (getter)py_ldb_msg_get_dn, (setter)py_ldb_msg_set_dn, NULL },
- { NULL }
-};
-
-static PyObject *py_ldb_msg_repr(PyLdbMessageObject *self)
-{
- PyObject *dict = PyDict_New(), *ret;
- if (PyDict_Update(dict, (PyObject *)self) != 0)
- return NULL;
- ret = PyString_FromFormat("Message(%s)", PyObject_REPR(dict));
- Py_DECREF(dict);
- return ret;
-}
-
-static void py_ldb_msg_dealloc(PyLdbMessageObject *self)
-{
- talloc_free(self->mem_ctx);
- PyObject_Del(self);
-}
-
-static int py_ldb_msg_compare(PyLdbMessageObject *py_msg1,
- PyLdbMessageObject *py_msg2)
-{
- struct ldb_message *msg1 = PyLdbMessage_AsMessage(py_msg1),
- *msg2 = PyLdbMessage_AsMessage(py_msg2);
- unsigned int i;
- int ret;
-
- if ((msg1->dn != NULL) || (msg2->dn != NULL)) {
- ret = ldb_dn_compare(msg1->dn, msg2->dn);
- if (ret != 0) {
- return SIGN(ret);
- }
- }
-
- ret = msg1->num_elements - msg2->num_elements;
- if (ret != 0) {
- return SIGN(ret);
- }
-
- for (i = 0; i < msg1->num_elements; i++) {
- ret = ldb_msg_element_compare_name(&msg1->elements[i],
- &msg2->elements[i]);
- if (ret != 0) {
- return SIGN(ret);
- }
-
- ret = ldb_msg_element_compare(&msg1->elements[i],
- &msg2->elements[i]);
- if (ret != 0) {
- return SIGN(ret);
- }
- }
-
- return 0;
-}
-
-static PyTypeObject PyLdbMessage = {
- .tp_name = "ldb.Message",
- .tp_methods = py_ldb_msg_methods,
- .tp_getset = py_ldb_msg_getset,
- .tp_as_mapping = &py_ldb_msg_mapping,
- .tp_basicsize = sizeof(PyLdbMessageObject),
- .tp_dealloc = (destructor)py_ldb_msg_dealloc,
- .tp_new = py_ldb_msg_new,
- .tp_repr = (reprfunc)py_ldb_msg_repr,
- .tp_flags = Py_TPFLAGS_DEFAULT,
- .tp_iter = (getiterfunc)py_ldb_msg_iter,
- .tp_compare = (cmpfunc)py_ldb_msg_compare,
-};
-
-static PyObject *PyLdbTree_FromTree(struct ldb_parse_tree *tree)
-{
- PyLdbTreeObject *ret;
-
- ret = (PyLdbTreeObject *)PyLdbTree.tp_alloc(&PyLdbTree, 0);
- if (ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- ret->mem_ctx = talloc_new(NULL);
- ret->tree = talloc_reference(ret->mem_ctx, tree);
- return (PyObject *)ret;
-}
-
-static void py_ldb_tree_dealloc(PyLdbTreeObject *self)
-{
- talloc_free(self->mem_ctx);
- PyObject_Del(self);
-}
-
-static PyTypeObject PyLdbTree = {
- .tp_name = "ldb.Tree",
- .tp_basicsize = sizeof(PyLdbTreeObject),
- .tp_dealloc = (destructor)py_ldb_tree_dealloc,
- .tp_flags = Py_TPFLAGS_DEFAULT,
-};
-
-/* Ldb_module */
-static int py_module_search(struct ldb_module *mod, struct ldb_request *req)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result, *py_base, *py_attrs, *py_tree;
-
- py_base = PyLdbDn_FromDn(req->op.search.base);
-
- if (py_base == NULL)
- return LDB_ERR_OPERATIONS_ERROR;
-
- py_tree = PyLdbTree_FromTree(req->op.search.tree);
-
- if (py_tree == NULL)
- return LDB_ERR_OPERATIONS_ERROR;
-
- if (req->op.search.attrs == NULL) {
- py_attrs = Py_None;
- } else {
- int i, len;
- for (len = 0; req->op.search.attrs[len]; len++);
- py_attrs = PyList_New(len);
- for (i = 0; i < len; i++)
- PyList_SetItem(py_attrs, i, PyString_FromString(req->op.search.attrs[i]));
- }
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "search"),
- discard_const_p(char, "OiOO"),
- py_base, req->op.search.scope, py_tree, py_attrs);
-
- Py_DECREF(py_attrs);
- Py_DECREF(py_tree);
- Py_DECREF(py_base);
-
- if (py_result == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- req->op.search.res = PyLdbResult_AsResult(NULL, py_result);
- if (req->op.search.res == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- Py_DECREF(py_result);
-
- return LDB_SUCCESS;
-}
-
-static int py_module_add(struct ldb_module *mod, struct ldb_request *req)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result, *py_msg;
-
- py_msg = PyLdbMessage_FromMessage(discard_const_p(struct ldb_message, req->op.add.message));
-
- if (py_msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "add"),
- discard_const_p(char, "O"),
- py_msg);
-
- Py_DECREF(py_msg);
-
- if (py_result == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- Py_DECREF(py_result);
-
- return LDB_SUCCESS;
-}
-
-static int py_module_modify(struct ldb_module *mod, struct ldb_request *req)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result, *py_msg;
-
- py_msg = PyLdbMessage_FromMessage(discard_const_p(struct ldb_message, req->op.mod.message));
-
- if (py_msg == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "modify"),
- discard_const_p(char, "O"),
- py_msg);
-
- Py_DECREF(py_msg);
-
- if (py_result == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- Py_DECREF(py_result);
-
- return LDB_SUCCESS;
-}
-
-static int py_module_del(struct ldb_module *mod, struct ldb_request *req)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result, *py_dn;
-
- py_dn = PyLdbDn_FromDn(req->op.del.dn);
-
- if (py_dn == NULL)
- return LDB_ERR_OPERATIONS_ERROR;
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "delete"),
- discard_const_p(char, "O"),
- py_dn);
-
- if (py_result == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- Py_DECREF(py_result);
-
- return LDB_SUCCESS;
-}
-
-static int py_module_rename(struct ldb_module *mod, struct ldb_request *req)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result, *py_olddn, *py_newdn;
-
- py_olddn = PyLdbDn_FromDn(req->op.rename.olddn);
-
- if (py_olddn == NULL)
- return LDB_ERR_OPERATIONS_ERROR;
-
- py_newdn = PyLdbDn_FromDn(req->op.rename.newdn);
-
- if (py_newdn == NULL)
- return LDB_ERR_OPERATIONS_ERROR;
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "rename"),
- discard_const_p(char, "OO"),
- py_olddn, py_newdn);
-
- Py_DECREF(py_olddn);
- Py_DECREF(py_newdn);
-
- if (py_result == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- Py_DECREF(py_result);
-
- return LDB_SUCCESS;
-}
-
-static int py_module_request(struct ldb_module *mod, struct ldb_request *req)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result;
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "request"),
- discard_const_p(char, ""));
-
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-static int py_module_extended(struct ldb_module *mod, struct ldb_request *req)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result;
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "extended"),
- discard_const_p(char, ""));
-
- return LDB_ERR_OPERATIONS_ERROR;
-}
-
-static int py_module_start_transaction(struct ldb_module *mod)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result;
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "start_transaction"),
- discard_const_p(char, ""));
-
- if (py_result == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- Py_DECREF(py_result);
-
- return LDB_SUCCESS;
-}
-
-static int py_module_end_transaction(struct ldb_module *mod)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result;
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "end_transaction"),
- discard_const_p(char, ""));
-
- if (py_result == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- Py_DECREF(py_result);
-
- return LDB_SUCCESS;
-}
-
-static int py_module_del_transaction(struct ldb_module *mod)
-{
- PyObject *py_ldb = (PyObject *)mod->private_data;
- PyObject *py_result;
-
- py_result = PyObject_CallMethod(py_ldb, discard_const_p(char, "del_transaction"),
- discard_const_p(char, ""));
-
- if (py_result == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- Py_DECREF(py_result);
-
- return LDB_SUCCESS;
-}
-
-static int py_module_destructor(struct ldb_module *mod)
-{
- Py_DECREF((PyObject *)mod->private_data);
- return 0;
-}
-
-static int py_module_init(struct ldb_module *mod)
-{
- PyObject *py_class = (PyObject *)mod->ops->private_data;
- PyObject *py_result, *py_next, *py_ldb;
-
- py_ldb = PyLdb_FromLdbContext(mod->ldb);
-
- if (py_ldb == NULL)
- return LDB_ERR_OPERATIONS_ERROR;
-
- py_next = PyLdbModule_FromModule(mod->next);
-
- if (py_next == NULL)
- return LDB_ERR_OPERATIONS_ERROR;
-
- py_result = PyObject_CallFunction(py_class, discard_const_p(char, "OO"),
- py_ldb, py_next);
-
- if (py_result == NULL) {
- return LDB_ERR_PYTHON_EXCEPTION;
- }
-
- mod->private_data = py_result;
-
- talloc_set_destructor(mod, py_module_destructor);
-
- return ldb_next_init(mod);
-}
-
-static PyObject *py_register_module(PyObject *module, PyObject *args)
-{
- int ret;
- struct ldb_module_ops *ops;
- PyObject *input;
-
- if (!PyArg_ParseTuple(args, "O", &input))
- return NULL;
-
- ops = talloc_zero(talloc_autofree_context(), struct ldb_module_ops);
- if (ops == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
-
- ops->name = talloc_strdup(ops, PyString_AsString(PyObject_GetAttrString(input, discard_const_p(char, "name"))));
-
- Py_INCREF(input);
- ops->private_data = input;
- ops->init_context = py_module_init;
- ops->search = py_module_search;
- ops->add = py_module_add;
- ops->modify = py_module_modify;
- ops->del = py_module_del;
- ops->rename = py_module_rename;
- ops->request = py_module_request;
- ops->extended = py_module_extended;
- ops->start_transaction = py_module_start_transaction;
- ops->end_transaction = py_module_end_transaction;
- ops->del_transaction = py_module_del_transaction;
-
- ret = ldb_register_module(ops);
-
- PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, NULL);
-
- Py_RETURN_NONE;
-}
-
-static PyObject *py_timestring(PyObject *module, PyObject *args)
-{
- /* most times "time_t" is a signed integer type with 32 or 64 bit:
- * http://stackoverflow.com/questions/471248/what-is-ultimately-a-time-t-typedef-to */
- long int t_val;
- char *tresult;
- PyObject *ret;
- if (!PyArg_ParseTuple(args, "l", &t_val))
- return NULL;
- tresult = ldb_timestring(NULL, (time_t) t_val);
- ret = PyString_FromString(tresult);
- talloc_free(tresult);
- return ret;
-}
-
-static PyObject *py_string_to_time(PyObject *module, PyObject *args)
-{
- char *str;
- if (!PyArg_ParseTuple(args, "s", &str))
- return NULL;
-
- return PyInt_FromLong(ldb_string_to_time(str));
-}
-
-static PyObject *py_valid_attr_name(PyObject *self, PyObject *args)
-{
- char *name;
- if (!PyArg_ParseTuple(args, "s", &name))
- return NULL;
- return PyBool_FromLong(ldb_valid_attr_name(name));
-}
-
-static PyMethodDef py_ldb_global_methods[] = {
- { "register_module", py_register_module, METH_VARARGS,
- "S.register_module(module) -> None\n"
- "Register a LDB module."},
- { "timestring", py_timestring, METH_VARARGS,
- "S.timestring(int) -> string\n"
- "Generate a LDAP time string from a UNIX timestamp" },
- { "string_to_time", py_string_to_time, METH_VARARGS,
- "S.string_to_time(string) -> int\n"
- "Parse a LDAP time string into a UNIX timestamp." },
- { "valid_attr_name", py_valid_attr_name, METH_VARARGS,
- "S.valid_attr_name(name) -> bool\n"
- "Check whether the supplied name is a valid attribute name." },
- { "open", (PyCFunction)py_ldb_new, METH_VARARGS|METH_KEYWORDS,
- NULL },
- { NULL }
-};
-
-void initldb(void)
-{
- PyObject *m;
-
- if (PyType_Ready(&PyLdbDn) < 0)
- return;
-
- if (PyType_Ready(&PyLdbMessage) < 0)
- return;
-
- if (PyType_Ready(&PyLdbMessageElement) < 0)
- return;
-
- if (PyType_Ready(&PyLdb) < 0)
- return;
-
- if (PyType_Ready(&PyLdbModule) < 0)
- return;
-
- if (PyType_Ready(&PyLdbTree) < 0)
- return;
-
- if (PyType_Ready(&PyLdbResult) < 0)
- return;
-
- if (PyType_Ready(&PyLdbControl) < 0)
- return;
-
- m = Py_InitModule3("ldb", py_ldb_global_methods,
- "An interface to LDB, a LDAP-like API that can either to talk an embedded database (TDB-based) or a standards-compliant LDAP server.");
- if (m == NULL)
- return;
-
- PyModule_AddObject(m, "SEQ_HIGHEST_SEQ", PyInt_FromLong(LDB_SEQ_HIGHEST_SEQ));
- PyModule_AddObject(m, "SEQ_HIGHEST_TIMESTAMP", PyInt_FromLong(LDB_SEQ_HIGHEST_TIMESTAMP));
- PyModule_AddObject(m, "SEQ_NEXT", PyInt_FromLong(LDB_SEQ_NEXT));
- PyModule_AddObject(m, "SCOPE_DEFAULT", PyInt_FromLong(LDB_SCOPE_DEFAULT));
- PyModule_AddObject(m, "SCOPE_BASE", PyInt_FromLong(LDB_SCOPE_BASE));
- PyModule_AddObject(m, "SCOPE_ONELEVEL", PyInt_FromLong(LDB_SCOPE_ONELEVEL));
- PyModule_AddObject(m, "SCOPE_SUBTREE", PyInt_FromLong(LDB_SCOPE_SUBTREE));
-
- PyModule_AddObject(m, "CHANGETYPE_NONE", PyInt_FromLong(LDB_CHANGETYPE_NONE));
- PyModule_AddObject(m, "CHANGETYPE_ADD", PyInt_FromLong(LDB_CHANGETYPE_ADD));
- PyModule_AddObject(m, "CHANGETYPE_DELETE", PyInt_FromLong(LDB_CHANGETYPE_DELETE));
- PyModule_AddObject(m, "CHANGETYPE_MODIFY", PyInt_FromLong(LDB_CHANGETYPE_MODIFY));
-
- PyModule_AddObject(m, "FLAG_MOD_ADD", PyInt_FromLong(LDB_FLAG_MOD_ADD));
- PyModule_AddObject(m, "FLAG_MOD_REPLACE", PyInt_FromLong(LDB_FLAG_MOD_REPLACE));
- PyModule_AddObject(m, "FLAG_MOD_DELETE", PyInt_FromLong(LDB_FLAG_MOD_DELETE));
-
- PyModule_AddObject(m, "SUCCESS", PyInt_FromLong(LDB_SUCCESS));
- PyModule_AddObject(m, "ERR_OPERATIONS_ERROR", PyInt_FromLong(LDB_ERR_OPERATIONS_ERROR));
- PyModule_AddObject(m, "ERR_PROTOCOL_ERROR", PyInt_FromLong(LDB_ERR_PROTOCOL_ERROR));
- PyModule_AddObject(m, "ERR_TIME_LIMIT_EXCEEDED", PyInt_FromLong(LDB_ERR_TIME_LIMIT_EXCEEDED));
- PyModule_AddObject(m, "ERR_SIZE_LIMIT_EXCEEDED", PyInt_FromLong(LDB_ERR_SIZE_LIMIT_EXCEEDED));
- PyModule_AddObject(m, "ERR_COMPARE_FALSE", PyInt_FromLong(LDB_ERR_COMPARE_FALSE));
- PyModule_AddObject(m, "ERR_COMPARE_TRUE", PyInt_FromLong(LDB_ERR_COMPARE_TRUE));
- PyModule_AddObject(m, "ERR_AUTH_METHOD_NOT_SUPPORTED", PyInt_FromLong(LDB_ERR_AUTH_METHOD_NOT_SUPPORTED));
- PyModule_AddObject(m, "ERR_STRONG_AUTH_REQUIRED", PyInt_FromLong(LDB_ERR_STRONG_AUTH_REQUIRED));
- PyModule_AddObject(m, "ERR_REFERRAL", PyInt_FromLong(LDB_ERR_REFERRAL));
- PyModule_AddObject(m, "ERR_ADMIN_LIMIT_EXCEEDED", PyInt_FromLong(LDB_ERR_ADMIN_LIMIT_EXCEEDED));
- PyModule_AddObject(m, "ERR_UNSUPPORTED_CRITICAL_EXTENSION", PyInt_FromLong(LDB_ERR_UNSUPPORTED_CRITICAL_EXTENSION));
- PyModule_AddObject(m, "ERR_CONFIDENTIALITY_REQUIRED", PyInt_FromLong(LDB_ERR_CONFIDENTIALITY_REQUIRED));
- PyModule_AddObject(m, "ERR_SASL_BIND_IN_PROGRESS", PyInt_FromLong(LDB_ERR_SASL_BIND_IN_PROGRESS));
- PyModule_AddObject(m, "ERR_NO_SUCH_ATTRIBUTE", PyInt_FromLong(LDB_ERR_NO_SUCH_ATTRIBUTE));
- PyModule_AddObject(m, "ERR_UNDEFINED_ATTRIBUTE_TYPE", PyInt_FromLong(LDB_ERR_UNDEFINED_ATTRIBUTE_TYPE));
- PyModule_AddObject(m, "ERR_INAPPROPRIATE_MATCHING", PyInt_FromLong(LDB_ERR_INAPPROPRIATE_MATCHING));
- PyModule_AddObject(m, "ERR_CONSTRAINT_VIOLATION", PyInt_FromLong(LDB_ERR_CONSTRAINT_VIOLATION));
- PyModule_AddObject(m, "ERR_ATTRIBUTE_OR_VALUE_EXISTS", PyInt_FromLong(LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS));
- PyModule_AddObject(m, "ERR_INVALID_ATTRIBUTE_SYNTAX", PyInt_FromLong(LDB_ERR_INVALID_ATTRIBUTE_SYNTAX));
- PyModule_AddObject(m, "ERR_NO_SUCH_OBJECT", PyInt_FromLong(LDB_ERR_NO_SUCH_OBJECT));
- PyModule_AddObject(m, "ERR_ALIAS_PROBLEM", PyInt_FromLong(LDB_ERR_ALIAS_PROBLEM));
- PyModule_AddObject(m, "ERR_INVALID_DN_SYNTAX", PyInt_FromLong(LDB_ERR_INVALID_DN_SYNTAX));
- PyModule_AddObject(m, "ERR_ALIAS_DEREFERINCING_PROBLEM", PyInt_FromLong(LDB_ERR_ALIAS_DEREFERENCING_PROBLEM));
- PyModule_AddObject(m, "ERR_INAPPROPRIATE_AUTHENTICATION", PyInt_FromLong(LDB_ERR_INAPPROPRIATE_AUTHENTICATION));
- PyModule_AddObject(m, "ERR_INVALID_CREDENTIALS", PyInt_FromLong(LDB_ERR_INVALID_CREDENTIALS));
- PyModule_AddObject(m, "ERR_INSUFFICIENT_ACCESS_RIGHTS", PyInt_FromLong(LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS));
- PyModule_AddObject(m, "ERR_BUSY", PyInt_FromLong(LDB_ERR_BUSY));
- PyModule_AddObject(m, "ERR_UNAVAILABLE", PyInt_FromLong(LDB_ERR_UNAVAILABLE));
- PyModule_AddObject(m, "ERR_UNWILLING_TO_PERFORM", PyInt_FromLong(LDB_ERR_UNWILLING_TO_PERFORM));
- PyModule_AddObject(m, "ERR_LOOP_DETECT", PyInt_FromLong(LDB_ERR_LOOP_DETECT));
- PyModule_AddObject(m, "ERR_NAMING_VIOLATION", PyInt_FromLong(LDB_ERR_NAMING_VIOLATION));
- PyModule_AddObject(m, "ERR_OBJECT_CLASS_VIOLATION", PyInt_FromLong(LDB_ERR_OBJECT_CLASS_VIOLATION));
- PyModule_AddObject(m, "ERR_NOT_ALLOWED_ON_NON_LEAF", PyInt_FromLong(LDB_ERR_NOT_ALLOWED_ON_NON_LEAF));
- PyModule_AddObject(m, "ERR_NOT_ALLOWED_ON_RDN", PyInt_FromLong(LDB_ERR_NOT_ALLOWED_ON_RDN));
- PyModule_AddObject(m, "ERR_ENTRY_ALREADY_EXISTS", PyInt_FromLong(LDB_ERR_ENTRY_ALREADY_EXISTS));
- PyModule_AddObject(m, "ERR_OBJECT_CLASS_MODS_PROHIBITED", PyInt_FromLong(LDB_ERR_OBJECT_CLASS_MODS_PROHIBITED));
- PyModule_AddObject(m, "ERR_AFFECTS_MULTIPLE_DSAS", PyInt_FromLong(LDB_ERR_AFFECTS_MULTIPLE_DSAS));
- PyModule_AddObject(m, "ERR_OTHER", PyInt_FromLong(LDB_ERR_OTHER));
-
- PyModule_AddObject(m, "FLG_RDONLY", PyInt_FromLong(LDB_FLG_RDONLY));
- PyModule_AddObject(m, "FLG_NOSYNC", PyInt_FromLong(LDB_FLG_NOSYNC));
- PyModule_AddObject(m, "FLG_RECONNECT", PyInt_FromLong(LDB_FLG_RECONNECT));
- PyModule_AddObject(m, "FLG_NOMMAP", PyInt_FromLong(LDB_FLG_NOMMAP));
-
- PyModule_AddObject(m, "__docformat__", PyString_FromString("restructuredText"));
-
- PyExc_LdbError = PyErr_NewException(discard_const_p(char, "_ldb.LdbError"), NULL, NULL);
- PyModule_AddObject(m, "LdbError", PyExc_LdbError);
-
- Py_INCREF(&PyLdb);
- Py_INCREF(&PyLdbDn);
- Py_INCREF(&PyLdbModule);
- Py_INCREF(&PyLdbMessage);
- Py_INCREF(&PyLdbMessageElement);
- Py_INCREF(&PyLdbTree);
- Py_INCREF(&PyLdbResult);
- Py_INCREF(&PyLdbControl);
-
- PyModule_AddObject(m, "Ldb", (PyObject *)&PyLdb);
- PyModule_AddObject(m, "Dn", (PyObject *)&PyLdbDn);
- PyModule_AddObject(m, "Message", (PyObject *)&PyLdbMessage);
- PyModule_AddObject(m, "MessageElement", (PyObject *)&PyLdbMessageElement);
- PyModule_AddObject(m, "Module", (PyObject *)&PyLdbModule);
- PyModule_AddObject(m, "Tree", (PyObject *)&PyLdbTree);
- PyModule_AddObject(m, "Control", (PyObject *)&PyLdbControl);
-
- PyModule_AddObject(m, "__version__", PyString_FromString(PACKAGE_VERSION));
-
-#define ADD_LDB_STRING(val) PyModule_AddObject(m, #val, PyString_FromString(val))
-
- ADD_LDB_STRING(LDB_SYNTAX_DN);
- ADD_LDB_STRING(LDB_SYNTAX_DN);
- ADD_LDB_STRING(LDB_SYNTAX_DIRECTORY_STRING);
- ADD_LDB_STRING(LDB_SYNTAX_INTEGER);
- ADD_LDB_STRING(LDB_SYNTAX_BOOLEAN);
- ADD_LDB_STRING(LDB_SYNTAX_OCTET_STRING);
- ADD_LDB_STRING(LDB_SYNTAX_UTC_TIME);
-}
diff --git a/source4/lib/ldb/pyldb.h b/source4/lib/ldb/pyldb.h
deleted file mode 100644
index 04d8ff856c..0000000000
--- a/source4/lib/ldb/pyldb.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
-
- Python interface to ldb.
-
- Copyright (C) 2007-2008 Jelmer Vernooij <jelmer@samba.org>
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _PYLDB_H_
-#define _PYLDB_H_
-
-#include <talloc.h>
-
-typedef struct {
- PyObject_HEAD
- TALLOC_CTX *mem_ctx;
- struct ldb_context *ldb_ctx;
-} PyLdbObject;
-
-#define PyLdb_AsLdbContext(pyobj) ((PyLdbObject *)pyobj)->ldb_ctx
-#define PyLdb_Check(ob) PyObject_TypeCheck(ob, &PyLdb)
-
-typedef struct {
- PyObject_HEAD
- TALLOC_CTX *mem_ctx;
- struct ldb_dn *dn;
-} PyLdbDnObject;
-
-PyObject *PyLdbDn_FromDn(struct ldb_dn *);
-bool PyObject_AsDn(TALLOC_CTX *mem_ctx, PyObject *object, struct ldb_context *ldb_ctx, struct ldb_dn **dn);
-#define PyLdbDn_AsDn(pyobj) ((PyLdbDnObject *)pyobj)->dn
-#define PyLdbDn_Check(ob) PyObject_TypeCheck(ob, &PyLdbDn)
-
-typedef struct {
- PyObject_HEAD
- TALLOC_CTX *mem_ctx;
- struct ldb_message *msg;
-} PyLdbMessageObject;
-#define PyLdbMessage_Check(ob) PyObject_TypeCheck(ob, &PyLdbMessage)
-#define PyLdbMessage_AsMessage(pyobj) ((PyLdbMessageObject *)pyobj)->msg
-
-typedef struct {
- PyObject_HEAD
- TALLOC_CTX *mem_ctx;
- struct ldb_module *mod;
-} PyLdbModuleObject;
-#define PyLdbModule_AsModule(pyobj) ((PyLdbModuleObject *)pyobj)->mod
-
-typedef struct {
- PyObject_HEAD
- TALLOC_CTX *mem_ctx;
- struct ldb_message_element *el;
-} PyLdbMessageElementObject;
-#define PyLdbMessageElement_AsMessageElement(pyobj) ((PyLdbMessageElementObject *)pyobj)->el
-#define PyLdbMessageElement_Check(ob) PyObject_TypeCheck(ob, &PyLdbMessageElement)
-
-typedef struct {
- PyObject_HEAD
- TALLOC_CTX *mem_ctx;
- struct ldb_parse_tree *tree;
-} PyLdbTreeObject;
-#define PyLdbTree_AsTree(pyobj) ((PyLdbTreeObject *)pyobj)->tree
-
-typedef struct {
- PyObject_HEAD
- TALLOC_CTX *mem_ctx;
- PyObject *msgs;
- PyObject *referals;
- PyObject *controls;
-} PyLdbResultObject;
-
-typedef struct {
- PyObject_HEAD
- TALLOC_CTX *mem_ctx;
- struct ldb_control *data;
-} PyLdbControlObject;
-
-#define PyErr_LDB_ERROR_IS_ERR_RAISE(err,ret,ldb) \
- if (ret != LDB_SUCCESS) { \
- PyErr_SetLdbError(err, ret, ldb); \
- return NULL; \
- }
-
-/* Picked out of thin air. To do this properly, we should probably have some part of the
- * errors in LDB be allocated to bindings ? */
-#define LDB_ERR_PYTHON_EXCEPTION 142
-
-#endif /* _PYLDB_H_ */
diff --git a/source4/lib/ldb/pyldb_util.c b/source4/lib/ldb/pyldb_util.c
deleted file mode 100644
index 79077416be..0000000000
--- a/source4/lib/ldb/pyldb_util.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
-
- Python interface to ldb - utility functions.
-
- Copyright (C) 2007-2010 Jelmer Vernooij <jelmer@samba.org>
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <Python.h>
-#include "ldb.h"
-#include "pyldb.h"
-
-static PyObject *ldb_module = NULL;
-
-/* There's no Py_ssize_t in 2.4, apparently */
-#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5
-typedef int Py_ssize_t;
-typedef inquiry lenfunc;
-typedef intargfunc ssizeargfunc;
-#endif
-
-#ifndef Py_RETURN_NONE
-#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
-#endif
-
-
-/**
- * Find out PyTypeObject in ldb module for a given typename
- */
-static PyTypeObject * PyLdb_GetPyType(const char *typename)
-{
- PyObject *py_obj = NULL;
-
- if (ldb_module == NULL) {
- ldb_module = PyImport_ImportModule("ldb");
- if (ldb_module == NULL) {
- return NULL;
- }
- }
-
- py_obj = PyObject_GetAttrString(ldb_module, typename);
-
- return (PyTypeObject*)py_obj;
-}
-
-/**
- * Obtain a ldb DN from a Python object.
- *
- * @param mem_ctx Memory context
- * @param object Python object
- * @param ldb_ctx LDB context
- * @return Whether or not the conversion succeeded
- */
-bool PyObject_AsDn(TALLOC_CTX *mem_ctx, PyObject *object,
- struct ldb_context *ldb_ctx, struct ldb_dn **dn)
-{
- struct ldb_dn *odn;
- PyTypeObject *PyLdb_Dn_Type;
-
- if (ldb_ctx != NULL && PyString_Check(object)) {
- odn = ldb_dn_new(mem_ctx, ldb_ctx, PyString_AsString(object));
- *dn = odn;
- return true;
- }
-
- PyLdb_Dn_Type = PyLdb_GetPyType("Dn");
- if (PyLdb_Dn_Type == NULL) {
- return false;
- }
-
- if (PyObject_TypeCheck(object, PyLdb_Dn_Type)) {
- *dn = PyLdbDn_AsDn(object);
- return true;
- }
-
- PyErr_SetString(PyExc_TypeError, "Expected DN");
- return false;
-}
-
-PyObject *PyLdbDn_FromDn(struct ldb_dn *dn)
-{
- PyLdbDnObject *py_ret;
- PyTypeObject *PyLdb_Dn_Type;
-
- if (dn == NULL) {
- Py_RETURN_NONE;
- }
-
- PyLdb_Dn_Type = PyLdb_GetPyType("Dn");
- if (PyLdb_Dn_Type == NULL) {
- return NULL;
- }
-
- py_ret = (PyLdbDnObject *)PyLdb_Dn_Type->tp_alloc(PyLdb_Dn_Type, 0);
- if (py_ret == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- py_ret->mem_ctx = talloc_new(NULL);
- py_ret->dn = talloc_reference(py_ret->mem_ctx, dn);
- return (PyObject *)py_ret;
-}
diff --git a/source4/lib/ldb/tests/init.ldif b/source4/lib/ldb/tests/init.ldif
deleted file mode 100644
index 97b4561e37..0000000000
--- a/source4/lib/ldb/tests/init.ldif
+++ /dev/null
@@ -1,41 +0,0 @@
-dn: o=University of Michigan,c=TEST
-objectclass: organization
-objectclass: domainRelatedObject
-l: Ann Arbor, Michigan
-st: Michigan
-o: University of Michigan
-o: UMICH
-o: UM
-o: U-M
-o: U of M
-description: The University of Michigan at Ann Arbor
-postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481
- 09 $ US
-telephonenumber: +1 313 764-1817
-associateddomain: example.com
-
-# there was an empty "seeAlso" here
-
-dn: ou=People,o=University of Michigan,c=TEST
-objectclass: organizationalUnit
-objectclass: extensibleObject
-ou: People
-uidNumber: 0
-gidNumber: 0
-
-dn: ou=Ldb Test,ou=People,o=University of Michigan,c=TEST
-objectclass: organizationalUnit
-objectclass: extensibleObject
-ou: People
-ou: Ldb Test
-uidNumber: 0
-gidNumber: 0
-
-dn: ou=LdbTspace,ou=People,o=University of Michigan,c=TEST
-objectclass: organizationalUnit
-objectclass: extensibleObject
-ou: People
-ou: LdbTspace
-description: test white space removal in comparisons
-uidNumber: 0
-gidNumber: 0
diff --git a/source4/lib/ldb/tests/init_slapd.sh b/source4/lib/ldb/tests/init_slapd.sh
deleted file mode 100755
index cf06acd08b..0000000000
--- a/source4/lib/ldb/tests/init_slapd.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/sh
-
-if [ -z "$LDBDIR" ]; then
- LDBDIR=`dirname $0`/..
- export LDBDIR
-fi
-
-rm -rf tests/tmp/db
-mkdir -p tests/tmp/db
-
-if [ -f tests/tmp/slapd.pid ]; then
- kill `cat tests/tmp/slapd.pid`
- sleep 1
-fi
-if [ -f tests/tmp/slapd.pid ]; then
- kill -9 `cat tests/tmp/slapd.pid`
- rm -f tests/tmp/slapd.pid
-fi
-
-# we don't consider a slapadd failure as a test suite failure, as it
-# has nothing to do with ldb
-
-MODCONF=tests/tmp/modules.conf
-rm -f $MODCONF
-touch $MODCONF || exit 1
-
-slaptest -u -f $LDBDIR/tests/slapd.conf > /dev/null 2>&1 || {
- echo "enabling sladp modules"
-cat > $MODCONF <<EOF
-modulepath /usr/lib/ldap
-moduleload back_bdb
-EOF
-}
-
-slaptest -u -f $LDBDIR/tests/slapd.conf || {
- echo "slaptest failed - skipping ldap tests"
- exit 0
-}
-
-slapadd -f $LDBDIR/tests/slapd.conf < $LDBDIR/tests/init.ldif || exit 0
-
diff --git a/source4/lib/ldb/tests/kill_slapd.sh b/source4/lib/ldb/tests/kill_slapd.sh
deleted file mode 100755
index 91beb10814..0000000000
--- a/source4/lib/ldb/tests/kill_slapd.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-if [ -z "$LDBDIR" ]; then
- LDBDIR=`dirname $0`/..
- export LDBDIR
-fi
-
-if [ -f tests/tmp/slapd.pid ]; then
- echo "killing slapd process `cat tests/tmp/slapd.pid`"
- kill -9 `cat tests/tmp/slapd.pid`
- rm -f tests/tmp/slapd.pid
-fi
diff --git a/source4/lib/ldb/tests/ldapi_url.sh b/source4/lib/ldb/tests/ldapi_url.sh
deleted file mode 100755
index fef6c35f2b..0000000000
--- a/source4/lib/ldb/tests/ldapi_url.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-# aargh, did LDAP ever have to expose this crap to users ...
-
-BASE=`pwd`
-
-TMPDIR=$BASE/tests/tmp
-
-LDAPI_ESCAPE=`echo $TMPDIR/ldapi | sed 's|/|%2F|g'`
-
-echo "ldapi://$LDAPI_ESCAPE"
diff --git a/source4/lib/ldb/tests/photo.ldif b/source4/lib/ldb/tests/photo.ldif
deleted file mode 100644
index 95ab065672..0000000000
--- a/source4/lib/ldb/tests/photo.ldif
+++ /dev/null
@@ -1,5 +0,0 @@
-dn: cn=Hampster Ursula,ou=Alumni Association,ou=People,o=University of Michigan,c=TEST
-changetype: modify
-add: jpegPhoto
-jpegPhoto:< file://tests/samba4.png
-
diff --git a/source4/lib/ldb/tests/python/api.py b/source4/lib/ldb/tests/python/api.py
deleted file mode 100755
index e7658d51ab..0000000000
--- a/source4/lib/ldb/tests/python/api.py
+++ /dev/null
@@ -1,748 +0,0 @@
-#!/usr/bin/env python
-# Simple tests for the ldb python bindings.
-# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
-
-import os
-import unittest
-
-import ldb
-
-
-def filename():
- import tempfile
- try:
- dir_prefix = os.path.join(os.environ["SELFTEST_PREFIX"], "tmp")
- except KeyError:
- dir_prefix = None
- return tempfile.mktemp(dir=dir_prefix)
-
-class NoContextTests(unittest.TestCase):
-
- def test_valid_attr_name(self):
- self.assertTrue(ldb.valid_attr_name("foo"))
- self.assertFalse(ldb.valid_attr_name("24foo"))
-
- def test_timestring(self):
- self.assertEquals("19700101000000.0Z", ldb.timestring(0))
- self.assertEquals("20071119191012.0Z", ldb.timestring(1195499412))
-
- def test_string_to_time(self):
- self.assertEquals(0, ldb.string_to_time("19700101000000.0Z"))
- self.assertEquals(1195499412, ldb.string_to_time("20071119191012.0Z"))
-
-
-class SimpleLdb(unittest.TestCase):
-
- def test_connect(self):
- ldb.Ldb(filename())
-
- def test_connect_none(self):
- ldb.Ldb()
-
- def test_connect_later(self):
- x = ldb.Ldb()
- x.connect(filename())
-
- def test_repr(self):
- x = ldb.Ldb()
- self.assertTrue(repr(x).startswith("<ldb connection"))
-
- def test_set_create_perms(self):
- x = ldb.Ldb()
- x.set_create_perms(0600)
-
- def test_set_modules_dir(self):
- x = ldb.Ldb()
- x.set_modules_dir("/tmp")
-
- def test_modules_none(self):
- x = ldb.Ldb()
- self.assertEquals([], x.modules())
-
- def test_modules_tdb(self):
- x = ldb.Ldb(filename())
- self.assertEquals("[<ldb module 'tdb'>]", repr(x.modules()))
-
- def test_search(self):
- l = ldb.Ldb(filename())
- self.assertEquals(len(l.search()), 1)
-
- def test_search_controls(self):
- l = ldb.Ldb(filename())
- self.assertEquals(len(l.search(controls=["paged_results:0:5"])), 1)
-
- def test_search_attrs(self):
- l = ldb.Ldb(filename())
- self.assertEquals(len(l.search(ldb.Dn(l, ""), ldb.SCOPE_SUBTREE, "(dc=*)", ["dc"])), 0)
-
- def test_search_string_dn(self):
- l = ldb.Ldb(filename())
- self.assertEquals(len(l.search("", ldb.SCOPE_SUBTREE, "(dc=*)", ["dc"])), 0)
-
- def test_search_attr_string(self):
- l = ldb.Ldb(filename())
- self.assertRaises(TypeError, l.search, attrs="dc")
-
- def test_opaque(self):
- l = ldb.Ldb(filename())
- l.set_opaque("my_opaque", l)
- self.assertTrue(l.get_opaque("my_opaque") is not None)
- self.assertEquals(None, l.get_opaque("unknown"))
-
- def test_search_scope_base(self):
- l = ldb.Ldb(filename())
- self.assertEquals(len(l.search(ldb.Dn(l, "dc=foo1"),
- ldb.SCOPE_ONELEVEL)), 0)
-
- def test_delete(self):
- l = ldb.Ldb(filename())
- self.assertRaises(ldb.LdbError, lambda: l.delete(ldb.Dn(l, "dc=foo2")))
-
- def test_delete_w_unhandled_ctrl(self):
- l = ldb.Ldb(filename())
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=foo1")
- m["b"] = ["a"]
- l.add(m)
- self.assertRaises(ldb.LdbError, lambda: l.delete(m.dn, ["search_options:1:2"]))
- l.delete(m.dn)
-
- def test_contains(self):
- name = filename()
- l = ldb.Ldb(name)
- self.assertFalse(ldb.Dn(l, "dc=foo3") in l)
- l = ldb.Ldb(name)
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=foo3")
- m["b"] = ["a"]
- l.add(m)
- try:
- self.assertTrue(ldb.Dn(l, "dc=foo3") in l)
- finally:
- l.delete(m.dn)
-
- def test_get_config_basedn(self):
- l = ldb.Ldb(filename())
- self.assertEquals(None, l.get_config_basedn())
-
- def test_get_root_basedn(self):
- l = ldb.Ldb(filename())
- self.assertEquals(None, l.get_root_basedn())
-
- def test_get_schema_basedn(self):
- l = ldb.Ldb(filename())
- self.assertEquals(None, l.get_schema_basedn())
-
- def test_get_default_basedn(self):
- l = ldb.Ldb(filename())
- self.assertEquals(None, l.get_default_basedn())
-
- def test_add(self):
- l = ldb.Ldb(filename())
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=foo4")
- m["bla"] = "bla"
- self.assertEquals(len(l.search()), 1)
- l.add(m)
- try:
- self.assertEquals(len(l.search()), 2)
- finally:
- l.delete(ldb.Dn(l, "dc=foo4"))
-
- def test_add_w_unhandled_ctrl(self):
- l = ldb.Ldb(filename())
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=foo4")
- m["bla"] = "bla"
- self.assertEquals(len(l.search()), 1)
- self.assertRaises(ldb.LdbError, lambda: l.add(m,["search_options:1:2"]))
-
- def test_add_dict(self):
- l = ldb.Ldb(filename())
- m = {"dn": ldb.Dn(l, "dc=foo5"),
- "bla": "bla"}
- self.assertEquals(len(l.search()), 1)
- l.add(m)
- try:
- self.assertEquals(len(l.search()), 2)
- finally:
- l.delete(ldb.Dn(l, "dc=foo5"))
-
- def test_add_dict_string_dn(self):
- l = ldb.Ldb(filename())
- m = {"dn": "dc=foo6", "bla": "bla"}
- self.assertEquals(len(l.search()), 1)
- l.add(m)
- try:
- self.assertEquals(len(l.search()), 2)
- finally:
- l.delete(ldb.Dn(l, "dc=foo6"))
-
- def test_rename(self):
- l = ldb.Ldb(filename())
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=foo7")
- m["bla"] = "bla"
- self.assertEquals(len(l.search()), 1)
- l.add(m)
- try:
- l.rename(ldb.Dn(l, "dc=foo7"), ldb.Dn(l, "dc=bar"))
- self.assertEquals(len(l.search()), 2)
- finally:
- l.delete(ldb.Dn(l, "dc=bar"))
-
- def test_rename_string_dns(self):
- l = ldb.Ldb(filename())
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=foo8")
- m["bla"] = "bla"
- self.assertEquals(len(l.search()), 1)
- l.add(m)
- self.assertEquals(len(l.search()), 2)
- try:
- l.rename("dc=foo8", "dc=bar")
- self.assertEquals(len(l.search()), 2)
- finally:
- l.delete(ldb.Dn(l, "dc=bar"))
-
- def test_modify_delete(self):
- l = ldb.Ldb(filename())
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=modifydelete")
- m["bla"] = ["1234"]
- l.add(m)
- rm = l.search(m.dn)[0]
- self.assertEquals(["1234"], list(rm["bla"]))
- try:
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=modifydelete")
- m["bla"] = ldb.MessageElement([], ldb.FLAG_MOD_DELETE, "bla")
- self.assertEquals(ldb.FLAG_MOD_DELETE, m["bla"].flags())
- l.modify(m)
- rm = l.search(m.dn)[0]
- self.assertEquals(1, len(rm))
- rm = l.search(m.dn, attrs=["bla"])
- self.assertEquals(0, len(rm))
- finally:
- l.delete(ldb.Dn(l, "dc=modifydelete"))
-
- def test_modify_add(self):
- l = ldb.Ldb(filename())
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=add")
- m["bla"] = ["1234"]
- l.add(m)
- try:
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=add")
- m["bla"] = ldb.MessageElement(["456"], ldb.FLAG_MOD_ADD, "bla")
- self.assertEquals(ldb.FLAG_MOD_ADD, m["bla"].flags())
- l.modify(m)
- rm = l.search(m.dn)[0]
- self.assertEquals(2, len(rm))
- self.assertEquals(["1234", "456"], list(rm["bla"]))
- finally:
- l.delete(ldb.Dn(l, "dc=add"))
-
- def test_modify_replace(self):
- l = ldb.Ldb(filename())
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=modify2")
- m["bla"] = ["1234", "456"]
- l.add(m)
- try:
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=modify2")
- m["bla"] = ldb.MessageElement(["789"], ldb.FLAG_MOD_REPLACE, "bla")
- self.assertEquals(ldb.FLAG_MOD_REPLACE, m["bla"].flags())
- l.modify(m)
- rm = l.search(m.dn)[0]
- self.assertEquals(2, len(rm))
- self.assertEquals(["789"], list(rm["bla"]))
- rm = l.search(m.dn, attrs=["bla"])[0]
- self.assertEquals(1, len(rm))
- finally:
- l.delete(ldb.Dn(l, "dc=modify2"))
-
- def test_modify_flags_change(self):
- l = ldb.Ldb(filename())
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=add")
- m["bla"] = ["1234"]
- l.add(m)
- try:
- m = ldb.Message()
- m.dn = ldb.Dn(l, "dc=add")
- m["bla"] = ldb.MessageElement(["456"], ldb.FLAG_MOD_ADD, "bla")
- self.assertEquals(ldb.FLAG_MOD_ADD, m["bla"].flags())
- l.modify(m)
- rm = l.search(m.dn)[0]
- self.assertEquals(2, len(rm))
- self.assertEquals(["1234", "456"], list(rm["bla"]))
-
- # Now create another modify, but switch the flags before we do it
- m["bla"] = ldb.MessageElement(["456"], ldb.FLAG_MOD_ADD, "bla")
- m["bla"].set_flags(ldb.FLAG_MOD_DELETE)
- l.modify(m)
- rm = l.search(m.dn, attrs=["bla"])[0]
- self.assertEquals(1, len(rm))
- self.assertEquals(["1234"], list(rm["bla"]))
- finally:
- l.delete(ldb.Dn(l, "dc=add"))
-
- def test_transaction_commit(self):
- l = ldb.Ldb(filename())
- l.transaction_start()
- m = ldb.Message(ldb.Dn(l, "dc=foo9"))
- m["foo"] = ["bar"]
- l.add(m)
- l.transaction_commit()
- l.delete(m.dn)
-
- def test_transaction_cancel(self):
- l = ldb.Ldb(filename())
- l.transaction_start()
- m = ldb.Message(ldb.Dn(l, "dc=foo10"))
- m["foo"] = ["bar"]
- l.add(m)
- l.transaction_cancel()
- self.assertEquals(0, len(l.search(ldb.Dn(l, "dc=foo10"))))
-
- def test_set_debug(self):
- def my_report_fn(level, text):
- pass
- l = ldb.Ldb(filename())
- l.set_debug(my_report_fn)
-
- def test_zero_byte_string(self):
- """Testing we do not get trapped in the \0 byte in a property string."""
- l = ldb.Ldb(filename())
- l.add({
- "dn" : "dc=somedn",
- "objectclass" : "user",
- "cN" : "LDAPtestUSER",
- "givenname" : "ldap",
- "displayname" : "foo\0bar",
- })
- res = l.search(expression="(dn=dc=somedn)")
- self.assertEquals("foo\0bar", res[0]["displayname"][0])
-
- def test_no_crash_broken_expr(self):
- l = ldb.Ldb(filename())
- self.assertRaises(ldb.LdbError,lambda: l.search("", ldb.SCOPE_SUBTREE, "&(dc=*)(dn=*)", ["dc"]))
-
-
-class DnTests(unittest.TestCase):
-
- def setUp(self):
- self.ldb = ldb.Ldb(filename())
-
- def test_set_dn_invalid(self):
- x = ldb.Message()
- def assign():
- x.dn = "astring"
- self.assertRaises(TypeError, assign)
-
- def test_eq(self):
- x = ldb.Dn(self.ldb, "dc=foo11,bar=bloe")
- y = ldb.Dn(self.ldb, "dc=foo11,bar=bloe")
- self.assertEquals(x, y)
- y = ldb.Dn(self.ldb, "dc=foo11,bar=blie")
- self.assertNotEquals(x, y)
-
- def test_str(self):
- x = ldb.Dn(self.ldb, "dc=foo12,bar=bloe")
- self.assertEquals(x.__str__(), "dc=foo12,bar=bloe")
-
- def test_repr(self):
- x = ldb.Dn(self.ldb, "dc=foo13,bla=blie")
- self.assertEquals(x.__repr__(), "Dn('dc=foo13,bla=blie')")
-
- def test_get_casefold(self):
- x = ldb.Dn(self.ldb, "dc=foo14,bar=bloe")
- self.assertEquals(x.get_casefold(), "DC=FOO14,BAR=bloe")
-
- def test_validate(self):
- x = ldb.Dn(self.ldb, "dc=foo15,bar=bloe")
- self.assertTrue(x.validate())
-
- def test_parent(self):
- x = ldb.Dn(self.ldb, "dc=foo16,bar=bloe")
- self.assertEquals("bar=bloe", x.parent().__str__())
-
- def test_parent_nonexistant(self):
- x = ldb.Dn(self.ldb, "@BLA")
- self.assertEquals(None, x.parent())
-
- def test_is_valid(self):
- x = ldb.Dn(self.ldb, "dc=foo18,dc=bloe")
- self.assertTrue(x.is_valid())
- x = ldb.Dn(self.ldb, "")
- self.assertTrue(x.is_valid())
-
- def test_is_special(self):
- x = ldb.Dn(self.ldb, "dc=foo19,bar=bloe")
- self.assertFalse(x.is_special())
- x = ldb.Dn(self.ldb, "@FOOBAR")
- self.assertTrue(x.is_special())
-
- def test_check_special(self):
- x = ldb.Dn(self.ldb, "dc=foo20,bar=bloe")
- self.assertFalse(x.check_special("FOOBAR"))
- x = ldb.Dn(self.ldb, "@FOOBAR")
- self.assertTrue(x.check_special("@FOOBAR"))
-
- def test_len(self):
- x = ldb.Dn(self.ldb, "dc=foo21,bar=bloe")
- self.assertEquals(2, len(x))
- x = ldb.Dn(self.ldb, "dc=foo21")
- self.assertEquals(1, len(x))
-
- def test_add_child(self):
- x = ldb.Dn(self.ldb, "dc=foo22,bar=bloe")
- self.assertTrue(x.add_child(ldb.Dn(self.ldb, "bla=bloe")))
- self.assertEquals("bla=bloe,dc=foo22,bar=bloe", x.__str__())
-
- def test_add_base(self):
- x = ldb.Dn(self.ldb, "dc=foo23,bar=bloe")
- base = ldb.Dn(self.ldb, "bla=bloe")
- self.assertTrue(x.add_base(base))
- self.assertEquals("dc=foo23,bar=bloe,bla=bloe", x.__str__())
-
- def test_add(self):
- x = ldb.Dn(self.ldb, "dc=foo24")
- y = ldb.Dn(self.ldb, "bar=bla")
- self.assertEquals("dc=foo24,bar=bla", str(y + x))
-
- def test_parse_ldif(self):
- msgs = self.ldb.parse_ldif("dn: foo=bar\n")
- msg = msgs.next()
- self.assertEquals("foo=bar", str(msg[1].dn))
- self.assertTrue(isinstance(msg[1], ldb.Message))
- ldif = self.ldb.write_ldif(msg[1], ldb.CHANGETYPE_NONE)
- self.assertEquals("dn: foo=bar\n\n", ldif)
-
- def test_parse_ldif_more(self):
- msgs = self.ldb.parse_ldif("dn: foo=bar\n\n\ndn: bar=bar")
- msg = msgs.next()
- self.assertEquals("foo=bar", str(msg[1].dn))
- msg = msgs.next()
- self.assertEquals("bar=bar", str(msg[1].dn))
-
- def test_canonical_string(self):
- x = ldb.Dn(self.ldb, "dc=foo25,bar=bloe")
- self.assertEquals("/bloe/foo25", x.canonical_str())
-
- def test_canonical_ex_string(self):
- x = ldb.Dn(self.ldb, "dc=foo26,bar=bloe")
- self.assertEquals("/bloe\nfoo26", x.canonical_ex_str())
-
-
-class LdbMsgTests(unittest.TestCase):
-
- def setUp(self):
- self.msg = ldb.Message()
-
- def test_init_dn(self):
- self.msg = ldb.Message(ldb.Dn(ldb.Ldb(), "dc=foo27"))
- self.assertEquals("dc=foo27", str(self.msg.dn))
-
- def test_iter_items(self):
- self.assertEquals(0, len(self.msg.items()))
- self.msg.dn = ldb.Dn(ldb.Ldb(filename()), "dc=foo28")
- self.assertEquals(1, len(self.msg.items()))
-
- def test_repr(self):
- self.msg.dn = ldb.Dn(ldb.Ldb(filename()), "dc=foo29")
- self.msg["dc"] = "foo"
- self.assertEquals("Message({'dn': Dn('dc=foo29'), 'dc': MessageElement(['foo'])})", repr(self.msg))
-
- def test_len(self):
- self.assertEquals(0, len(self.msg))
-
- def test_notpresent(self):
- self.assertRaises(KeyError, lambda: self.msg["foo"])
-
- def test_del(self):
- del self.msg["foo"]
-
- def test_add(self):
- self.msg.add(ldb.MessageElement(["456"], ldb.FLAG_MOD_ADD, "bla"))
-
- def test_elements_empty(self):
- self.assertEquals([], self.msg.elements())
-
- def test_elements(self):
- el = ldb.MessageElement(["456"], ldb.FLAG_MOD_ADD, "bla")
- self.msg.add(el)
- self.assertEquals([el], self.msg.elements())
-
- def test_add_value(self):
- self.assertEquals(0, len(self.msg))
- self.msg["foo"] = ["foo"]
- self.assertEquals(1, len(self.msg))
-
- def test_add_value_multiple(self):
- self.assertEquals(0, len(self.msg))
- self.msg["foo"] = ["foo", "bla"]
- self.assertEquals(1, len(self.msg))
- self.assertEquals(["foo", "bla"], list(self.msg["foo"]))
-
- def test_set_value(self):
- self.msg["foo"] = ["fool"]
- self.assertEquals(["fool"], list(self.msg["foo"]))
- self.msg["foo"] = ["bar"]
- self.assertEquals(["bar"], list(self.msg["foo"]))
-
- def test_keys(self):
- self.msg.dn = ldb.Dn(ldb.Ldb(filename()), "@BASEINFO")
- self.msg["foo"] = ["bla"]
- self.msg["bar"] = ["bla"]
- self.assertEquals(["dn", "foo", "bar"], self.msg.keys())
-
- def test_dn(self):
- self.msg.dn = ldb.Dn(ldb.Ldb(filename()), "@BASEINFO")
- self.assertEquals("@BASEINFO", self.msg.dn.__str__())
-
- def test_get_dn(self):
- self.msg.dn = ldb.Dn(ldb.Ldb(filename()), "@BASEINFO")
- self.assertEquals("@BASEINFO", self.msg.get("dn").__str__())
-
- def test_get_invalid(self):
- self.msg.dn = ldb.Dn(ldb.Ldb(filename()), "@BASEINFO")
- self.assertRaises(TypeError, self.msg.get, 42)
-
- def test_get_other(self):
- self.msg["foo"] = ["bar"]
- self.assertEquals("bar", self.msg.get("foo")[0])
-
- def test_get_default(self):
- self.assertEquals(None, self.msg.get("tatayoyo"))
-
- self.assertEquals("anniecordie", self.msg.get("tatayoyo", "anniecordie"))
-
- def test_get_unknown(self):
- self.assertEquals(None, self.msg.get("lalalala"))
-
- def test_msg_diff(self):
- l = ldb.Ldb()
- msgs = l.parse_ldif("dn: foo=bar\nfoo: bar\nbaz: do\n\ndn: foo=bar\nfoo: bar\nbaz: dont\n")
- msg1 = msgs.next()[1]
- msg2 = msgs.next()[1]
- msgdiff = l.msg_diff(msg1, msg2)
- self.assertEquals("foo=bar", msgdiff.get("dn").__str__())
- self.assertRaises(KeyError, lambda: msgdiff["foo"])
- self.assertEquals(1, len(msgdiff))
-
- def test_equal_empty(self):
- msg1 = ldb.Message()
- msg2 = ldb.Message()
- self.assertEquals(msg1, msg2)
-
- def test_equal_simplel(self):
- db = ldb.Ldb(filename())
- msg1 = ldb.Message()
- msg1.dn = ldb.Dn(db, "foo=bar")
- msg2 = ldb.Message()
- msg2.dn = ldb.Dn(db, "foo=bar")
- self.assertEquals(msg1, msg2)
- msg1['foo'] = 'bar'
- msg2['foo'] = 'bar'
- self.assertEquals(msg1, msg2)
- msg2['foo'] = 'blie'
- self.assertNotEquals(msg1, msg2)
- msg2['foo'] = 'blie'
-
- def test_from_dict(self):
- rec = {"dn": "dc=fromdict",
- "a1": ["a1-val1", "a1-val1"]}
- l = ldb.Ldb()
- # check different types of input Flags
- for flags in [ldb.FLAG_MOD_ADD, ldb.FLAG_MOD_REPLACE, ldb.FLAG_MOD_DELETE]:
- m = ldb.Message.from_dict(l, rec, flags)
- self.assertEquals(rec["a1"], list(m["a1"]))
- self.assertEquals(flags, m["a1"].flags())
- # check input params
- self.assertRaises(TypeError, ldb.Message.from_dict, dict(), rec, ldb.FLAG_MOD_REPLACE)
- self.assertRaises(TypeError, ldb.Message.from_dict, l, list(), ldb.FLAG_MOD_REPLACE)
- self.assertRaises(ValueError, ldb.Message.from_dict, l, rec, 0)
- # Message.from_dict expects dictionary with 'dn'
- err_rec = {"a1": ["a1-val1", "a1-val1"]}
- self.assertRaises(TypeError, ldb.Message.from_dict, l, err_rec, ldb.FLAG_MOD_REPLACE)
-
-
-
-class MessageElementTests(unittest.TestCase):
-
- def test_cmp_element(self):
- x = ldb.MessageElement(["foo"])
- y = ldb.MessageElement(["foo"])
- z = ldb.MessageElement(["bzr"])
- self.assertEquals(x, y)
- self.assertNotEquals(x, z)
-
- def test_create_iterable(self):
- x = ldb.MessageElement(["foo"])
- self.assertEquals(["foo"], list(x))
-
- def test_repr(self):
- x = ldb.MessageElement(["foo"])
- self.assertEquals("MessageElement(['foo'])", repr(x))
- x = ldb.MessageElement(["foo", "bla"])
- self.assertEquals(2, len(x))
- self.assertEquals("MessageElement(['foo','bla'])", repr(x))
-
- def test_get_item(self):
- x = ldb.MessageElement(["foo", "bar"])
- self.assertEquals("foo", x[0])
- self.assertEquals("bar", x[1])
- self.assertEquals("bar", x[-1])
- self.assertRaises(IndexError, lambda: x[45])
-
- def test_len(self):
- x = ldb.MessageElement(["foo", "bar"])
- self.assertEquals(2, len(x))
-
- def test_eq(self):
- x = ldb.MessageElement(["foo", "bar"])
- y = ldb.MessageElement(["foo", "bar"])
- self.assertEquals(y, x)
- x = ldb.MessageElement(["foo"])
- self.assertNotEquals(y, x)
- y = ldb.MessageElement(["foo"])
- self.assertEquals(y, x)
-
- def test_extended(self):
- el = ldb.MessageElement(["456"], ldb.FLAG_MOD_ADD, "bla")
- self.assertEquals("MessageElement(['456'])", repr(el))
-
-
-class ModuleTests(unittest.TestCase):
-
- def test_register_module(self):
- class ExampleModule:
- name = "example"
- ldb.register_module(ExampleModule)
-
- def test_use_module(self):
- ops = []
- class ExampleModule:
- name = "bla"
-
- def __init__(self, ldb, next):
- ops.append("init")
- self.next = next
-
- def search(self, *args, **kwargs):
- return self.next.search(*args, **kwargs)
-
- def request(self, *args, **kwargs):
- pass
-
- name = filename()
- ldb.register_module(ExampleModule)
- if os.path.exists(name):
- os.unlink(name)
- l = ldb.Ldb(name)
- l.add({"dn": "@MODULES", "@LIST": "bla"})
- self.assertEquals([], ops)
- l = ldb.Ldb(name)
- self.assertEquals(["init"], ops)
-
-class LdbResultTests(unittest.TestCase):
-
- def setUp(self):
- name = filename()
- self.name = name
- if os.path.exists(name):
- os.unlink(name)
- self.l = ldb.Ldb(name)
- self.l.add({"dn": "DC=SAMBA,DC=ORG", "name": "samba.org"})
- self.l.add({"dn": "OU=ADMIN,DC=SAMBA,DC=ORG", "name": "Admins"})
- self.l.add({"dn": "OU=USERS,DC=SAMBA,DC=ORG", "name": "Users"})
- self.l.add({"dn": "OU=OU1,DC=SAMBA,DC=ORG", "name": "OU #1"})
- self.l.add({"dn": "OU=OU2,DC=SAMBA,DC=ORG", "name": "OU #2"})
- self.l.add({"dn": "OU=OU3,DC=SAMBA,DC=ORG", "name": "OU #3"})
- self.l.add({"dn": "OU=OU4,DC=SAMBA,DC=ORG", "name": "OU #4"})
- self.l.add({"dn": "OU=OU5,DC=SAMBA,DC=ORG", "name": "OU #5"})
- self.l.add({"dn": "OU=OU6,DC=SAMBA,DC=ORG", "name": "OU #6"})
- self.l.add({"dn": "OU=OU7,DC=SAMBA,DC=ORG", "name": "OU #7"})
- self.l.add({"dn": "OU=OU8,DC=SAMBA,DC=ORG", "name": "OU #8"})
- self.l.add({"dn": "OU=OU9,DC=SAMBA,DC=ORG", "name": "OU #9"})
- self.l.add({"dn": "OU=OU10,DC=SAMBA,DC=ORG", "name": "OU #10"})
-
- def tearDown(self):
- if os.path.exists(self.name):
- os.unlink(self.name)
-
- def test_return_type(self):
- res = self.l.search()
- self.assertEquals(str(res), "<ldb result>")
-
- def test_get_msgs(self):
- res = self.l.search()
- list = res.msgs
-
- def test_get_controls(self):
- res = self.l.search()
- list = res.controls
-
- def test_get_referals(self):
- res = self.l.search()
- list = res.referals
-
- def test_iter_msgs(self):
- found = False
- for l in self.l.search().msgs:
- if str(l.dn) == "OU=OU10,DC=SAMBA,DC=ORG":
- found = True
- self.assertTrue(found)
-
- def test_iter_msgs_count(self):
- self.assertTrue(self.l.search().count > 0)
- # 13 objects has been added to the DC=SAMBA, DC=ORG
- self.assertEqual(self.l.search(base="DC=SAMBA,DC=ORG").count, 13)
-
- def test_iter_controls(self):
- res = self.l.search().controls
- it = iter(res)
-
- def test_create_control(self):
- self.assertRaises(ValueError, ldb.Control, self.l, "tatayoyo:0")
- c = ldb.Control(self.l, "relax:1")
- self.assertEquals(c.critical, True)
- self.assertEquals(c.oid, "1.3.6.1.4.1.4203.666.5.12")
-
- def test_iter_refs(self):
- res = self.l.search().referals
- it = iter(res)
-
- def test_iter_as_sequence_msgs(self):
- found = False
- res = self.l.search().msgs
-
- for i in range(0, len(res)):
- l = res[i]
- if str(l.dn) == "OU=OU10,DC=SAMBA,DC=ORG":
- found = True
- self.assertTrue(found)
-
- def test_iter_as_sequence(self):
- found = False
- res = self.l.search()
-
- for i in range(0, len(res)):
- l = res[i]
- if str(l.dn) == "OU=OU10,DC=SAMBA,DC=ORG":
- found = True
- self.assertTrue(found)
-
-class VersionTests(unittest.TestCase):
-
- def test_version(self):
- self.assertTrue(isinstance(ldb.__version__, str))
-
-
-if __name__ == '__main__':
- import unittest
- unittest.TestProgram()
diff --git a/source4/lib/ldb/tests/samba4.png b/source4/lib/ldb/tests/samba4.png
deleted file mode 100644
index c8096889a6..0000000000
--- a/source4/lib/ldb/tests/samba4.png
+++ /dev/null
Binary files differ
diff --git a/source4/lib/ldb/tests/sample_module.c b/source4/lib/ldb/tests/sample_module.c
deleted file mode 100644
index bee40a5e80..0000000000
--- a/source4/lib/ldb/tests/sample_module.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
- Samba utility functions
- Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb_module.h"
-
-static int sample_add(struct ldb_module *mod, struct ldb_request *req)
-{
- struct ldb_control *control;
-
- ldb_msg_add_fmt(req->op.add.message, "touchedBy", "sample");
-
- /* check if there's a relax control */
- control = ldb_request_get_control(req, LDB_CONTROL_RELAX_OID);
- if (control == NULL) {
- /* not found go on */
- return ldb_next_request(mod, req);
- } else {
- return LDB_ERR_UNWILLING_TO_PERFORM;
- }
-}
-
-static int sample_modify(struct ldb_module *mod, struct ldb_request *req)
-{
- struct ldb_control *control;
-
- /* check if there's a relax control */
- control = ldb_request_get_control(req, LDB_CONTROL_RELAX_OID);
- if (control == NULL) {
- /* not found go on */
- return ldb_next_request(mod, req);
- } else {
- return LDB_ERR_UNWILLING_TO_PERFORM;
- }
-}
-
-
-static struct ldb_module_ops ldb_sample_module_ops = {
- .name = "sample",
- .add = sample_add,
- .del = sample_modify,
- .modify = sample_modify,
-};
-
-int ldb_sample_init(const char *version)
-{
- LDB_MODULE_CHECK_VERSION(version);
- return ldb_register_module(&ldb_sample_module_ops);
-}
diff --git a/source4/lib/ldb/tests/schema-tests/schema-add-test.ldif b/source4/lib/ldb/tests/schema-tests/schema-add-test.ldif
deleted file mode 100644
index 472ab48fac..0000000000
--- a/source4/lib/ldb/tests/schema-tests/schema-add-test.ldif
+++ /dev/null
@@ -1,66 +0,0 @@
-dn: CN=Users,DC=schema,DC=test
-objectClass: top
-objectClass: container
-cn: Users
-description: Default container for upgraded user accounts
-instanceType: 4
-whenCreated: 20050116175504.0Z
-whenChanged: 20050116175504.0Z
-uSNCreated: 1
-uSNChanged: 1
-showInAdvancedViewOnly: FALSE
-name: Users
-objectGUID: b847056a-9934-d87b-8a1a-99fabe0863c8
-systemFlags: 0x8c000000
-objectCategory: CN=Container,CN=Schema,CN=Configuration,DC=schema,DC=test
-isCriticalSystemObject: TRUE
-nTSecurityDescriptor: foo
-
-dn: CN=Administrator,CN=Users,DC=schema,DC=test
-objectClass: top
-objectClass: person
-objectClass: organizationalPerson
-objectClass: user
-cn: Administrator
-description: Built-in account for administering the computer/domain
-instanceType: 4
-whenCreated: 20050116175504.0Z
-whenChanged: 20050116175504.0Z
-uSNCreated: 1
-memberOf: CN=Group Policy Creator Owners,CN=Users,DC=schema,DC=test
-memberOf: CN=Domain Admins,CN=Users,DC=schema,DC=test
-memberOf: CN=Enterprise Admins,CN=Users,DC=schema,DC=test
-memberOf: CN=Schema Admins,CN=Users,DC=schema,DC=test
-memberOf: CN=Administrators,CN=Builtin,DC=schema,DC=test
-uSNChanged: 1
-name: Administrator
-objectGUID: 6c02f98c-46c6-aa38-5f13-a510cac04e6c
-userAccountControl: 0x10200
-badPwdCount: 0
-codePage: 0
-countryCode: 0
-badPasswordTime: 0
-lastLogoff: 0
-lastLogon: 0
-pwdLastSet: 0
-primaryGroupID: 513
-objectSid: S-1-5-21-43662522-77495566-38969261-500
-adminCount: 1
-accountExpires: 9223372036854775807
-logonCount: 0
-sAMAccountName: Administrator
-sAMAccountType: 0x30000000
-objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=schema,DC=test
-isCriticalSystemObject: TRUE
-unicodePwd: samba
-nTSecurityDescriptor: foo
-
-dn: CN=Test,CN=Users,DC=schema,DC=test
-objectClass: top
-objectClass: test
-cn: Test
-description: This is a test
-objectCategory: CN=Test,CN=Schema,CN=Configuration,DC=schema,DC=test
-nTSecurityDescriptor: foo
-instanceType: 4
-
diff --git a/source4/lib/ldb/tests/schema-tests/schema-mod-test-1.ldif b/source4/lib/ldb/tests/schema-tests/schema-mod-test-1.ldif
deleted file mode 100644
index b976724485..0000000000
--- a/source4/lib/ldb/tests/schema-tests/schema-mod-test-1.ldif
+++ /dev/null
@@ -1,5 +0,0 @@
-dn: CN=Test,CN=Users,DC=schema,DC=test
-changetype: modify
-replace: description
-description: this test must not fail
-
diff --git a/source4/lib/ldb/tests/schema-tests/schema-mod-test-2.ldif b/source4/lib/ldb/tests/schema-tests/schema-mod-test-2.ldif
deleted file mode 100644
index fa193af683..0000000000
--- a/source4/lib/ldb/tests/schema-tests/schema-mod-test-2.ldif
+++ /dev/null
@@ -1,5 +0,0 @@
-dn: CN=Test,CN=Users,DC=schema,DC=test
-changetype: modify
-delete: description
-# this test must not fail
-
diff --git a/source4/lib/ldb/tests/schema-tests/schema-mod-test-3.ldif b/source4/lib/ldb/tests/schema-tests/schema-mod-test-3.ldif
deleted file mode 100644
index 8ab7798f9c..0000000000
--- a/source4/lib/ldb/tests/schema-tests/schema-mod-test-3.ldif
+++ /dev/null
@@ -1,5 +0,0 @@
-dn: CN=Test,CN=Users,DC=schema,DC=test
-changetype: modify
-add: description
-description: this test must not fail
-
diff --git a/source4/lib/ldb/tests/schema-tests/schema-mod-test-4.ldif b/source4/lib/ldb/tests/schema-tests/schema-mod-test-4.ldif
deleted file mode 100644
index cbf0e60bbe..0000000000
--- a/source4/lib/ldb/tests/schema-tests/schema-mod-test-4.ldif
+++ /dev/null
@@ -1,5 +0,0 @@
-dn: CN=Test,CN=Users,DC=schema,DC=test
-changetype: modify
-add: foo
-foo: this test must fail
-
diff --git a/source4/lib/ldb/tests/schema-tests/schema-mod-test-5.ldif b/source4/lib/ldb/tests/schema-tests/schema-mod-test-5.ldif
deleted file mode 100644
index bc64e9edb6..0000000000
--- a/source4/lib/ldb/tests/schema-tests/schema-mod-test-5.ldif
+++ /dev/null
@@ -1,5 +0,0 @@
-dn: CN=Test,CN=Users,DC=schema,DC=test
-changetype: modify
-delete: nTSecurityDescriptor
-# this test must fail
-
diff --git a/source4/lib/ldb/tests/schema-tests/schema.ldif b/source4/lib/ldb/tests/schema-tests/schema.ldif
deleted file mode 100644
index 4ab1932839..0000000000
--- a/source4/lib/ldb/tests/schema-tests/schema.ldif
+++ /dev/null
@@ -1,100 +0,0 @@
-dn: @INDEXLIST
-@IDXATTR: name
-@IDXATTR: sAMAccountName
-@IDXATTR: objectSid
-@IDXATTR: objectClass
-@IDXATTR: member
-@IDXATTR: uidNumber
-@IDXATTR: gidNumber
-@IDXATTR: unixName
-@IDXATTR: privilege
-@IDXATTR: lDAPDisplayName
-
-dn: @ATTRIBUTES
-realm: CASE_INSENSITIVE
-userPrincipalName: CASE_INSENSITIVE
-servicePrincipalName: CASE_INSENSITIVE
-name: CASE_INSENSITIVE
-dn: CASE_INSENSITIVE
-sAMAccountName: CASE_INSENSITIVE
-objectClass: CASE_INSENSITIVE
-unicodePwd: HIDDEN
-ntPwdHash: HIDDEN
-ntPwdHistory: HIDDEN
-lmPwdHash: HIDDEN
-lmPwdHistory: HIDDEN
-createTimestamp: HIDDEN
-modifyTimestamp: HIDDEN
-
-dn: @MODULES
-@LIST: timestamps,schema
-
-dn: CN=Top,CN=Schema,CN=Configuration,DC=schema,DC=test
-objectClass: top
-objectClass: classSchema
-lDAPDisplayName: top
-cn: Top
-uSNCreated: 1
-uSNChanged: 1
-subClassOf: top
-systemMustContain: objectClass
-systemMayContain: structuralObjectClass
-systemMayContain: createTimeStamp
-systemMayContain: modifyTimeStamp
-systemMayContain: creatorsName
-systemMayContain: modifiersName
-systemMayContain: hasSubordinates
-systemMayContain: subschemaSubentry
-systemMayContain: collectiveSubentry
-systemMayContain: entryUUID
-systemMayContain: entryCSN
-systemMayContain: namingCSN
-systemMayContain: superiorUUID
-systemMayContain: contextCSN
-systemMayContain: whenCreated
-systemMayContain: whenChanged
-systemMayContain: uSNCreated
-systemMayContain: uSNChanged
-systemMayContain: distinguishedName
-systemMayContain: name
-systemMayContain: cn
-systemMayContain: userPassword
-systemMayContain: labeledURI
-
-dn: CN=Class-Schema,CN=Schema,CN=Configuration,DC=schema,DC=test
-objectClass: top
-objectClass: classSchema
-lDAPDisplayName: classSchema
-cn: Class-Schema
-uSNCreated: 2
-uSNChanged: 2
-lDAPDisplayName: classSchema
-subClassOf: top
-systemMustContain: cn
-systemMustContain: subClassOf
-systemMayContain: systemPossSuperiors
-systemMayContain: systemOnly
-systemMayContain: systemMustContain
-systemMayContain: systemMayContain
-systemMayContain: systemAuxiliaryClass
-systemMayContain: possSuperiors
-systemMayContain: mustContain
-systemMayContain: mayContain
-systemMayContain: lDAPDisplayName
-systemMayContain: auxiliaryClass
-
-dn: CN=Attribute-Schema,CN=Schema,CN=Configuration,DC=schema,DC=test
-objectClass: top
-objectClass: classSchema
-cn: Attribute-Schema
-uSNCreated: 3
-uSNChanged: 3
-lDAPDisplayName: attributeSchema
-subClassOf: top
-systemMustContain: oMSyntax
-systemMustContain: lDAPDisplayName
-systemMustContain: isSingleValued
-systemMustContain: cn
-systemMustContain: attributeSyntax
-systemMustContain: attributeID
-
diff --git a/source4/lib/ldb/tests/slapd.conf b/source4/lib/ldb/tests/slapd.conf
deleted file mode 100644
index fa2789d8c1..0000000000
--- a/source4/lib/ldb/tests/slapd.conf
+++ /dev/null
@@ -1,26 +0,0 @@
-loglevel 0
-
-include tests/schema/core.schema
-include tests/schema/cosine.schema
-include tests/schema/inetorgperson.schema
-include tests/schema/openldap.schema
-include tests/schema/nis.schema
-
-
-pidfile tests/tmp/slapd.pid
-argsfile tests/tmp/slapd.args
-
-access to * by * write
-
-allow update_anon bind_anon_dn
-
-include tests/tmp/modules.conf
-
-defaultsearchbase "o=University of Michigan,c=TEST"
-
-backend bdb
-database bdb
-suffix "o=University of Michigan,c=TEST"
-directory tests/tmp/db
-index objectClass eq
-index uid eq
diff --git a/source4/lib/ldb/tests/start_slapd.sh b/source4/lib/ldb/tests/start_slapd.sh
deleted file mode 100755
index 11679d47a3..0000000000
--- a/source4/lib/ldb/tests/start_slapd.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-if [ -z "$LDBDIR" ]; then
- LDBDIR=`dirname $0`/..
- export LDBDIR
-fi
-
-mkdir -p $LDBDIR/tests/tmp/db
-
-# running slapd in the background (with &) means it stays in the same process group, so it can be
-# killed by timelimit
-slapd -d0 -f $LDBDIR/tests/slapd.conf -h "`$LDBDIR/tests/ldapi_url.sh`" $* &
-
-sleep 2
diff --git a/source4/lib/ldb/tests/test-attribs.ldif b/source4/lib/ldb/tests/test-attribs.ldif
deleted file mode 100644
index 79508c4b7b..0000000000
--- a/source4/lib/ldb/tests/test-attribs.ldif
+++ /dev/null
@@ -1,6 +0,0 @@
-dn: @ATTRIBUTES
-uid: CASE_INSENSITIVE
-cn: CASE_INSENSITIVE
-ou: CASE_INSENSITIVE
-dn: CASE_INSENSITIVE
-
diff --git a/source4/lib/ldb/tests/test-config.ldif b/source4/lib/ldb/tests/test-config.ldif
deleted file mode 100644
index 7926a9e3c5..0000000000
--- a/source4/lib/ldb/tests/test-config.ldif
+++ /dev/null
@@ -1,67 +0,0 @@
-##############################
-# global configuration options
-dn: cn=Global,cn=Config,cn=Samba
-objectclass: globalconfig
-LocalConfigCn: cn=%U,cn=Config,cn=Samba
-LocalConfigCn;1: cn=%U,cn=Config,cn=Samba
-LocalConfigCn;2: cn=%I,cn=Config,cn=Samba
-LocalConfigCn;3: cn=%M,cn=Config,cn=Samba
-
-#############
-dn: cn=Protocol,cn=Global,cn=Config,cn=Samba
-maxXmit: 7000
-
-################################
-dn: cn=Volker,cn=Config,cn=Samba
-Workgroup: VNET3
-UnixCharset: UTF8
-Security: user
-Interfaces: vmnet* eth*
-NetbiosName: blu
-GuestAccount: tridge
-
-#################################
-dn: cn=Volker,cn=Config,cn=Samba
-Workgroup: VNET3
-UnixCharset: UTF8
-Security: user
-Interfaces: vmnet* eth*
-NetbiosName: blu
-GuestAccount: tridge
-Include: cn=%U,cn=MyConfig,cn=Config,cn=Samba
-
-#### ((objectClass=fileshare)(cn=test))
-##############################
-# [test] share
-dn: cn=test,cn=Shares,cn=Config,cn=Samba
-objectclass: fileshare
-cn: test
-Comment: a test share
-Path: /home/tridge/samba4/prefix/test
-ReadOnly: no
-
-#####################################
-# [msdn] a remote proxy share, stored
-# on \\msdn\test
-dn: cn=msdn,cn=Shares,cn=Config,cn=Samba
-objectclass: fileshare
-cn: msdn
-NtvfsHandler: cifs
-ReadOnly: no
-_CifsServer: msdn
-_CifsUser: administrator
-_CifsPassword: penguin
-_CifsDomain: winxp
-_CifsShare: test
-
-
-##############################
-# [VisualC] share
-dn: cn=visualc,cn=Shares,cn=Config,cn=Samba
-objectclass: fileshare
-cn: VisualC
-Comment: VisualC development
-Path: /home/tridge/VisualC
-ReadOnly: no
-NtvfsHandler: simple
-
diff --git a/source4/lib/ldb/tests/test-controls.sh b/source4/lib/ldb/tests/test-controls.sh
deleted file mode 100755
index 771085ec60..0000000000
--- a/source4/lib/ldb/tests/test-controls.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/sh
-
-if [ -n "$TEST_DATA_PREFIX" ]; then
- LDB_URL="$TEST_DATA_PREFIX/tdbtest.ldb"
-else
- LDB_URL="tdbtest.ldb"
-fi
-export LDB_URL
-
-PATH=bin:$PATH
-export PATH
-
-rm -f $LDB_URL*
-
-echo "LDB_URL: $LDB_URL"
-cat <<EOF | $VALGRIND ldbadd || exit 1
-dn: @MODULES
-@LIST: sample
-EOF
-
-cat <<EOF | $VALGRIND ldbadd || exit 1
-dn: dc=bar
-dc: bar
-someThing: someThingElse
-EOF
-
-$VALGRIND ldbsearch "(touchedBy=sample)" | grep "touchedBy: sample" || exit 1
-# This action are expected to fails because the sample module return an error when presented the relax control
-
-cat <<EOF | $VALGRIND ldbadd --controls "relax:0" && exit 1
-dn: dc=foobar
-dc: foobar
-someThing: someThingElse
-EOF
-
-cat <<EOF | $VALGRIND ldbmodify --controls "relax:0" && exit 1
-dn: dc=bar
-changetype: modify
-replace someThing
-someThing: someThingElseBetter
-EOF
-
-$VALGRIND ldbsearch --controls "bypassoperational:0" >/dev/null 2>&1 || exit 1
-
-set
diff --git a/source4/lib/ldb/tests/test-default-config.ldif b/source4/lib/ldb/tests/test-default-config.ldif
deleted file mode 100644
index 87b7bcd3cc..0000000000
--- a/source4/lib/ldb/tests/test-default-config.ldif
+++ /dev/null
@@ -1,17 +0,0 @@
-##############################
-# global configuration options
-dn: cn=Global,cn=DefaultConfig,cn=Samba
-objectclass: globalconfig
-Workgroup: WORKGROUP
-UnixCharset: UTF8
-Security: user
-NetbiosName: blu
-GuestAccount: nobody
-
-##############################
-# [_default_] share
-dn: cn=_default_,cn=Shares,cn=DefaultConfig,cn=Samba
-objectclass: fileshare
-cn: _default_
-Path: /tmp
-ReadOnly: yes
diff --git a/source4/lib/ldb/tests/test-extended.sh b/source4/lib/ldb/tests/test-extended.sh
deleted file mode 100755
index 14b988e3f9..0000000000
--- a/source4/lib/ldb/tests/test-extended.sh
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/sh
-
-echo "Running extended search tests"
-
-mv $LDB_URL $LDB_URL.1
-
-cat <<EOF | $VALGRIND ldbadd$EXEEXT || exit 1
-dn: cn=testrec1,cn=TEST
-i1: 1
-i2: 0
-i3: 1234
-i4: 0x7003004
-
-dn: cn=testrec2,cn=TEST
-i1: 0x800000
-
-dn: cn=testrec3,cn=TEST
-i1: 0x101010101
-i1: 7
-
-dn: cn=auser1,cn=TEST
-groupType: 2147483648
-samAccountType: 805306368
-
-dn: cn=auser2,cn=TEST
-groupType: 2147483648
-samAccountType: 805306369
-
-dn: cn=auser3,cn=TEST
-groupType: 2147483649
-samAccountType: 805306370
-
-dn: cn=auser4,cn=TEST
-groupType: 2147483649
-samAccountType: 805306369
-EOF
-
-checkcount() {
- count=$1
- expression="$2"
- n=`$VALGRIND ldbsearch$EXEEXT "$expression" | grep '^dn' | wc -l`
- if [ $n != $count ]; then
- echo "Got $n but expected $count for $expression"
- $VALGRIND ldbsearch$EXEEXT "$expression"
- exit 1
- fi
- echo "OK: $count $expression"
-}
-
-checkcount 1 '(i3=1234)'
-checkcount 0 '(i3=12345)'
-
-checkcount 2 '(i1:1.2.840.113556.1.4.803:=1)'
-checkcount 1 '(i1:1.2.840.113556.1.4.803:=3)'
-checkcount 1 '(i1:1.2.840.113556.1.4.803:=7)'
-checkcount 0 '(i1:1.2.840.113556.1.4.803:=15)'
-checkcount 1 '(i1:1.2.840.113556.1.4.803:=0x800000)'
-checkcount 1 '(i1:1.2.840.113556.1.4.803:=8388608)'
-
-checkcount 2 '(i1:1.2.840.113556.1.4.804:=1)'
-checkcount 2 '(i1:1.2.840.113556.1.4.804:=3)'
-checkcount 2 '(i1:1.2.840.113556.1.4.804:=7)'
-checkcount 2 '(i1:1.2.840.113556.1.4.804:=15)'
-checkcount 1 '(i1:1.2.840.113556.1.4.804:=0x800000)'
-checkcount 1 '(i1:1.2.840.113556.1.4.804:=8388608)'
-
-# this is one that w2k gives
-checkcount 3 '(|(|(&(!(groupType:1.2.840.113556.1.4.803:=1))(groupType:1.2.840.113556.1.4.803:=2147483648)(groupType:1.2.840.113556.1.4.804:=10))(samAccountType=805306368))(samAccountType=805306369))'
-
diff --git a/source4/lib/ldb/tests/test-generic.sh b/source4/lib/ldb/tests/test-generic.sh
deleted file mode 100755
index ae9ff7344a..0000000000
--- a/source4/lib/ldb/tests/test-generic.sh
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/bin/sh
-
-if [ -z "$LDB_SPECIALS" ]; then
- LDB_SPECIALS=1
- export LDB_SPECIALS
-fi
-
-echo "LDB_URL: $LDB_URL"
-
-echo "Adding base elements"
-$VALGRIND ldbadd$EXEEXT $LDBDIR/tests/test.ldif || exit 1
-
-echo "Adding again - should fail"
-$VALGRIND ldbadd$EXEEXT $LDBDIR/tests/test.ldif 2> /dev/null && {
- echo "Should have failed to add again - gave $?"
- exit 1
-}
-
-echo "Modifying elements"
-$VALGRIND ldbmodify$EXEEXT $LDBDIR/tests/test-modify.ldif || exit 1
-
-echo "Showing modified record"
-$VALGRIND ldbsearch$EXEEXT '(uid=uham)' || exit 1
-
-echo "Rename entry with ldbmodify - modrdn"
-$VALGRIND ldbmodify$EXEEXT $LDBDIR/tests/test-modify-modrdn.ldif || exit 1
-
-echo "Rename entry with ldbrename"
-OLDDN="cn=Ursula Hampster,ou=Alumni Association,ou=People,o=University of Michigan,c=TEST"
-NEWDN="cn=Hampster Ursula,ou=Alumni Association,ou=People,o=University of Michigan,c=TEST"
-$VALGRIND ldbrename$EXEEXT "$OLDDN" "$NEWDN" || exit 1
-
-echo "Showing renamed record"
-$VALGRIND ldbsearch$EXEEXT '(uid=uham)' || exit 1
-
-echo "Starting ldbtest"
-$VALGRIND ldbtest$EXEEXT --num-records 100 --num-searches 10 || exit 1
-
-if [ $LDB_SPECIALS = 1 ]; then
- echo "Adding index"
- $VALGRIND ldbadd$EXEEXT $LDBDIR/tests/test-index.ldif || exit 1
-fi
-
-echo "Adding bad attributes - should fail"
-$VALGRIND ldbadd$EXEEXT $LDBDIR/tests/test-wrong_attributes.ldif && {
- echo "Should fhave failed - gave $?"
- exit 1
-}
-
-echo "Testing indexed search"
-$VALGRIND ldbsearch$EXEEXT '(uid=uham)' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(&(objectclass=person)(objectclass=person)(objectclass=top))' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(&(uid=uham)(uid=uham))' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(|(uid=uham)(uid=uham))' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(|(uid=uham)(uid=uham)(objectclass=OpenLDAPperson))' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(&(uid=uham)(uid=uham)(!(objectclass=xxx)))' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(&(objectclass=person)(uid=uham)(!(uid=uhamxx)))' uid \* \+ dn || exit 1
-$VALGRIND ldbsearch$EXEEXT '(&(uid=uham)(uid=uha*)(title=*))' uid || exit 1
-
-# note that the "((" is treated as an attribute not an expression
-# this matches the openldap ldapsearch behaviour of looking for a '='
-# to see if the first argument is an expression or not
-$VALGRIND ldbsearch$EXEEXT '((' uid || exit 1
-$VALGRIND ldbsearch$EXEEXT '(objectclass=)' uid || exit 1
-$VALGRIND ldbsearch$EXEEXT -b 'cn=Hampster Ursula,ou=Alumni Association,ou=People,o=University of Michigan,c=TEST' -s base "" sn || exit 1
-
-echo "Test wildcard match"
-$VALGRIND ldbadd$EXEEXT $LDBDIR/tests/test-wildcard.ldif || exit 1
-$VALGRIND ldbsearch$EXEEXT '(cn=test*multi)' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(cn=*test*multi*)' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(cn=*test_multi)' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(cn=test_multi*)' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(cn=test*multi*test*multi)' || exit 1
-$VALGRIND ldbsearch$EXEEXT '(cn=test*multi*test*multi*multi_*)' || exit 1
-
-echo "Starting ldbtest indexed"
-$VALGRIND ldbtest$EXEEXT --num-records 100 --num-searches 500 || exit 1
-
-echo "Testing one level search"
-count=`$VALGRIND ldbsearch$EXEEXT -b 'ou=Groups,o=University of Michigan,c=TEST' -s one 'objectclass=*' none |grep '^dn' | wc -l`
-if [ $count != 3 ]; then
- echo returned $count records - expected 3
- exit 1
-fi
-
-echo "Testing binary file attribute value"
-$VALGRIND ldbmodify$EXEEXT $LDBDIR/tests/photo.ldif || exit 1
-count=`$VALGRIND ldbsearch$EXEEXT '(cn=Hampster Ursula)' jpegPhoto | grep '^dn' | wc -l`
-if [ $count != 1 ]; then
- echo returned $count records - expected 1
- exit 1
-fi
-
-echo "*TODO* Testing UTF8 upper lower case searches !!"
-
-echo "Testing compare"
-count=`$VALGRIND ldbsearch$EXEEXT '(cn>=t)' cn | grep '^dn' | wc -l`
-if [ $count != 2 ]; then
- echo returned $count records - expected 2
- echo "this fails on openLdap ..."
-fi
-
-count=`$VALGRIND ldbsearch$EXEEXT '(cn<=t)' cn | grep '^dn' | wc -l`
-if [ $count != 13 ]; then
- echo returned $count records - expected 13
- echo "this fails on openLdap ..."
-fi
-
-checkcount() {
- count=$1
- scope=$2
- basedn=$3
- expression="$4"
- n=`$VALGRIND ldbsearch$EXEEXT -s "$scope" -b "$basedn" "$expression" | grep '^dn' | wc -l`
- if [ $n != $count ]; then
- echo "Got $n but expected $count for $expression"
- bin/ldbsearch "$expression"
- exit 1
- fi
- echo "OK: $count $expression"
-}
-
-checkcount 0 'base' '' '(uid=uham)'
-checkcount 0 'one' '' '(uid=uham)'
-
-checkcount 1 'base' 'cn=Hampster Ursula,ou=Alumni Association,ou=People,o=University of Michigan,c=TEST' '(uid=uham)'
-checkcount 1 'one' 'ou=Alumni Association,ou=People,o=University of Michigan,c=TEST' '(uid=uham)'
-checkcount 1 'one' 'ou=People,o=University of Michigan,c=TEST' '(ou=ldb test)'
diff --git a/source4/lib/ldb/tests/test-index.ldif b/source4/lib/ldb/tests/test-index.ldif
deleted file mode 100644
index 268173641d..0000000000
--- a/source4/lib/ldb/tests/test-index.ldif
+++ /dev/null
@@ -1,7 +0,0 @@
-dn: @INDEXLIST
-@IDXATTR: uid
-@IDXATTR: objectclass
-
-dn: @ATTRIBUTES
-uid: CASE_INSENSITIVE
-
diff --git a/source4/lib/ldb/tests/test-ldap.sh b/source4/lib/ldb/tests/test-ldap.sh
deleted file mode 100755
index 14cfb5f979..0000000000
--- a/source4/lib/ldb/tests/test-ldap.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/sh
-
-PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH
-export PATH
-SCHEMA_NEEDED="core nis cosine inetorgperson openldap"
-
-# setup needed schema files
-for f in $SCHEMA_NEEDED; do
- if [ ! -r tests/schema/$f.schema ]; then
- mkdir -p tests/schema
- if [ -r /etc/ldap/schema/$f.schema ]; then
- ln -s /etc/ldap/schema/$f.schema tests/schema/$f.schema
- continue;
- fi
- if [ -r /etc/openldap/schema/$f.schema ]; then
- ln -s /etc/openldap/schema/$f.schema tests/schema/$f.schema
- continue;
- fi
-
- echo "SKIPPING TESTS: you need the following OpenLDAP schema files"
- for f in $SCHEMA_NEEDED; do
- echo " $f.schema"
- done
- exit 0
- fi
-done
-
-if [ -z "$LDBDIR" ]; then
- LDBDIR=`dirname $0`/..
- export LDBDIR
-fi
-
-LDB_URL=`$LDBDIR/tests/ldapi_url.sh`
-export LDB_URL
-
-PATH=bin:$PATH
-export PATH
-
-LDB_SPECIALS=0
-export LDB_SPECIALS
-
-if $LDBDIR/tests/init_slapd.sh &&
- $LDBDIR/tests/start_slapd.sh &&
- $LDBDIR/tests/test-generic.sh; then
- echo "ldap tests passed";
- ret=0
-else
- echo "ldap tests failed";
- ret=$?
-fi
-
-#$LDBDIR/tests/kill_slapd.sh
-
-exit $ret
diff --git a/source4/lib/ldb/tests/test-modify-modrdn.ldif b/source4/lib/ldb/tests/test-modify-modrdn.ldif
deleted file mode 100644
index efa3149462..0000000000
--- a/source4/lib/ldb/tests/test-modify-modrdn.ldif
+++ /dev/null
@@ -1,12 +0,0 @@
-dn: cn=Ursula Hampster,ou=Alumni Association,ou=People,o=University of Michiga
- n,c=TEST
-changetype: moddn
-newrdn: cn=Hampster Ursula
-deleteoldrdn: 1
-newsuperior: ou=Alumni Association,ou=People,o=University of Michigan,c=TEST
-
-dn: cn=Hampster Ursula,ou=Alumni Association,ou=People,o=University of Michiga
- n,c=TEST
-changetype: modrdn
-newrdn: cn=Ursula Hampster
-deleteoldrdn: 1
diff --git a/source4/lib/ldb/tests/test-modify.ldif b/source4/lib/ldb/tests/test-modify.ldif
deleted file mode 100644
index e5b9ca4086..0000000000
--- a/source4/lib/ldb/tests/test-modify.ldif
+++ /dev/null
@@ -1,23 +0,0 @@
-dn: cn=Ursula Hampster,ou=Alumni Association,ou=People,o=University of Michiga
- n,c=TEST
-changetype: modify
-add: drink
-drink: mango lassi
--
-add: drink
-drink: lemonade
--
-delete: pager
--
-replace: telephonenumber
-telephonenumber: +61 2 6260 6012
-telephonenumber: +61 412 666 929
--
-delete: telephonenumber
-telephonenumber: +61 2 6260 6012
--
-delete: telephonenumber
-telephonenumber: +61 412 666 929
--
-add: telephonenumber
-telephonenumber: +61 412 666 929
diff --git a/source4/lib/ldb/tests/test-schema.sh b/source4/lib/ldb/tests/test-schema.sh
deleted file mode 100755
index 97841844db..0000000000
--- a/source4/lib/ldb/tests/test-schema.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-
-LDB_URL="tdb://schema.ldb"
-export LDB_URL
-
-rm -f schema.ldb
-
-echo "LDB_URL: $LDB_URL"
-
-echo "Adding schema"
-$VALGRIND bin/ldbadd $LDBDIR/tests/schema-tests/schema.ldif || exit 1
-
-echo "Adding few test elements (no failure expected here)"
-$VALGRIND bin/ldbadd $LDBDIR/tests/schema-tests/schema-add-test.ldif || exit 1
-
-echo "Modifying elements (2 failures expected here)"
-
-$VALGRIND bin/ldbmodify $LDBDIR/tests/schema-tests/schema-mod-test-1.ldif || exit 1
-$VALGRIND bin/ldbmodify $LDBDIR/tests/schema-tests/schema-mod-test-2.ldif || exit 1
-$VALGRIND bin/ldbmodify $LDBDIR/tests/schema-tests/schema-mod-test-3.ldif || exit 1
-$VALGRIND bin/ldbmodify $LDBDIR/tests/schema-tests/schema-mod-test-4.ldif
-if [ "$?" = "0" ]; then
- echo "test failed!"
- exit 1
-fi
-$VALGRIND bin/ldbmodify $LDBDIR/tests/schema-tests/schema-mod-test-5.ldif
-if [ "$?" = "0" ]; then
- echo "test failed!"
- exit 1
-fi
-
-echo "Showing modified record"
-$VALGRIND bin/ldbsearch '(cn=Test)' || exit 1
-
diff --git a/source4/lib/ldb/tests/test-soloading.sh b/source4/lib/ldb/tests/test-soloading.sh
deleted file mode 100755
index da6d57541e..0000000000
--- a/source4/lib/ldb/tests/test-soloading.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/sh
-
-if [ -n "$TEST_DATA_PREFIX" ]; then
- LDB_URL="$TEST_DATA_PREFIX/tdbtest.ldb"
-else
- LDB_URL="tdbtest.ldb"
-fi
-export LDB_URL
-
-PATH=bin:$PATH
-export PATH
-
-rm -f $LDB_URL*
-
-if [ -z "$LDBDIR" ]; then
- LDBDIR=`dirname $0`/..
- export LDBDIR
-fi
-
-cat <<EOF | $VALGRIND ldbadd || exit 1
-dn: @MODULES
-@LIST: sample
-EOF
-
-cat <<EOF | $VALGRIND ldbadd || exit 1
-dn: dc=bar
-dc: bar
-someThing: someThingElse
-EOF
-
-$VALGRIND ldbsearch "(touchedBy=sample)" | grep "touchedBy: sample" || exit 1
-
diff --git a/source4/lib/ldb/tests/test-sqlite3.sh b/source4/lib/ldb/tests/test-sqlite3.sh
deleted file mode 100755
index 0cef318d98..0000000000
--- a/source4/lib/ldb/tests/test-sqlite3.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-
-LDB_URL="sqlite3://sqltest.ldb"
-export LDB_URL
-
-rm -f sqltest.ldb
-
-if [ -z "$LDBDIR" ]; then
- LDBDIR=`dirname $0`/..
- export LDBDIR
-fi
-
-PATH=bin:$PATH
-export PATH
-
-LDB_SPECIALS=0
-export LDB_SPECIALS
-
-$LDBDIR/tests/test-generic.sh
-
-#. $LDBDIR/tests/test-extended.sh
-
-#. $LDBDIR/tests/test-tdb-features.sh
-
diff --git a/source4/lib/ldb/tests/test-tdb-features.sh b/source4/lib/ldb/tests/test-tdb-features.sh
deleted file mode 100644
index d4248366ca..0000000000
--- a/source4/lib/ldb/tests/test-tdb-features.sh
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/bin/sh
-
-echo "Running tdb feature tests"
-
-mv $LDB_URL $LDB_URL.2
-
-checkcount() {
- count=$1
- expression="$2"
- n=`$VALGRIND ldbsearch$EXEEXT "$expression" | grep '^dn' | wc -l`
- if [ $n != $count ]; then
- echo "Got $n but expected $count for $expression"
- $VALGRIND ldbsearch$EXEEXT "$expression"
- exit 1
- fi
- echo "OK: $count $expression"
-}
-
-echo "Testing case sensitive search"
-cat <<EOF | $VALGRIND ldbadd$EXEEXT || exit 1
-dn: cn=t1,cn=TEST
-objectClass: testclass
-test: foo
-EOF
-checkcount 1 '(test=foo)'
-checkcount 0 '(test=FOO)'
-checkcount 0 '(test=FO*)'
-
-echo "Making case insensitive"
-cat <<EOF | $VALGRIND ldbmodify$EXEEXT || exit 1
-dn: @ATTRIBUTES
-changetype: add
-add: test
-test: CASE_INSENSITIVE
-EOF
-
-echo $ldif | $VALGRIND ldbmodify$EXEEXT || exit 1
-checkcount 1 '(test=foo)'
-checkcount 1 '(test=FOO)'
-checkcount 1 '(test=fo*)'
-
-echo "adding i"
-cat <<EOF | $VALGRIND ldbmodify$EXEEXT || exit 1
-dn: cn=t1,cn=TEST
-changetype: modify
-add: i
-i: 0x100
-EOF
-checkcount 1 '(i=0x100)'
-checkcount 0 '(i=256)'
-
-echo "marking i as INTEGER"
-cat <<EOF | $VALGRIND ldbmodify$EXEEXT || exit 1
-dn: @ATTRIBUTES
-changetype: modify
-add: i
-i: INTEGER
-EOF
-checkcount 1 '(i=0x100)'
-checkcount 1 '(i=256)'
-
-echo "adding j"
-cat <<EOF | $VALGRIND ldbmodify$EXEEXT || exit 1
-dn: cn=t1,cn=TEST
-changetype: modify
-add: j
-j: 0x100
-EOF
-checkcount 1 '(j=0x100)'
-checkcount 0 '(j=256)'
-
-echo "Adding wildcard attribute"
-cat <<EOF | $VALGRIND ldbmodify$EXEEXT || exit 1
-dn: @ATTRIBUTES
-changetype: modify
-add: *
-*: INTEGER
-EOF
-checkcount 1 '(j=0x100)'
-checkcount 1 '(j=256)'
-
-echo "Testing class search"
-checkcount 0 '(objectClass=otherclass)'
-checkcount 1 '(objectClass=testclass)'
-
-echo "Adding index"
-cat <<EOF | $VALGRIND ldbadd$EXEEXT || exit 1
-dn: @INDEXLIST
-@IDXATTR: i
-@IDXATTR: test
-EOF
-checkcount 1 '(i=0x100)'
-checkcount 1 '(i=256)'
-checkcount 0 '(i=-256)'
-checkcount 1 '(test=foo)'
-checkcount 1 '(test=FOO)'
-checkcount 1 '(test=*f*o)'
-
-echo "making test case sensitive"
-cat <<EOF | $VALGRIND ldbmodify$EXEEXT || exit 1
-dn: @ATTRIBUTES
-changetype: modify
-replace: test
-test: NONE
-EOF
-checkcount 1 '(test=foo)'
-checkcount 0 '(test=FOO)'
-checkcount 1 '(test=f*o*)'
-
-checkone() {
- count=$1
- base="$2"
- expression="$3"
- n=`$VALGRIND ldbsearch$EXEEXT -s one -b "$base" "$expression" | grep '^dn' | wc -l`
- if [ $n != $count ]; then
- echo "Got $n but expected $count for $expression"
- $VALGRIND ldbsearch$EXEEXT -s one -b "$base" "$expression"
- exit 1
- fi
- echo "OK: $count $expression"
-}
-
-echo "Removing wildcard attribute"
-cat <<EOF | $VALGRIND ldbmodify$EXEEXT || exit 1
-dn: @ATTRIBUTES
-changetype: modify
-delete: *
-*: INTEGER
-EOF
-
-echo "Adding one level indexes"
-cat <<EOF | $VALGRIND ldbmodify$EXEEXT || exit 1
-dn: @INDEXLIST
-changetype: modify
-add: @IDXONE
-@IDXONE: 1
-EOF
-
-echo "Testing one level indexed search"
-cat <<EOF | $VALGRIND ldbadd$EXEEXT || exit 1
-dn: cn=one,cn=t1,cn=TEST
-objectClass: oneclass
-cn: one
-test: one
-EOF
-checkone 1 "cn=t1,cn=TEST" '(test=one)'
-cat <<EOF | $VALGRIND ldbadd$EXEEXT || exit 1
-dn: cn=two,cn=t1,cn=TEST
-objectClass: oneclass
-cn: two
-test: one
-
-dn: cn=three,cn=t1,cn=TEST
-objectClass: oneclass
-cn: three
-test: one
-EOF
-checkone 3 "cn=t1,cn=TEST" '(test=one)'
-checkone 1 "cn=t1,cn=TEST" '(cn=two)'
-
diff --git a/source4/lib/ldb/tests/test-tdb.sh b/source4/lib/ldb/tests/test-tdb.sh
deleted file mode 100755
index 9da1e57060..0000000000
--- a/source4/lib/ldb/tests/test-tdb.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-if [ -n "$TEST_DATA_PREFIX" ]; then
- LDB_URL="$TEST_DATA_PREFIX/tdbtest.ldb"
-else
- LDB_URL="tdbtest.ldb"
-fi
-export LDB_URL
-
-PATH=bin:$PATH
-export PATH
-
-rm -f $LDB_URL*
-
-if [ -z "$LDBDIR" ]; then
- LDBDIR=`dirname $0`/..
- export LDBDIR
-fi
-
-cat <<EOF | $VALGRIND ldbadd$EXEEXT || exit 1
-dn: @MODULES
-@LIST: rdn_name
-EOF
-
-$VALGRIND ldbadd$EXEEXT $LDBDIR/tests/init.ldif || exit 1
-
-. $LDBDIR/tests/test-generic.sh
-
-. $LDBDIR/tests/test-extended.sh
-
-. $LDBDIR/tests/test-tdb-features.sh
-
-. $LDBDIR/tests/test-controls.sh
diff --git a/source4/lib/ldb/tests/test-wildcard.ldif b/source4/lib/ldb/tests/test-wildcard.ldif
deleted file mode 100644
index 222512eeab..0000000000
--- a/source4/lib/ldb/tests/test-wildcard.ldif
+++ /dev/null
@@ -1,5 +0,0 @@
-dn: cn=test_multi_test_multi_test_multi,o=University of Michigan,c=TEST
-objectclass: person
-cn: test_multi_test_multi_test_multi
-sn: multi_test
-description: test multi wildcards matching
diff --git a/source4/lib/ldb/tests/test-wrong_attributes.ldif b/source4/lib/ldb/tests/test-wrong_attributes.ldif
deleted file mode 100644
index 27f45f0e56..0000000000
--- a/source4/lib/ldb/tests/test-wrong_attributes.ldif
+++ /dev/null
@@ -1,3 +0,0 @@
-dn: @ATTRIBUTES
-uid: CASE_INTENSIVE
-
diff --git a/source4/lib/ldb/tests/test.ldif b/source4/lib/ldb/tests/test.ldif
deleted file mode 100644
index fd37f0037e..0000000000
--- a/source4/lib/ldb/tests/test.ldif
+++ /dev/null
@@ -1,417 +0,0 @@
-dn: ou=Groups,o=University of Michigan,c=TEST
-objectclass: organizationalUnit
-ou: Groups
-
-dn: ou=Information Technology Division,ou=People,o=University of Michigan,c=TEST
-objectclass: organizationalUnit
-ou: Information Technology Division
-description:: aMODwoPDgsKCw4PCgsOCwotFVlZQw4PCg8OCwoPDg8KCw4LCv0zDg8KDw4LCgsOD
- woLDgsKKT8ODwoPDgsKDw4PCgsOCwqs6w4PCg8OCwoLDg8KCw4LCjUQkw4PCg8OCwoLDg8KCw4LCi
- 01QUcODwoPDgsKDw4PCgsOCwr/Dg8KDw4LCg8ODwoLDgsKMw4PCg8OCwoLDg8KCw4LCik/Dg8KDw4
- LCgsODwoLDgsKLRCQoZitEJMODwoPDgsKCw4PCgsOCwrfDg8KDw4LCg8ODwoLDgsKIw4PCg8OCwoP
- Dg8KCw4LCgcODwoPDgsKDw4PCgsOCwqHDg8KDw4LCgsODwoLDgsKLRCQkZitEJMODwoPDgsKCw4PC
- gsOCwrfDg8KDw4LCg8ODwoLDgsKQw4PCg8OCwoPDg8KCw4LCisODwoPDgsKCw4PCgsOCwotFUVZqU
- MODwoPDgsKDw4PCgsOCwr/Dg8KDw4LCg8ODwoLDgsKAw4PCg8OCwoLDg8KCw4LCik85dCTDg8KDw4
- LCgsODwoLDgsKFQ8ODwoPDgsKDw4PCgsOCwr/Dg8KDw4LCg8ODwoLDgsK/w4PCg8OCwoPDg8KCw4L
- Cvzl0JMODwoPDgsKCw4PCgsOCwoXDg8KDw4LCg8ODwoLDgsK/w4PCg8OCwoPDg8KCw4LCv8ODwoPD
- gsKDw4PCgsOCwr/Dg8KDw4LCgsODwoLDgsKLRCTDg8KDw4LCgsODwoLDgsKDw4PCg8OCwoLDg8KCw
- 4LCuMODwoPDgsKDw4PCgsOCwoR0Q8ODwoPDgsKCw4PCgsOCwoM9w4PCg8OCwoPDg8KCw4LChMODwo
- PDgsKDw4PCgsOCwoFOdTrDg8KDw4LCg8ODwoLDgsKHw4PCg8OCwoPDg8KCw4LChMODwoPDgsKDw4P
- CgsOCwoFOw4PCg8OCwoPDg8KCw4LCqMODwoPDgsKDw4PCgsOCwrtHw4PCg8OCwoLDg8KCw4LChcOD
- woPDgsKDw4PCgsOCwoDDg8KDw4LCgsODwoLDgsK4dMODwoPDgsKDw4PCgsOCwqjDg8KDw4LCg8ODw
- oLDgsKtR8ODwoPDgsKCw4PCgsOCwovDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoPDg8KCw4LCiMODwo
- PDgsKDw4PCgsOCwr9SfGrDg8KDw4LCgsODwoLDgsKLQGgxw4PCg8OCwoPDg8KCw4LCoWhQw4PCg8O
- CwoPDg8KCw4LCv8ODwoPDgsKDw4PCgsOCwoDDg8KDw4LCgsODwoLDgsKKT8ODwoPDgsKCw4PCgsOC
- wotEJDDDg8KDw4LCgsODwoLDgsKFw4PCg8OCwoPDg8KCw4LCgHTDg8KDw4LCgsODwoLDgsKDw4PCg
- 8OCwoPDg8KCw4LCuHXDg8KDw4LCgsODwoLDgsKLRCRqw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKDw4
- PCgsOCwojDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoPDg8KCw4LCv8ODwoPDgsKCw4PCgsOCwpPDg8K
- Dw4LCg8ODwoLDgsKQXV9eW8ODwoPDgsKCw4PCgsOCwoPDg8KDw4LCg8ODwoLDgsKEw4PCg8OCwoPD
- g8KCw4LCgsODwoPDgsKDw4PCgsOCwozDg8KDw4LCg8ODwoLDgsKMw4PCg8OCwoPDg8KCw4LCjMODw
- oPDgsKDw4PCgsOCwozDg8KDw4LCg8ODwoLDgsKMw4PCg8OCwoPDg8KCw4LCjMODwoPDgsKDw4PCgs
- OCwoxWV8ODwoPDgsKCw4PCgsOCwovDg8KDw4LCg8ODwoLDgsKxw4PCg8OCwoLDg8KCw4LCi3wkw4P
- Cg8OCwoLDg8KCw4LCjcODwoPDgsKCw4PCgsOCwofDg8KDw4LCg8ODwoLDgsKof8ODwoPDgsKDw4PC
- gsOCwr/Dg8KDw4LCg8ODwoLDgsK/w4PCg8OCwoLDg8KCw4LCg8ODwoPDgsKDw4PCgsOCwrh5w4PCg
- 8OCwoLDg8KCw4LChzQzw4PCg8OCwoPDg8KCw4LCicODwoPDgsKCw4PCgsOCworDg8KDw4LCgsODwo
- LDgsKIw4PCg8OCwoLDg8KCw4LCuDFBw4PCg8OCwoPDg8KCw4LCvyTDg8KDw4LCgsODwoLDgsKNdDF
- Bw4PCg8OCwoLDg8KCw4LCuF9ew4PCg8OCwoPDg8KCw4LCgsODwoPDgsKCw4PCgsOCwrhfXsODwoPD
- gsKDw4PCgsOCwoLDg8KDw4LCgsODwoLDgsK4X17Dg8KDw4LCg8ODwoLDgsKCw4PCg8OCwoLDg8KCw
- 4LCi8ODwoPDgsKDw4PCgsOCwo7Dg8KDw4LCgsODwoLDgsKBw4PCg8OCwoPDg8KCw4LCv8ODwoPDgs
- KCw4PCgsOCwoTDg8KDw4LCgsODwoLDgsKAdcODwoPDgsKDw4PCgsOCwqhtw4PCg8OCwoLDg8KCw4L
- ChcODwoPDgsKDw4PCgsOCwoDDg8KDw4LCgsODwoLDgsKEw4PCg8OCwoPDg8KCw4LCsMODwoPDgsKC
- w4PCgsOCwrhfXsODwoPDgsKDw4PCgsOCwoLDg8KDw4LCg8ODwoLDgsKow4PCg8OCwoLDg8KCw4LCt
- sODwoPDgsKDw4PCgsOCwq7Dg8KDw4LCg8ODwoLDgsK/w4PCg8OCwoPDg8KCw4LCv8ODwoPDgsKCw4
- PCgsOCwoPDg8KDw4LCg8ODwoLDgsKoZsODwoPDgsKCw4PCgsOCwoPDg8KDw4LCg8ODwoLDgsK4w4P
- Cg8OCwoLDg8KCw4LCh8ODwoPDgsKDw4PCgsOCwpUzw4PCg8OCwoPDg8KCw4LCicODwoPDgsKCw4PC
- gsOCworDg8KDw4LCgsODwoLDgsKISDJBw4PCg8OCwoPDg8KCw4LCvyTDg8KDw4LCgsODwoLDgsKNN
- DJBw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKCw4PCgsOCwovDg8KDw4LCg8ODwoLDgsKOw4PCg8OCwo
- PDg8KCw4LCv8ODwoPDgsKCw4PCgsOCwpDDg8KDw4LCg8ODwoLDgsKIw4PCg8OCwoLDg8KCw4LCi8O
- DwoPDgsKDw4PCgsOCwojDg8KDw4LCg8ODwoLDgsKow4PCg8OCwoPDg8KCw4LCnEzDg8KDw4LCgsOD
- woLDgsKLSEBmw4PCg8OCwoLDg8KCw4LCg3lwdSTDg8KDw4LCgsODwoLDgsKBw4PCg8OCwoPDg8KCw
- 4LCv8ODwoPDgsKCw4PCgsOCwobDg8KDw4LCgsODwoLDgsKAw4PCg8OCwoLDg8KCw4LChMODwoPDgs
- KCw4PCgsOCwp/Dg8KDw4LCgsODwoLDgsKBw4PCg8OCwoPDg8KCw4LCv8ODwoPDgsKCw4PCgsOCwoj
- Dg8KDw4LCgsODwoLDgsKAw4PCg8OCwoLDg8KCw4LChMODwoPDgsKCw4PCgsOCwpPDg8KDw4LCgsOD
- woLDgsKBw4PCg8OCwoPDg8KCw4LCv1rDg8KDw4LCgsODwoLDgsKAw4PCg8OCwoLDg8KCw4LChMODw
- oPDgsKCw4PCgsOCwodqw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKCw4PCgsOCwoBqaMODwoPDgsKCw4
- PCgsOCwpBQw4PCg8OCwoPDg8KCw4LCv8ODwoPDgsKDIMODwoPDgsKCw4PCgsOCwopPw4PCg8OCwoL
- Dg8KCw4LChcODwoPDgsKDw4PCgsOCwoDDg8KDw4LCgsODwoLDgsKOacODwoPDgsKCw4PCgsOCwrhf
- XsODwoPDgsKDw4PCgsOCwoLDg8KDw4LCgsODwoLDgsK4X17Dg8KDw4LCg8ODwoLDgsKCw4PCg8OCw
- oLDg8KCw4LCgcODwoPDgsKDw4PCgsOCwr/Dg8KDw4LCgsODwoLDgsKGw4PCg8OCwoLDg8KCw4LCgM
- ODwoPDgsKCw4PCgsOCwoRJw4PCg8OCwoLDg8KCw4LCgcODwoPDgsKDw4PCgsOCwr/Dg8KDw4LCgsO
- DwoLDgsKIw4PCg8OCwoLDg8KCw4LCgMODwoPDgsKCw4PCgsOCwoQ9w4PCg8OCwoLDg8KCw4LCgcOD
- woPDgsKDw4PCgsOCwr9aw4PCg8OCwoLDg8KCw4LCgMODwoPDgsKCw4PCgsOCwoQxw4PCg8OCwoLDg
- 8KCw4LCuF9ew4PCg8OCwoPDg8KCw4LCgsODwoPDgsKCw4PCgsOCwoM9w4PCg8OCwoPDg8KCw4LCm0
- 7Dg8KDw4LCgsODwoLDgsKEw4PCg8OCwoLDg8KCw4LCuF9ew4PCg8OCwoPDg8KCw4LCgsODwoPDgsK
- Cw4PCgsOCwrhfXsODwoPDgsKDw4PCgsOCwoLDg8KDw4LCgsODwoLDgsK4X17Dg8KDw4LCg8ODwoLD
- gsKCw4PCg8OCwoLDg8KCw4LCuF9ew4PCg8OCwoPDg8KCw4LCgsODwoPDgsKCw4PCgsOCwrhfXsODw
- oPDgsKDw4PCgsOCwoLDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKDw4PCgs
- OCwo7Dg8KDw4LCg8ODwoLDgsK/w4PCg8OCwoLDg8KCw4LCkMODwoPDgsKDw4PCgsOCwojDg8KDw4L
- CgsODwoLDgsKLw4PCg8OCwoPDg8KCw4LCiMODwoPDgsKDw4PCgsOCwqjDg8KDw4LCg8ODwoLDgsK+
- S8ODwoPDgsKCw4PCgsOCwovDg8KDw4LCg8ODwoLDgsKww4PCg8OCwoPDg8KCw4LCv8ODwoPDgsKDw
- 4PCgsOCwoTDg8KDw4LCgsODwoLDgsKKT1DDg8KDw4LCg8ODwoLDgsKoRsODwoPDgsKCw4PCgsOCwo
- vDg8KDw4LCg8ODwoLDgsK4w4PCg8OCwoLDg8KCw4LChcODwoPDgsKDw4PCgsOCwrZ0Y8ODwoPDgsK
- Cw4PCgsOCwoXDg8KDw4LCg8ODwoLDgsK/dF/Dg8KDw4LCgsODwoLDgsKhdHpPw4PCg8OCwoLDg8KC
- w4LCi8ODwoPDgsKDw4PCgsOCwo5Qw4PCg8OCwoPDg8KCw4LCqC1Jw4PCg8OCwoLDg8KCw4LChcODw
- oPDgsKDw4PCgsOCwoB1RMODwoPDgsKCw4PCgsOCwqFwek/Dg8KDw4LCgsODwoLDgsKLw4PCg8OCwo
- PDg8KCw4LCj1DDg8KDw4LCg8ODwoLDgsKoScODwoPDgsKCw4PCgsOCwoXDg8KDw4LCg8ODwoLDgsK
- AdTPDg8KDw4LCgsODwoLDgsKhbHpPw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKDw4PCgsOCwo5Qw4PC
- g8OCwoPDg8KCw4LCqEnDg8KDw4LCgsODwoLDgsKFw4PCg8OCwoPDg8KCw4LCgHXDg8KDw4LCgsODw
- oLDgsKhaHpPw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKDw4PCgsOCwo9Qw4PCg8OCwoPDg8KCw4LCqM
- ODwoPDgsKDw4PCgsOCwrpIw4PCg8OCwoLDg8KCw4LChcODwoPDgsKDw4PCgsOCwoB1M8ODwoPDgsK
- Dw4PCgsOCwoBfXsODwoPDgsKDw4PCgsOCwoLDg8KDw4LCgsODwoLDgsK4X17Dg8KDw4LCg8ODwoLD
- gsKCw4PCg8OCwoLDg8KCw4LCuF9ew4PCg8OCwoPDg8KCw4LCgjPDg8KDw4LCg8ODwoLDgsKAX17Dg
- 8KDw4LCg8ODwoLDgsKCw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKDw4PCgsOCwo7Dg8KDw4LCg8ODwo
- LDgsKoJ8ODwoPDgsKDw4PCgsOCwq3Dg8KDw4LCg8ODwoLDgsK/w4PCg8OCwoPDg8KCw4LCv8ODwoP
- DgsKCw4PCgsOCwoPDg8KDw4LCg8ODwoLDgsK4aHU5w4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKCw4PC
- gsOCwovDg8KDw4LCg8ODwoLDgsKOw4PCg8OCwoPDg8KCw4LCv8ODwoPDgsKCw4PCgsOCwpDDg8KDw
- 4LCg8ODwoLDgsKIw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKCw4PCgsOCwovDg8KDw4LCg8ODwoLDgs
- KIw4PCg8OCwoPDg8KCw4LCv8ODwoPDgsKCw4PCgsOCwpLDg8KDw4LCg8ODwoLDgsKEw4PCg8OCwoL
- Dg8KCw4LChcODwoPDgsKDw4PCgsOCwoB0IcODwoPDgsKCw4PCgsOCwovDg8KDw4LCgsODwoLDgsKA
- w4PCg8OCwoPDg8KCw4LCtMODwoPDgsKCw4PCgsOCwoXDg8KDw4LCg8ODwoLDgsKAdGbDg8KDw4LCg
- sODwoLDgsKLQGY9dGY9dTPDg8KDw4LCg8ODwoLDgsKAX17Dg8KDw4LCg8ODwoLDgsKCw4PCg8OCwo
- LDg8KCw4LCuF9ew4PCg8OCwoPDg8KCw4LCgsODwoPDgsKCw4PCgsOCwrhfXsODwoPDgsKDw4PCgsO
- CwoIzw4PCg8OCwoPDg8KCw4LCgF9ew4PCg8OCwoPDg8KCw4LCgsODwoPDgsKCw4PCgsOCwovDg8KD
- w4LCg8ODwoLDgsK/Ri9BUC9BRi9BWi9BZC9BWzBBZC9BZTBBZC9BZC9BbzBBZC9BeTBBw4PCg8OCw
- oLDg8KCw4LCgzBBMUFhMUFrMUE=
-description:: UF7Dg8KDw4LCg8ODwoLDgsKCw4PCg8OCwoPDg8KCw4LCjMODwoPDgsKDw4PCgsOC
- wozDg8KDw4LCg8ODwoLDgsKMw4PCg8OCwoPDg8KCw4LCjMODwoPDgsKDw4PCgsOCwozDg8KDw4LCg
- 8ODwoLDgsKMw4PCg8OCwoPDg8KCw4LCqFDDg8KDw4LCg8ODwoLDgsKpRsODwoPDgsKDw4PCgsOCwo
- zDg8KDw4LCg8ODwoLDgsKMw4PCg8OCwoPDg8KCw4LCjMODwoPDgsKDw4PCgsOCwozDg8KDw4LCg8O
- DwoLDgsKMw4PCg8OCwoPDg8KCw4LCjMODwoPDgsKCw4PCgsOCwotEJCDDg8KDw4LCgsODwoLDgsKD
- w4PCg8OCwoPDg8KCw4LCrMODwoPDgsKCw4PCgsOCwotUJCRTw4PCg8OCwoLDg8KCw4LCi1wkJFbDg
- 8KDw4LCgsODwoLDgsKJTCRXVVBSU8ODwoPDgsKDw4PCgsOCwqjDg8KDw4LCg8ODwoLDgsKdT8ODwo
- PDgsKCw4PCgsOCwoN8JDB1w4PCg8OCwoPDg8KCw4LCh8ODwoPDgsKDw4PCgsOCwoDDg8KDw4LCg8O
- DwoLDgsKBTsODwoPDgsKDw4PCgsOCwqktw4PCg8OCwoLDg8KCw4LCg3wkMHTDg8KDw4LCgsODwoLD
- gsKDfCQww4PCg8OCwoLDg8KCw4LChTPDg8KDw4LCg8ODwoLDgsK2OTXDg8KDw4LCg8ODwoLDgsKAw
- 4PCg8OCwoPDg8KCw4LCgU7Dg8KDw4LCgsODwoLDgsKEIMODwoPDgsKCw4PCgsOCwqFIw4PCg8OCwo
- PDg8KCw4LChU7Dg8KDw4LCgsODwoLDgsKJNcODwoPDgsKDw4PCgsOCwoDDg8KDw4LCg8ODwoLDgsK
- BTsODwoPDgsKCw4PCgsOCwovDg8KDw4LCg8ODwoLDgsKIw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKD
- w4PCgsOCwr9TXMODwoPDgsKCw4PCgsOCwolEJDvDg8KDw4LCg8ODwoLDgsKGw4PCg8OCwoLDg8KCw
- 4LChMODwoPDgsKCw4PCgsOCwpHDg8KDw4LCgsODwoLDgsKNRCTDg8KDw4LCgsODwoLDgsKLIEjDg8
- KDw4LCg8ODwoLDgsKFTlDDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoPDg8KCw4LCv1Ngw4PCg8OCwoL
- Dg8KCw4LCi8ODwoPDgsKDw4PCgsOCwpjDg8KDw4LCgsODwoLDgsKFw4PCg8OCwoPDg8KCw4LCm3Rx
- w4PCg8OCwoLDg8KCw4LCizvDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoPDg8KCw4LCi8ODwoPDgsKDw
- 4PCgsOCwr9XaMODwoPDgsKCw4PCgsOCwolEJDvDg8KDw4LCg8ODwoLDgsKGdGLDg8KDw4LCgsODwo
- LDgsKLf2zDg8KDw4LCgsODwoLDgsKNRCTDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoPDg8KCw4LCi1D
- Dg8KDw4LCg8ODwoLDgsK/w4PCg8OCwoPDg8KCw4LCl8ODwoPDgsKCw4PCgsOCwovDg8KDw4LCg8OD
- woLDgsKow4PCg8OCwoLDg8KCw4LChcODwoPDgsKDw4PCgsOCwq10SmgoT03Dg8KDw4LCgsODwoLDg
- sKLw4PCg8OCwoPDg8KCw4LCjcODwoPDgsKDw4PCgsOCwqggTMODwoPDgsKCw4PCgsOCwoXDg8KDw4
- LCg8ODwoLDgsKAdDrDg8KDw4LCgsODwoLDgsKNRCTDg8KDw4LCgsODwoLDgsKLTSBQUcODwoPDgsK
- Dw4PCgsOCwr/Dg8KDw4LCg8ODwoLDgsKMw4PCg8OCwoLDg8KCw4LCik/Dg8KDw4LCgsODwoLDgsKL
- RCQoZitEJCDDg8KDw4LCgsODwoLDgsK3w4PCg8OCwoPDg8KCw4LCiMODwoPDgsKDw4PCgsOCwoHDg
- 8KDw4LCg8ODwoLDgsKhw4PCg8OCwoLDg8KCw4LCi0QkJGYrRCTDg8KDw4LCgsODwoLDgsK3w4PCg8
- OCwoPDg8KCw4LCkMODwoPDgsKDw4PCgsOCworDg8KDw4LCgsODwoLDgsKLRSBRVmpQw4PCg8OCwoP
- Dg8KCw4LCv8ODwoPDgsKDw4PCgsOCwoDDg8KDw4LCgsODwoLDgsKKTzl0JHXDg8KDw4LCgsODwoLD
- gsKhOXQkw4PCg8OCwoLDg8KCw4LChW/Dg8KDw4LCg8ODwoLDgsK/w4PCg8OCwoPDg8KCw4LCv8ODw
- oPDgsKDw4PCgsOCwr/Dg8KDw4LCgsODwoLDgsKhRMODwoPDgsKDw4PCgsOCwoVOw4PCg8OCwoLDg8
- KCw4LCi8ODwoPDgsKDw4PCgsOCwojDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoPDg8KCw4LCv1Ncw4P
- Cg8OCwoLDg8KCw4LCiUQkw4PCg8OCwoLDg8KCw4LChcODwoPDgsKDw4PCgsOCwoDDg8KDw4LCgsOD
- woLDgsKEw4PCg8OCwoPDg8KCw4LCtjPDg8KDw4LCg8ODwoLDgsK2w4PCg8OCwoLDg8KCw4LCjUQkw
- 4PCg8OCwoLDg8KCw4LCiyBEw4PCg8OCwoPDg8KCw4LChU5Qw4PCg8OCwoLDg8KCw4LCi8ODwoPDgs
- KDw4PCgsOCwr9TYMODwoPDgsKCw4PCgsOCwovDg8KDw4LCg8ODwoLDgsK4w4PCg8OCwoLDg8KCw4L
- ChcODwoPDgsKDw4PCgsOCwr/Dg8KDw4LCgsODwoLDgsKEw4PCg8OCwoPDg8KCw4LCkMODwoPDgsKC
- w4PCgsOCwovDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoPDg8KCw4LCj8ODwoPDgsKDw4PCgsOCwr9Ta
- MODwoPDgsKCw4PCgsOCwolEJDvDg8KDw4LCg8ODwoLDgsKGw4PCg8OCwoLDg8KCw4LChMODwoPDgs
- KCw4PCgsOCwr3Dg8KDw4LCgsODwoLDgsKNRCTDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoPDg8KCw4L
- Cj1DDg8KDw4LCg8ODwoLDgsK/U2zDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoPDg8KCw4LCqMODwoPD
- gsKCw4PCgsOCwoXDg8KDw4LCg8ODwoLDgsKtw4PCg8OCwoLDg8KCw4LChMODwoPDgsKCw4PCgsOCw
- p9oMMODwoPDgsKDw4PCgsOCwolMw4PCg8OCwoLDg8KCw4LCi8ODwoPDgsKDw4PCgsOCwo3Dg8KDw4
- LCg8ODwoLDgsKow4PCg8OCwoPDg8KCw4LCq0vDg8KDw4LCgsODwoLDgsKFw4PCg8OCwoPDg8KCw4L
- CgMODwoPDgsKCw4PCgsOCwoTDg8KDw4LCgsODwoLDgsKLw4PCg8OCwoLDg8KCw4LCi0QkOcODwoPD
- gsKCw4PCgsOCwrDDg8KDw4LCg8ODwoLDgsKEdEU5w4PCg8OCwoLDg8KCw4LCtTR0PcODwoPDgsKCw
- 4PCgsOCwovDg8KDw4LCg8ODwoLDgsKNw4PCg8OCwoPDg8KCw4LCqMODwoPDgsKDw4PCgsOCwo5Lw4
- PCg8OCwoLDg8KCw4LCi0AgUMODwoPDgsKDw4PCgsOCwr/Dg8KDw4LCgsODwoLDgsKsw4PCg8OCwoL
- Dg8KCw4LCik/Dg8KDw4LCgsODwoLDgsKFw4PCg8OCwoPDg8KCw4LCgHUow4PCg8OCwoLDg8KCw4LC
- i8ODwoPDgsKDw4PCgsOCwo3Dg8KDw4LCgsODwoLDgsKJw4PCg8OCwoLDg8KCw4LCtTTDg8KDw4LCg
- 8ODwoLDgsKow4PCg8OCwoPDg8KCw4LCl8ODwoPDgsKDw4PCgsOCwrtWw4PCg8OCwoLDg8KCw4LCi8
- ODwoPDgsKDw4PCgsOCwo3Dg8KDw4LCg8ODwoLDgsKow4PCg8OCwoLDg8KCw4LCnw==
-
-#LEAD COMMENT
-
-# another comment
-dn: CN=All Staff,ou=Groups,o=University of Michigan,c=TEST
-#EMBEDDED COMMENT
-member: cn=Manager,o=University of Michigan,c=TEST
-member: cn=Barbara Jensen,ou=Information Technology Division,ou=People,o=Unive
- rsity of Michigan,c=TEST
-member: cn=Jane Doe,ou=Alumni Association,ou=People,o=University of Michigan,c
- =US
-member: cn=John Doe,ou=Information Technology Division,ou=People,o=University
- of Michigan,c=TEST
-member: cn=Mark Elliot,ou=Alumni Association,ou=People,o=University of Michiga
- n,c=TEST
-member: cn=James A Jones 1,ou=Alumni Association,ou=People,o=University of Mic
- higan,c=TEST
-member: cn=James A Jones 2,ou=Information Technology Division,ou=People,o=Univ
- ersity of Michigan,c=TEST
-member: cn=Jennifer Smith,ou=Alumni Association,ou=People,o=University of Mich
- igan,c=TEST
-member: cn=Dorothy Stevens,ou=Alumni Association,ou=People,o=University of Mic
- higan,c=TEST
-member: cn=Ursula Hampster,ou=Alumni Association,ou=People,o=University of Mic
- higan,c=TEST
-member: cn=Bjorn Jensen,ou=Information Technology Division,ou=People,o=Univers
- ity of Michigan,c=TEST
-owner: cn=Manager,o=University of Michigan,c=TEST
-cn: All Staff
-description: Everyone in the sample data
-objectclass: groupofnames
-
-dn: cn=Alumni Assoc Staff,ou=Groups,o=University of Michigan,c=TEST
-member: cn=Manager,o=University of Michigan,c=TEST
-member: cn=Dorothy Stevens,ou=Alumni Association,ou=People,o=University of Mic
- higan,c=TEST
-member: cn=James A Jones 1,ou=Alumni Association,ou=People,o=University of Mic
- higan,c=TEST
-member: cn=Jane Doe,ou=Alumni Association,ou=People,o=University of Michigan,c
- =US
-member: cn=Jennifer Smith,ou=Alumni Association,ou=People,o=University of Mich
- igan,c=TEST
-member: cn=Mark Elliot,ou=Alumni Association,ou=People,o=University of Michiga
- n,c=TEST
-member: cn=Ursula Hampster,ou=Alumni Association,ou=People,o=University of Mic
- higan,c=TEST
-owner: cn=Manager,o=University of Michigan,c=TEST
-description: All Alumni Assoc Staff
-cn: Alumni Assoc Staff
-objectclass: groupofnames
-
-dn: ou=Alumni Association,ou=People,o=University of Michigan,c=TEST
-objectclass: organizationalUnit
-ou: Alumni Association
-
-dn: cn=Barbara Jensen,ou=Information Technology Division,ou=People,o=Universit
- y of Michigan,c=TEST
-objectclass: OpenLDAPperson
-cn: Barbara Jensen
-cn: Babs Jensen
-sn:: IEplbnNlbiA=
-uid:: YmplCW5zZW4
-title: Mythical Manager, Research Systems
-postaladdress: ITD Prod Dev & Deployment $ 535 W. William St. Room 4212 $ Ann
- Arbor, MI 48103-4943
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-userpassword:: YmplbnNlbg==
-mail: bjensen@mailgw.example.com
-homepostaladdress: 123 Wesley $ Ann Arbor, MI 48103
-description: Mythical manager of the rsdd unix project
-drink: water
-homephone: +1 313 555 2333
-pager: +1 313 555 3233
-facsimiletelephonenumber: +1 313 555 2274
-telephonenumber: +1 313 555 9022
-
-dn: cn=Bjorn Jensen,ou=Information Technology Division,ou=People,o=University
- of Michigan,c=TEST
-objectclass: OpenLDAPperson
-cn: Bjorn Jensen
-cn: Biiff Jensen
-sn: Jensen
-uid: bjorn
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-userpassword:: Ympvcm4=
-homepostaladdress: 19923 Seven Mile Rd. $ South Lyon, MI 49999
-drink: Iced Tea
-description: Hiker, biker
-title: Director, Embedded Systems
-postaladdress: Info Tech Division $ 535 W. William St. $ Ann Arbor, MI 48103
-mail: bjorn@mailgw.example.com
-homephone: +1 313 555 5444
-pager: +1 313 555 4474
-facsimiletelephonenumber: +1 313 555 2177
-telephonenumber: +1 313 555 0355
-
-dn: cn=Dorothy Stevens,ou=Alumni Association,ou=People,o=University of Michiga
- n,c=TEST
-objectclass: OpenLDAPperson
-cn: Dorothy Stevens
-cn: Dot Stevens
-sn: Stevens
-uid: dots
-title: Secretary, UM Alumni Association
-postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-drink: Lemonade
-homepostaladdress: 377 White St. Apt. 3 $ Ann Arbor, MI 48104
-description: Very tall
-facsimiletelephonenumber: +1 313 555 3223
-telephonenumber: +1 313 555 3664
-mail: dots@mail.alumni.example.com
-homephone: +1 313 555 0454
-
-dn: cn=ITD Staff,ou=Groups,o=University of Michigan,c=TEST
-owner: cn=Manager,o=University of Michigan,c=TEST
-description: All ITD Staff
-cn: ITD Staff
-objectclass: groupofuniquenames
-uniquemember: cn=Manager,o=University of Michigan,c=TEST
-uniquemember: cn=Bjorn Jensen,ou=Information Technology Division,ou=People,o=U
- niversity of Michigan,c=TEST
-uniquemember: cn=James A Jones 2,ou=Information Technology Division,ou=People,
- o=University of Michigan,c=TEST
-uniquemember: cn=John Doe,ou=Information Technology Division,ou=People,o=Unive
- rsity of Michigan,c=TEST
-
-dn: cn=James A Jones 1,ou=Alumni Association,ou=People,o=University of Michiga
- n,c=TEST
-objectclass: OpenLDAPperson
-cn: James A Jones 1
-cn: James Jones
-cn: Jim Jones
-sn: Jones
-uid: jaj
-postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-userpassword:: amFq
-homepostaladdress: 3882 Beverly Rd. $ Ann Arbor, MI 48105
-homephone: +1 313 555 4772
-description: Outstanding
-title: Mad Cow Researcher, UM Alumni Association
-pager: +1 313 555 3923
-mail: jaj@mail.alumni.example.com
-facsimiletelephonenumber: +1 313 555 4332
-telephonenumber: +1 313 555 0895
-
-dn: cn=James A Jones 2,ou=Information Technology Division,ou=People,o=Universi
- ty of Michigan,c=TEST
-objectclass: OpenLDAPperson
-cn: James A Jones 2
-cn: James Jones
-cn: Jim Jones
-sn: Doe
-uid: jjones
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-homepostaladdress: 933 Brooks $ Ann Arbor, MI 48104
-homephone: +1 313 555 8838
-title: Senior Manager, Information Technology Division
-description: Not around very much
-mail: jjones@mailgw.example.com
-postaladdress: Info Tech Division $ 535 W William $ Ann Arbor, MI 48103
-pager: +1 313 555 2833
-facsimiletelephonenumber: +1 313 555 8688
-telephonenumber: +1 313 555 7334
-
-dn: cn=Jane Doe,ou=Alumni Association,ou=People,o=University of Michigan,c=TEST
-objectclass: OpenLDAPperson
-cn: Jane Doe
-cn: Jane Alverson
-sn: Doe
-uid: jdoe
-title: Programmer Analyst, UM Alumni Association
-postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-homepostaladdress: 123 Anystreet $ Ann Arbor, MI 48104
-drink: diet coke
-description: Enthusiastic
-mail: jdoe@woof.net
-homephone: +1 313 555 5445
-pager: +1 313 555 1220
-facsimiletelephonenumber: +1 313 555 2311
-telephonenumber: +1 313 555 4774
-
-dn: cn=Jennifer Smith,ou=Alumni Association,ou=People,o=University of Michigan
- ,c=TEST
-objectclass: OpenLDAPperson
-cn: Jennifer Smith
-cn: Jen Smith
-sn: Smith
-uid: jen
-postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-drink: Sam Adams
-homepostaladdress: 1000 Maple #44 $ Ann Arbor, MI 48103
-title: Telemarketer, UM Alumni Association
-mail: jen@mail.alumni.example.com
-homephone: +1 313 555 2333
-pager: +1 313 555 6442
-facsimiletelephonenumber: +1 313 555 2756
-telephonenumber: +1 313 555 8232
-
-dn: cn=John Doe,ou=Information Technology Division,ou=People,o=University of M
- ichigan,c=TEST
-objectclass: OpenLDAPperson
-cn: John Doe
-cn: Jonathon Doe
-sn: Doe
-uid: johnd
-postaladdress: ITD $ 535 W. William $ Ann Arbor, MI 48109
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-homepostaladdress: 912 East Bllvd $ Ann Arbor, MI 48104
-title: System Administrator, Information Technology Division
-description: overworked!
-mail: johnd@mailgw.example.com
-homephone: +1 313 555 3774
-pager: +1 313 555 6573
-facsimiletelephonenumber: +1 313 555 4544
-telephonenumber: +1 313 555 9394
-
-dn: cn=Manager,o=University of Michigan,c=TEST
-objectclass: person
-cn: Manager
-cn: Directory Manager
-cn: Dir Man
-sn: Manager
-description: Manager of the directory
-userpassword:: c2VjcmV0
-
-dn: cn=Mark Elliot,ou=Alumni Association,ou=People,o=University of Michigan,c=
- TEST
-objectclass: OpenLDAPperson
-cn: Mark Elliot
-cn: Mark A Elliot
-sn: Elliot
-uid: melliot
-postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-homepostaladdress: 199 Outer Drive $ Ypsilanti, MI 48198
-homephone: +1 313 555 0388
-drink: Gasoline
-title: Director, UM Alumni Association
-mail: melliot@mail.alumni.example.com
-pager: +1 313 555 7671
-facsimiletelephonenumber: +1 313 555 7762
-telephonenumber: +1 313 555 4177
-
-dn: cn=Ursula Hampster,ou=Alumni Association,ou=People,o=University of Michiga
- n,c=TEST
-objectclass: OpenLDAPperson
-cn: Ursula Hampster
-sn: Hampster
-uid: uham
-title: Secretary, UM Alumni Association
-postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109
-seealso: cn=All Staff,ou=Groups,o=University of Michigan,c=TEST
-homepostaladdress: 123 Anystreet $ Ann Arbor, MI 48104
-mail: uham@mail.alumni.example.com
-description: a long attribute name, longer than 128 bytes so that we
- trigger sign extension problems in tdb_pack, no thats not long enough
- yet, maybe this is. I'll just keep going till it triggers the error
-homephone: +1 313 555 8421
-pager: +1 313 555 2844
-facsimiletelephonenumber: +1 313 555 9700
-telephonenumber: +1 313 555 5331
-
-dn: cn=Fred Bassett,ou=Alumni Association,ou=People,o=University of Michigan,c=TEST
-objectclass: OpenLDAPperson
-cn: Fred Bassett
-sn: Bassett
-uid: Bassett, Fred
diff --git a/source4/lib/ldb/tests/testdata.txt b/source4/lib/ldb/tests/testdata.txt
deleted file mode 100644
index dadb9f0f98..0000000000
--- a/source4/lib/ldb/tests/testdata.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-foo=bar5
-(&(|(a=b)(c=d))(e=f))
-(&(|(a=b)(c=d)(g=h))(e=f))
-name=firstname lastname
-(&(sid=S-1-2-3)(name = fred bloggs))
-(&(|(a=b)(c=d))(g=f))
-(&(sid=S-1-2-3)(!(name = fred bloggs)))
-(&(!(|(a=b)(c=d))(g=f)))
diff --git a/source4/lib/ldb/tests/testsearch.txt b/source4/lib/ldb/tests/testsearch.txt
deleted file mode 100644
index c5738639b7..0000000000
--- a/source4/lib/ldb/tests/testsearch.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-(blah=foo)
-(objectclass=person)
-(dn=*)
-(&(objectclass=person)(objectclass=person))
-(&(objectclass=person)(objectclass=personx))
diff --git a/source4/lib/ldb/tools/cmdline.c b/source4/lib/ldb/tools/cmdline.c
deleted file mode 100644
index a06445fc0f..0000000000
--- a/source4/lib/ldb/tools/cmdline.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- ldb database library - command line handling for ldb tools
-
- Copyright (C) Andrew Tridgell 2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb.h"
-#include "ldb_module.h"
-#include "tools/cmdline.h"
-
-static struct ldb_cmdline options; /* needs to be static for older compilers */
-
-enum ldb_cmdline_options { CMDLINE_RELAX=1 };
-
-static struct poptOption builtin_popt_options[] = {
- POPT_AUTOHELP
- { "url", 'H', POPT_ARG_STRING, &options.url, 0, "database URL", "URL" },
- { "basedn", 'b', POPT_ARG_STRING, &options.basedn, 0, "base DN", "DN" },
- { "editor", 'e', POPT_ARG_STRING, &options.editor, 0, "external editor", "PROGRAM" },
- { "scope", 's', POPT_ARG_STRING, NULL, 's', "search scope", "SCOPE" },
- { "verbose", 'v', POPT_ARG_NONE, NULL, 'v', "increase verbosity", NULL },
- { "trace", 0, POPT_ARG_NONE, &options.tracing, 0, "enable tracing", NULL },
- { "interactive", 'i', POPT_ARG_NONE, &options.interactive, 0, "input from stdin", NULL },
- { "recursive", 'r', POPT_ARG_NONE, &options.recursive, 0, "recursive delete", NULL },
- { "modules-path", 0, POPT_ARG_STRING, &options.modules_path, 0, "modules path", "PATH" },
- { "num-searches", 0, POPT_ARG_INT, &options.num_searches, 0, "number of test searches", NULL },
- { "num-records", 0, POPT_ARG_INT, &options.num_records, 0, "number of test records", NULL },
- { "all", 'a', POPT_ARG_NONE, &options.all_records, 0, "(|(objectClass=*)(distinguishedName=*))", NULL },
- { "nosync", 0, POPT_ARG_NONE, &options.nosync, 0, "non-synchronous transactions", NULL },
- { "sorted", 'S', POPT_ARG_NONE, &options.sorted, 0, "sort attributes", NULL },
- { NULL, 'o', POPT_ARG_STRING, NULL, 'o', "ldb_connect option", "OPTION" },
- { "controls", 0, POPT_ARG_STRING, NULL, 'c', "controls", NULL },
- { "show-binary", 0, POPT_ARG_NONE, &options.show_binary, 0, "display binary LDIF", NULL },
- { "paged", 0, POPT_ARG_NONE, NULL, 'P', "use a paged search", NULL },
- { "show-deleted", 0, POPT_ARG_NONE, NULL, 'D', "show deleted objects", NULL },
- { "show-recycled", 0, POPT_ARG_NONE, NULL, 'R', "show recycled objects", NULL },
- { "show-deactivated-link", 0, POPT_ARG_NONE, NULL, 'd', "show deactivated links", NULL },
- { "reveal", 0, POPT_ARG_NONE, NULL, 'r', "reveal ldb internals", NULL },
- { "relax", 0, POPT_ARG_NONE, NULL, CMDLINE_RELAX, "pass relax control", NULL },
- { "cross-ncs", 0, POPT_ARG_NONE, NULL, 'N', "search across NC boundaries", NULL },
- { "extended-dn", 0, POPT_ARG_NONE, NULL, 'E', "show extended DNs", NULL },
- { NULL }
-};
-
-void ldb_cmdline_help(struct ldb_context *ldb, const char *cmdname, FILE *f)
-{
- poptContext pc;
- struct poptOption **popt_options = ldb_module_popt_options(ldb);
- pc = poptGetContext(cmdname, 0, NULL, *popt_options,
- POPT_CONTEXT_KEEP_FIRST);
- poptPrintHelp(pc, f, 0);
-}
-
-/*
- add a control to the options structure
- */
-static bool add_control(TALLOC_CTX *mem_ctx, const char *control)
-{
- unsigned int i;
-
- /* count how many controls we already have */
- for (i=0; options.controls && options.controls[i]; i++) ;
-
- options.controls = talloc_realloc(mem_ctx, options.controls, const char *, i + 2);
- if (options.controls == NULL) {
- return false;
- }
- options.controls[i] = control;
- options.controls[i+1] = NULL;
- return true;
-}
-
-/**
- process command line options
-*/
-struct ldb_cmdline *ldb_cmdline_process(struct ldb_context *ldb,
- int argc, const char **argv,
- void (*usage)(struct ldb_context *))
-{
- struct ldb_cmdline *ret=NULL;
- poptContext pc;
- int num_options = 0;
- int opt;
- unsigned int flags = 0;
- int rc;
- struct poptOption **popt_options;
-
- /* make the ldb utilities line buffered */
- setlinebuf(stdout);
-
- ret = talloc_zero(ldb, struct ldb_cmdline);
- if (ret == NULL) {
- fprintf(stderr, "Out of memory!\n");
- goto failed;
- }
-
- options = *ret;
-
- /* pull in URL */
- options.url = getenv("LDB_URL");
-
- /* and editor (used by ldbedit) */
- options.editor = getenv("VISUAL");
- if (!options.editor) {
- options.editor = getenv("EDITOR");
- }
- if (!options.editor) {
- options.editor = "vi";
- }
-
- options.scope = LDB_SCOPE_DEFAULT;
-
- popt_options = ldb_module_popt_options(ldb);
- (*popt_options) = builtin_popt_options;
-
- rc = ldb_modules_hook(ldb, LDB_MODULE_HOOK_CMDLINE_OPTIONS);
- if (rc != LDB_SUCCESS) {
- fprintf(stderr, "ldb: failed to run command line hooks : %s\n", ldb_strerror(rc));
- goto failed;
- }
-
- pc = poptGetContext(argv[0], argc, argv, *popt_options,
- POPT_CONTEXT_KEEP_FIRST);
-
- while((opt = poptGetNextOpt(pc)) != -1) {
- switch (opt) {
- case 's': {
- const char *arg = poptGetOptArg(pc);
- if (strcmp(arg, "base") == 0) {
- options.scope = LDB_SCOPE_BASE;
- } else if (strcmp(arg, "sub") == 0) {
- options.scope = LDB_SCOPE_SUBTREE;
- } else if (strcmp(arg, "one") == 0) {
- options.scope = LDB_SCOPE_ONELEVEL;
- } else {
- fprintf(stderr, "Invalid scope '%s'\n", arg);
- goto failed;
- }
- break;
- }
-
- case 'v':
- options.verbose++;
- break;
-
- case 'o':
- options.options = talloc_realloc(ret, options.options,
- const char *, num_options+3);
- if (options.options == NULL) {
- fprintf(stderr, "Out of memory!\n");
- goto failed;
- }
- options.options[num_options] = poptGetOptArg(pc);
- options.options[num_options+1] = NULL;
- num_options++;
- break;
-
- case 'c': {
- const char *cs = poptGetOptArg(pc);
- const char *p;
-
- for (p = cs; p != NULL; ) {
- const char *t, *c;
-
- t = strchr(p, ',');
- if (t == NULL) {
- c = talloc_strdup(options.controls, p);
- p = NULL;
- } else {
- c = talloc_strndup(options.controls, p, t-p);
- p = t + 1;
- }
- if (c == NULL || !add_control(ret, c)) {
- fprintf(stderr, __location__ ": out of memory\n");
- goto failed;
- }
- }
-
- break;
- }
- case 'P':
- if (!add_control(ret, "paged_results:1:1024")) {
- fprintf(stderr, __location__ ": out of memory\n");
- goto failed;
- }
- break;
- case 'D':
- if (!add_control(ret, "show_deleted:1")) {
- fprintf(stderr, __location__ ": out of memory\n");
- goto failed;
- }
- break;
- case 'R':
- if (!add_control(ret, "show_recycled:0")) {
- fprintf(stderr, __location__ ": out of memory\n");
- goto failed;
- }
- break;
- case 'd':
- if (!add_control(ret, "show_deactivated_link:0")) {
- fprintf(stderr, __location__ ": out of memory\n");
- goto failed;
- }
- break;
- case 'r':
- if (!add_control(ret, "reveal_internals:0")) {
- fprintf(stderr, __location__ ": out of memory\n");
- goto failed;
- }
- break;
- case CMDLINE_RELAX:
- if (!add_control(ret, "relax:0")) {
- fprintf(stderr, __location__ ": out of memory\n");
- goto failed;
- }
- break;
- case 'N':
- if (!add_control(ret, "search_options:1:2")) {
- fprintf(stderr, __location__ ": out of memory\n");
- goto failed;
- }
- break;
- case 'E':
- if (!add_control(ret, "extended_dn:1:1")) {
- fprintf(stderr, __location__ ": out of memory\n");
- goto failed;
- }
- break;
- default:
- fprintf(stderr, "Invalid option %s: %s\n",
- poptBadOption(pc, 0), poptStrerror(opt));
- if (usage) usage(ldb);
- goto failed;
- }
- }
-
- /* setup the remaining options for the main program to use */
- options.argv = poptGetArgs(pc);
- if (options.argv) {
- options.argv++;
- while (options.argv[options.argc]) options.argc++;
- }
-
- *ret = options;
-
- /* all utils need some option */
- if (ret->url == NULL) {
- fprintf(stderr, "You must supply a url with -H or with $LDB_URL\n");
- if (usage) usage(ldb);
- goto failed;
- }
-
- if (strcmp(ret->url, "NONE") == 0) {
- return ret;
- }
-
- if (options.nosync) {
- flags |= LDB_FLG_NOSYNC;
- }
-
- if (options.show_binary) {
- flags |= LDB_FLG_SHOW_BINARY;
- }
-
- if (options.tracing) {
- flags |= LDB_FLG_ENABLE_TRACING;
- }
-
- if (options.modules_path != NULL) {
- ldb_set_modules_dir(ldb, options.modules_path);
- }
-
- rc = ldb_modules_hook(ldb, LDB_MODULE_HOOK_CMDLINE_PRECONNECT);
- if (rc != LDB_SUCCESS) {
- fprintf(stderr, "ldb: failed to run preconnect hooks : %s\n", ldb_strerror(rc));
- goto failed;
- }
-
- /* now connect to the ldb */
- if (ldb_connect(ldb, ret->url, flags, ret->options) != LDB_SUCCESS) {
- fprintf(stderr, "Failed to connect to %s - %s\n",
- ret->url, ldb_errstring(ldb));
- goto failed;
- }
-
- rc = ldb_modules_hook(ldb, LDB_MODULE_HOOK_CMDLINE_POSTCONNECT);
- if (rc != LDB_SUCCESS) {
- fprintf(stderr, "ldb: failed to run post connect hooks : %s\n", ldb_strerror(rc));
- goto failed;
- }
-
- return ret;
-
-failed:
- talloc_free(ret);
- exit(LDB_ERR_OPERATIONS_ERROR);
- return NULL;
-}
-
-/* this function check controls reply and determines if more
- * processing is needed setting up the request controls correctly
- *
- * returns:
- * -1 error
- * 0 all ok
- * 1 all ok, more processing required
- */
-int handle_controls_reply(struct ldb_control **reply, struct ldb_control **request)
-{
- unsigned int i, j;
- int ret = 0;
-
- if (reply == NULL || request == NULL) return -1;
-
- for (i = 0; reply[i]; i++) {
- if (strcmp(LDB_CONTROL_VLV_RESP_OID, reply[i]->oid) == 0) {
- struct ldb_vlv_resp_control *rep_control;
-
- rep_control = talloc_get_type(reply[i]->data, struct ldb_vlv_resp_control);
-
- /* check we have a matching control in the request */
- for (j = 0; request[j]; j++) {
- if (strcmp(LDB_CONTROL_VLV_REQ_OID, request[j]->oid) == 0)
- break;
- }
- if (! request[j]) {
- fprintf(stderr, "Warning VLV reply received but no request have been made\n");
- continue;
- }
-
- /* check the result */
- if (rep_control->vlv_result != 0) {
- fprintf(stderr, "Warning: VLV not performed with error: %d\n", rep_control->vlv_result);
- } else {
- fprintf(stderr, "VLV Info: target position = %d, content count = %d\n", rep_control->targetPosition, rep_control->contentCount);
- }
-
- continue;
- }
-
- if (strcmp(LDB_CONTROL_ASQ_OID, reply[i]->oid) == 0) {
- struct ldb_asq_control *rep_control;
-
- rep_control = talloc_get_type(reply[i]->data, struct ldb_asq_control);
-
- /* check the result */
- if (rep_control->result != 0) {
- fprintf(stderr, "Warning: ASQ not performed with error: %d\n", rep_control->result);
- }
-
- continue;
- }
-
- if (strcmp(LDB_CONTROL_PAGED_RESULTS_OID, reply[i]->oid) == 0) {
- struct ldb_paged_control *rep_control, *req_control;
-
- rep_control = talloc_get_type(reply[i]->data, struct ldb_paged_control);
- if (rep_control->cookie_len == 0) /* we are done */
- break;
-
- /* more processing required */
- /* let's fill in the request control with the new cookie */
-
- for (j = 0; request[j]; j++) {
- if (strcmp(LDB_CONTROL_PAGED_RESULTS_OID, request[j]->oid) == 0)
- break;
- }
- /* if there's a reply control we must find a request
- * control matching it */
- if (! request[j]) return -1;
-
- req_control = talloc_get_type(request[j]->data, struct ldb_paged_control);
-
- if (req_control->cookie)
- talloc_free(req_control->cookie);
- req_control->cookie = (char *)talloc_memdup(
- req_control, rep_control->cookie,
- rep_control->cookie_len);
- req_control->cookie_len = rep_control->cookie_len;
-
- ret = 1;
-
- continue;
- }
-
- if (strcmp(LDB_CONTROL_SORT_RESP_OID, reply[i]->oid) == 0) {
- struct ldb_sort_resp_control *rep_control;
-
- rep_control = talloc_get_type(reply[i]->data, struct ldb_sort_resp_control);
-
- /* check we have a matching control in the request */
- for (j = 0; request[j]; j++) {
- if (strcmp(LDB_CONTROL_SERVER_SORT_OID, request[j]->oid) == 0)
- break;
- }
- if (! request[j]) {
- fprintf(stderr, "Warning Server Sort reply received but no request found\n");
- continue;
- }
-
- /* check the result */
- if (rep_control->result != 0) {
- fprintf(stderr, "Warning: Sorting not performed with error: %d\n", rep_control->result);
- }
-
- continue;
- }
-
- if (strcmp(LDB_CONTROL_DIRSYNC_OID, reply[i]->oid) == 0) {
- struct ldb_dirsync_control *rep_control, *req_control;
- char *cookie;
-
- rep_control = talloc_get_type(reply[i]->data, struct ldb_dirsync_control);
- if (rep_control->cookie_len == 0) /* we are done */
- break;
-
- /* more processing required */
- /* let's fill in the request control with the new cookie */
-
- for (j = 0; request[j]; j++) {
- if (strcmp(LDB_CONTROL_DIRSYNC_OID, request[j]->oid) == 0)
- break;
- }
- /* if there's a reply control we must find a request
- * control matching it */
- if (! request[j]) return -1;
-
- req_control = talloc_get_type(request[j]->data, struct ldb_dirsync_control);
-
- if (req_control->cookie)
- talloc_free(req_control->cookie);
- req_control->cookie = (char *)talloc_memdup(
- req_control, rep_control->cookie,
- rep_control->cookie_len);
- req_control->cookie_len = rep_control->cookie_len;
-
- cookie = ldb_base64_encode(req_control, rep_control->cookie, rep_control->cookie_len);
- printf("# DIRSYNC cookie returned was:\n# %s\n", cookie);
-
- continue;
- }
-
- /* no controls matched, throw a warning */
- fprintf(stderr, "Unknown reply control oid: %s\n", reply[i]->oid);
- }
-
- return ret;
-}
-
diff --git a/source4/lib/ldb/tools/cmdline.h b/source4/lib/ldb/tools/cmdline.h
deleted file mode 100644
index 416bf51d22..0000000000
--- a/source4/lib/ldb/tools/cmdline.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- ldb database library - command line handling for ldb tools
-
- Copyright (C) Andrew Tridgell 2005
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <popt.h>
-
-struct ldb_cmdline {
- const char *url;
- enum ldb_scope scope;
- const char *basedn;
- const char *modules_path;
- int interactive;
- int sorted;
- const char *editor;
- int verbose;
- int recursive;
- int all_records;
- int nosync;
- const char **options;
- int argc;
- const char **argv;
- int num_records;
- int num_searches;
- const char *sasl_mechanism;
- const char **controls;
- int show_binary;
- int tracing;
-};
-
-struct ldb_cmdline *ldb_cmdline_process(struct ldb_context *ldb, int argc,
- const char **argv,
- void (*usage)(struct ldb_context *));
-
-
-int handle_controls_reply(struct ldb_control **reply, struct ldb_control **request);
-void ldb_cmdline_help(struct ldb_context *ldb, const char *cmdname, FILE *f);
-
diff --git a/source4/lib/ldb/tools/ldbadd.c b/source4/lib/ldb/tools/ldbadd.c
deleted file mode 100644
index 47fd261841..0000000000
--- a/source4/lib/ldb/tools/ldbadd.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldbadd
- *
- * Description: utility to add records - modelled on ldapadd
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb.h"
-#include "tools/cmdline.h"
-#include "ldbutil.h"
-
-static unsigned int failures;
-static struct ldb_cmdline *options;
-
-static void usage(struct ldb_context *ldb)
-{
- printf("Usage: ldbadd <options> <ldif...>\n");
- printf("Adds records to a ldb, reading ldif the specified list of files\n\n");
- ldb_cmdline_help(ldb, "ldbadd", stdout);
- exit(LDB_ERR_OPERATIONS_ERROR);
-}
-
-
-/*
- add records from an opened file
-*/
-static int process_file(struct ldb_context *ldb, FILE *f, unsigned int *count)
-{
- struct ldb_ldif *ldif;
- int fun_ret = LDB_SUCCESS, ret;
- struct ldb_control **req_ctrls = ldb_parse_control_strings(ldb, ldb, (const char **)options->controls);
- if (options->controls != NULL && req_ctrls== NULL) {
- printf("parsing controls failed: %s\n", ldb_errstring(ldb));
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
-
- while ((ldif = ldb_ldif_read_file(ldb, f))) {
- if (ldif->changetype != LDB_CHANGETYPE_ADD &&
- ldif->changetype != LDB_CHANGETYPE_NONE) {
- fprintf(stderr, "Only CHANGETYPE_ADD records allowed\n");
- break;
- }
-
- ret = ldb_msg_normalize(ldb, ldif, ldif->msg, &ldif->msg);
- if (ret != LDB_SUCCESS) {
- fprintf(stderr,
- "ERR: Message canonicalize failed - %s\n",
- ldb_strerror(ret));
- failures++;
- fun_ret = ret;
- ldb_ldif_read_free(ldb, ldif);
- continue;
- }
-
- ret = ldb_add_ctrl(ldb, ldif->msg,req_ctrls);
- if (ret != LDB_SUCCESS) {
- fprintf(stderr, "ERR: %s : \"%s\" on DN %s\n",
- ldb_strerror(ret), ldb_errstring(ldb),
- ldb_dn_get_linearized(ldif->msg->dn));
- failures++;
- fun_ret = ret;
- } else {
- (*count)++;
- if (options->verbose) {
- printf("Added %s\n", ldb_dn_get_linearized(ldif->msg->dn));
- }
- }
- ldb_ldif_read_free(ldb, ldif);
- }
-
- return fun_ret;
-}
-
-
-
-int main(int argc, const char **argv)
-{
- struct ldb_context *ldb;
- unsigned int i, count = 0;
- int ret = LDB_SUCCESS;
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
-
- ldb = ldb_init(mem_ctx, NULL);
- if (ldb == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- options = ldb_cmdline_process(ldb, argc, argv, usage);
-
- ret = ldb_transaction_start(ldb);
- if (ret != LDB_SUCCESS) {
- printf("Failed to start transaction: %s\n", ldb_errstring(ldb));
- return ret;
- }
-
- if (options->argc == 0) {
- ret = process_file(ldb, stdin, &count);
- } else {
- for (i=0;i<options->argc;i++) {
- const char *fname = options->argv[i];
- FILE *f;
- f = fopen(fname, "r");
- if (!f) {
- perror(fname);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ret = process_file(ldb, f, &count);
- fclose(f);
- }
- }
-
- if (count != 0) {
- ret = ldb_transaction_commit(ldb);
- if (ret != LDB_SUCCESS) {
- printf("Failed to commit transaction: %s\n", ldb_errstring(ldb));
- return ret;
- }
- } else {
- ldb_transaction_cancel(ldb);
- }
-
- talloc_free(mem_ctx);
-
- printf("Added %u records with %u failures\n", count, failures);
-
- return ret;
-}
diff --git a/source4/lib/ldb/tools/ldbdel.c b/source4/lib/ldb/tools/ldbdel.c
deleted file mode 100644
index 8036d09a70..0000000000
--- a/source4/lib/ldb/tools/ldbdel.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldbdel
- *
- * Description: utility to delete records - modelled on ldapdelete
- *
- * Author: Andrew Tridgell
- */
-
-#include "replace.h"
-#include "ldb.h"
-#include "tools/cmdline.h"
-#include "ldbutil.h"
-
-static int dn_cmp(struct ldb_message **msg1, struct ldb_message **msg2)
-{
- return ldb_dn_compare((*msg1)->dn, (*msg2)->dn);
-}
-
-static int ldb_delete_recursive(struct ldb_context *ldb, struct ldb_dn *dn,struct ldb_control **req_ctrls)
-{
- int ret;
- unsigned int i, total=0;
- const char *attrs[] = { NULL };
- struct ldb_result *res;
-
- ret = ldb_search(ldb, ldb, &res, dn, LDB_SCOPE_SUBTREE, attrs, "distinguishedName=*");
- if (ret != LDB_SUCCESS) return ret;
-
- /* sort the DNs, deepest first */
- TYPESAFE_QSORT(res->msgs, res->count, dn_cmp);
-
- for (i = 0; i < res->count; i++) {
- if (ldb_delete_ctrl(ldb, res->msgs[i]->dn,req_ctrls) == LDB_SUCCESS) {
- total++;
- } else {
- printf("Failed to delete '%s' - %s\n",
- ldb_dn_get_linearized(res->msgs[i]->dn),
- ldb_errstring(ldb));
- }
- }
-
- talloc_free(res);
-
- if (total == 0) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- printf("Deleted %u records\n", total);
- return LDB_SUCCESS;
-}
-
-static void usage(struct ldb_context *ldb)
-{
- printf("Usage: ldbdel <options> <DN...>\n");
- printf("Deletes records from a ldb\n\n");
- ldb_cmdline_help(ldb, "ldbdel", stdout);
- exit(LDB_ERR_OPERATIONS_ERROR);
-}
-
-int main(int argc, const char **argv)
-{
- struct ldb_control **req_ctrls;
- struct ldb_cmdline *options;
- struct ldb_context *ldb;
- int ret = 0, i;
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
-
- ldb = ldb_init(mem_ctx, NULL);
- if (ldb == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- options = ldb_cmdline_process(ldb, argc, argv, usage);
-
- if (options->argc < 1) {
- usage(ldb);
- }
-
- req_ctrls = ldb_parse_control_strings(ldb, ldb, (const char **)options->controls);
- if (options->controls != NULL && req_ctrls== NULL) {
- printf("parsing controls failed: %s\n", ldb_errstring(ldb));
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- for (i=0;i<options->argc;i++) {
- struct ldb_dn *dn;
-
- dn = ldb_dn_new(ldb, ldb, options->argv[i]);
- if (dn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- if (options->recursive) {
- ret = ldb_delete_recursive(ldb, dn,req_ctrls);
- } else {
- ret = ldb_delete_ctrl(ldb, dn,req_ctrls);
- if (ret == LDB_SUCCESS) {
- printf("Deleted 1 record\n");
- }
- }
- if (ret != LDB_SUCCESS) {
- printf("delete of '%s' failed - (%s) %s\n",
- ldb_dn_get_linearized(dn),
- ldb_strerror(ret),
- ldb_errstring(ldb));
- }
- }
-
- talloc_free(mem_ctx);
-
- return ret;
-}
diff --git a/source4/lib/ldb/tools/ldbedit.c b/source4/lib/ldb/tools/ldbedit.c
deleted file mode 100644
index aaf6d80352..0000000000
--- a/source4/lib/ldb/tools/ldbedit.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldbedit
- *
- * Description: utility for ldb database editing
- *
- * Author: Andrew Tridgell
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "system/filesys.h"
-#include "ldb.h"
-#include "tools/cmdline.h"
-#include "tools/ldbutil.h"
-
-static struct ldb_cmdline *options;
-
-/*
- debug routine
-*/
-static void ldif_write_msg(struct ldb_context *ldb,
- FILE *f,
- enum ldb_changetype changetype,
- struct ldb_message *msg)
-{
- struct ldb_ldif ldif;
- ldif.changetype = changetype;
- ldif.msg = msg;
- ldb_ldif_write_file(ldb, f, &ldif);
-}
-
-/*
- modify a database record so msg1 becomes msg2
- returns the number of modified elements
-*/
-static int modify_record(struct ldb_context *ldb,
- struct ldb_message *msg1,
- struct ldb_message *msg2,
- struct ldb_control **req_ctrls)
-{
- int ret;
- struct ldb_message *mod;
-
- if (ldb_msg_difference(ldb, ldb, msg1, msg2, &mod) != LDB_SUCCESS) {
- fprintf(stderr, "Failed to calculate message differences\n");
- return -1;
- }
-
- ret = mod->num_elements;
- if (ret == 0) {
- goto done;
- }
-
- if (options->verbose > 0) {
- ldif_write_msg(ldb, stdout, LDB_CHANGETYPE_MODIFY, mod);
- }
-
- if (ldb_modify_ctrl(ldb, mod, req_ctrls) != LDB_SUCCESS) {
- fprintf(stderr, "failed to modify %s - %s\n",
- ldb_dn_get_linearized(msg1->dn), ldb_errstring(ldb));
- ret = -1;
- goto done;
- }
-
-done:
- talloc_free(mod);
- return ret;
-}
-
-/*
- find dn in msgs[]
-*/
-static struct ldb_message *msg_find(struct ldb_context *ldb,
- struct ldb_message **msgs,
- unsigned int count,
- struct ldb_dn *dn)
-{
- unsigned int i;
- for (i=0;i<count;i++) {
- if (ldb_dn_compare(dn, msgs[i]->dn) == 0) {
- return msgs[i];
- }
- }
- return NULL;
-}
-
-/*
- merge the changes in msgs2 into the messages from msgs1
-*/
-static int merge_edits(struct ldb_context *ldb,
- struct ldb_message **msgs1, unsigned int count1,
- struct ldb_message **msgs2, unsigned int count2)
-{
- unsigned int i;
- struct ldb_message *msg;
- int ret;
- unsigned int adds=0, modifies=0, deletes=0;
- struct ldb_control **req_ctrls = ldb_parse_control_strings(ldb, ldb, (const char **)options->controls);
- if (options->controls != NULL && req_ctrls == NULL) {
- fprintf(stderr, "parsing controls failed: %s\n", ldb_errstring(ldb));
- return -1;
- }
-
- if (ldb_transaction_start(ldb) != LDB_SUCCESS) {
- fprintf(stderr, "Failed to start transaction: %s\n", ldb_errstring(ldb));
- return -1;
- }
-
- /* do the adds and modifies */
- for (i=0;i<count2;i++) {
- msg = msg_find(ldb, msgs1, count1, msgs2[i]->dn);
- if (!msg) {
- if (options->verbose > 0) {
- ldif_write_msg(ldb, stdout, LDB_CHANGETYPE_ADD, msgs2[i]);
- }
- if (ldb_add_ctrl(ldb, msgs2[i], req_ctrls) != LDB_SUCCESS) {
- fprintf(stderr, "failed to add %s - %s\n",
- ldb_dn_get_linearized(msgs2[i]->dn),
- ldb_errstring(ldb));
- ldb_transaction_cancel(ldb);
- return -1;
- }
- adds++;
- } else {
- ret = modify_record(ldb, msg, msgs2[i], req_ctrls);
- if (ret != -1) {
- modifies += (unsigned int) ret;
- } else {
- return -1;
- }
- }
- }
-
- /* do the deletes */
- for (i=0;i<count1;i++) {
- msg = msg_find(ldb, msgs2, count2, msgs1[i]->dn);
- if (!msg) {
- if (options->verbose > 0) {
- ldif_write_msg(ldb, stdout, LDB_CHANGETYPE_DELETE, msgs1[i]);
- }
- if (ldb_delete_ctrl(ldb, msgs1[i]->dn, req_ctrls) != LDB_SUCCESS) {
- fprintf(stderr, "failed to delete %s - %s\n",
- ldb_dn_get_linearized(msgs1[i]->dn),
- ldb_errstring(ldb));
- ldb_transaction_cancel(ldb);
- return -1;
- }
- deletes++;
- }
- }
-
- if (ldb_transaction_commit(ldb) != LDB_SUCCESS) {
- fprintf(stderr, "Failed to commit transaction: %s\n", ldb_errstring(ldb));
- return -1;
- }
-
- printf("# %u adds %u modifies %u deletes\n", adds, modifies, deletes);
-
- return 0;
-}
-
-/*
- save a set of messages as ldif to a file
-*/
-static int save_ldif(struct ldb_context *ldb,
- FILE *f, struct ldb_message **msgs, unsigned int count)
-{
- unsigned int i;
-
- fprintf(f, "# editing %u records\n", count);
-
- for (i=0;i<count;i++) {
- struct ldb_ldif ldif;
- fprintf(f, "# record %u\n", i+1);
-
- ldif.changetype = LDB_CHANGETYPE_NONE;
- ldif.msg = msgs[i];
-
- ldb_ldif_write_file(ldb, f, &ldif);
- }
-
- return 0;
-}
-
-
-/*
- edit the ldb search results in msgs using the user selected editor
-*/
-static int do_edit(struct ldb_context *ldb, struct ldb_message **msgs1,
- unsigned int count1, const char *editor)
-{
- int fd, ret;
- FILE *f;
- char file_template[] = "/tmp/ldbedit.XXXXXX";
- char *cmd;
- struct ldb_ldif *ldif;
- struct ldb_message **msgs2 = NULL;
- unsigned int count2 = 0;
-
- /* write out the original set of messages to a temporary
- file */
- fd = mkstemp(file_template);
-
- if (fd == -1) {
- perror(file_template);
- return -1;
- }
-
- f = fdopen(fd, "r+");
-
- if (!f) {
- perror("fopen");
- close(fd);
- unlink(file_template);
- return -1;
- }
-
- if (save_ldif(ldb, f, msgs1, count1) != 0) {
- return -1;
- }
-
- fclose(f);
-
- cmd = talloc_asprintf(ldb, "%s %s", editor, file_template);
-
- if (!cmd) {
- unlink(file_template);
- fprintf(stderr, "out of memory\n");
- return -1;
- }
-
- /* run the editor */
- ret = system(cmd);
- talloc_free(cmd);
-
- if (ret != 0) {
- unlink(file_template);
- fprintf(stderr, "edit with %s failed\n", editor);
- return -1;
- }
-
- /* read the resulting ldif into msgs2 */
- f = fopen(file_template, "r");
- if (!f) {
- perror(file_template);
- return -1;
- }
-
- while ((ldif = ldb_ldif_read_file(ldb, f))) {
- msgs2 = talloc_realloc(ldb, msgs2, struct ldb_message *, count2+1);
- if (!msgs2) {
- fprintf(stderr, "out of memory");
- return -1;
- }
- msgs2[count2++] = ldif->msg;
- }
-
- /* the feof() test works here, even for the last line of the
- * file, as we parse ldif files character by character, and
- * feof() is only true if we have failed to read a character
- * from the file. So if the last line is bad, we don't get
- * feof() set, so we know the record was bad. Only if we
- * attempt to go to the next record will we get feof() and
- * thus consider that the ldif has ended without errors
- */
- if (!feof(f)) {
- fprintf(stderr, "Error parsing ldif - aborting\n");
- fclose(f);
- unlink(file_template);
- return -1;
- }
-
- fclose(f);
- unlink(file_template);
-
- return merge_edits(ldb, msgs1, count1, msgs2, count2);
-}
-
-static void usage(struct ldb_context *ldb)
-{
- printf("Usage: ldbedit <options> <expression> <attributes ...>\n");
- ldb_cmdline_help(ldb, "ldbedit", stdout);
- exit(LDB_ERR_OPERATIONS_ERROR);
-}
-
-int main(int argc, const char **argv)
-{
- struct ldb_context *ldb;
- struct ldb_result *result = NULL;
- struct ldb_dn *basedn = NULL;
- int ret;
- const char *expression = "(|(objectClass=*)(distinguishedName=*))";
- const char * const * attrs = NULL;
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
- struct ldb_control **req_ctrls;
-
- ldb = ldb_init(mem_ctx, NULL);
- if (ldb == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- options = ldb_cmdline_process(ldb, argc, argv, usage);
-
- /* the check for '=' is for compatibility with ldapsearch */
- if (options->argc > 0 &&
- strchr(options->argv[0], '=')) {
- expression = options->argv[0];
- options->argv++;
- options->argc--;
- }
-
- if (options->argc > 0) {
- attrs = (const char * const *)(options->argv);
- }
-
- if (options->basedn != NULL) {
- basedn = ldb_dn_new(ldb, ldb, options->basedn);
- if (basedn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- req_ctrls = ldb_parse_control_strings(ldb, ldb, (const char **)options->controls);
- if (options->controls != NULL && req_ctrls== NULL) {
- printf("parsing controls failed: %s\n", ldb_errstring(ldb));
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_search_ctrl(ldb, ldb, &result, basedn, options->scope, attrs, req_ctrls, "%s", expression);
- if (ret != LDB_SUCCESS) {
- printf("search failed - %s\n", ldb_errstring(ldb));
- return ret;
- }
-
- if (result->count == 0) {
- printf("no matching records - cannot edit\n");
- talloc_free(mem_ctx);
- return LDB_SUCCESS;
- }
-
- ret = do_edit(ldb, result->msgs, result->count, options->editor);
-
- talloc_free(mem_ctx);
-
- return ret == 0 ? LDB_SUCCESS : LDB_ERR_OPERATIONS_ERROR;
-}
diff --git a/source4/lib/ldb/tools/ldbmodify.c b/source4/lib/ldb/tools/ldbmodify.c
deleted file mode 100644
index 2ca7b62b2c..0000000000
--- a/source4/lib/ldb/tools/ldbmodify.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldbmodify
- *
- * Description: utility to modify records - modelled on ldapmodify
- *
- * Author: Andrew Tridgell
- */
-
-#include "ldb.h"
-#include "tools/cmdline.h"
-#include "ldbutil.h"
-
-static unsigned int failures;
-static struct ldb_cmdline *options;
-
-static void usage(struct ldb_context *ldb)
-{
- printf("Usage: ldbmodify <options> <ldif...>\n");
- printf("Modifies a ldb based upon ldif change records\n\n");
- ldb_cmdline_help(ldb, "ldbmodify", stdout);
- exit(LDB_ERR_OPERATIONS_ERROR);
-}
-
-/*
- process modifies for one file
-*/
-static int process_file(struct ldb_context *ldb, FILE *f, unsigned int *count)
-{
- struct ldb_ldif *ldif;
- int fun_ret = LDB_SUCCESS, ret;
- struct ldb_control **req_ctrls = ldb_parse_control_strings(ldb, ldb, (const char **)options->controls);
-
- if (options->controls != NULL && req_ctrls== NULL) {
- printf("parsing controls failed: %s\n", ldb_errstring(ldb));
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- while ((ldif = ldb_ldif_read_file(ldb, f))) {
- struct ldb_dn *olddn;
- bool deleteoldrdn = false;
- struct ldb_dn *newdn;
- const char *errstr = NULL;
-
- switch (ldif->changetype) {
- case LDB_CHANGETYPE_NONE:
- case LDB_CHANGETYPE_ADD:
- ret = ldb_add_ctrl(ldb, ldif->msg,req_ctrls);
- break;
- case LDB_CHANGETYPE_DELETE:
- ret = ldb_delete_ctrl(ldb, ldif->msg->dn,req_ctrls);
- break;
- case LDB_CHANGETYPE_MODIFY:
- ret = ldb_modify_ctrl(ldb, ldif->msg,req_ctrls);
- break;
- case LDB_CHANGETYPE_MODRDN:
- ret = ldb_ldif_parse_modrdn(ldb, ldif, ldif, &olddn,
- NULL, &deleteoldrdn,
- NULL, &newdn);
- if (ret == LDB_SUCCESS) {
- if (deleteoldrdn) {
- ret = ldb_rename(ldb, olddn, newdn);
- } else {
- errstr = "modrdn: deleteoldrdn=0 "
- "not supported.";
- ret = LDB_ERR_CONSTRAINT_VIOLATION;
- }
- }
- break;
- }
- if (ret != LDB_SUCCESS) {
- if (errstr == NULL) {
- errstr = ldb_errstring(ldb);
- }
- fprintf(stderr, "ERR: (%s) \"%s\" on DN %s\n",
- ldb_strerror(ret),
- errstr, ldb_dn_get_linearized(ldif->msg->dn));
- failures++;
- fun_ret = ret;
- } else {
- (*count)++;
- if (options->verbose) {
- printf("Modified %s\n", ldb_dn_get_linearized(ldif->msg->dn));
- }
- }
- ldb_ldif_read_free(ldb, ldif);
- }
-
- if (!feof(f)) {
- fprintf(stderr, "Failed to parse ldif\n");
- fun_ret = LDB_ERR_OPERATIONS_ERROR;
- }
-
- return fun_ret;
-}
-
-int main(int argc, const char **argv)
-{
- struct ldb_context *ldb;
- unsigned int i, count = 0;
- int ret = LDB_SUCCESS;
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
-
- ldb = ldb_init(mem_ctx, NULL);
- if (ldb == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- options = ldb_cmdline_process(ldb, argc, argv, usage);
-
- if (options->argc == 0) {
- ret = process_file(ldb, stdin, &count);
- } else {
- for (i=0;i<options->argc;i++) {
- const char *fname = options->argv[i];
- FILE *f;
- f = fopen(fname, "r");
- if (!f) {
- perror(fname);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- ret = process_file(ldb, f, &count);
- fclose(f);
- }
- }
-
- talloc_free(mem_ctx);
-
- printf("Modified %u records with %u failures\n", count, failures);
-
- return ret;
-}
diff --git a/source4/lib/ldb/tools/ldbrename.c b/source4/lib/ldb/tools/ldbrename.c
deleted file mode 100644
index 9bbd1f06b1..0000000000
--- a/source4/lib/ldb/tools/ldbrename.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
- Copyright (C) Stefan Metzmacher 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldbrename
- *
- * Description: utility to rename records - modelled on ldapmodrdn
- *
- * Author: Andrew Tridgell
- * Author: Stefan Metzmacher
- */
-
-#include "ldb.h"
-#include "tools/cmdline.h"
-
-static void usage(struct ldb_context *ldb)
-{
- printf("Usage: ldbrename [<options>] <olddn> <newdn>\n");
- printf("Renames records in a ldb\n\n");
- ldb_cmdline_help(ldb, "ldbmodify", stdout);
- exit(LDB_ERR_OPERATIONS_ERROR);
-}
-
-
-int main(int argc, const char **argv)
-{
- struct ldb_context *ldb;
- int ret;
- struct ldb_cmdline *options;
- struct ldb_dn *dn1, *dn2;
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
-
- ldb = ldb_init(mem_ctx, NULL);
- if (ldb == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- options = ldb_cmdline_process(ldb, argc, argv, usage);
-
- if (options->argc < 2) {
- usage(ldb);
- }
-
- dn1 = ldb_dn_new(ldb, ldb, options->argv[0]);
- dn2 = ldb_dn_new(ldb, ldb, options->argv[1]);
- if ((dn1 == NULL) || (dn2 == NULL)) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- ret = ldb_rename(ldb, dn1, dn2);
- if (ret == LDB_SUCCESS) {
- printf("Renamed 1 record\n");
- } else {
- printf("rename of '%s' to '%s' failed - %s\n",
- options->argv[0], options->argv[1], ldb_errstring(ldb));
- }
-
- talloc_free(mem_ctx);
-
- return ret;
-}
diff --git a/source4/lib/ldb/tools/ldbsearch.c b/source4/lib/ldb/tools/ldbsearch.c
deleted file mode 100644
index d10b9650da..0000000000
--- a/source4/lib/ldb/tools/ldbsearch.c
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldbsearch
- *
- * Description: utility for ldb search - modelled on ldapsearch
- *
- * Author: Andrew Tridgell
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb.h"
-#include "tools/cmdline.h"
-
-static void usage(struct ldb_context *ldb)
-{
- printf("Usage: ldbsearch <options> <expression> <attrs...>\n");
- ldb_cmdline_help(ldb, "ldbsearch", stdout);
- exit(LDB_ERR_OPERATIONS_ERROR);
-}
-
-static int do_compare_msg(struct ldb_message **el1,
- struct ldb_message **el2,
- void *opaque)
-{
- return ldb_dn_compare((*el1)->dn, (*el2)->dn);
-}
-
-struct search_context {
- struct ldb_context *ldb;
- struct ldb_control **req_ctrls;
-
- int sort;
- unsigned int num_stored;
- struct ldb_message **store;
- unsigned int refs_stored;
- char **refs_store;
-
- unsigned int entries;
- unsigned int refs;
-
- unsigned int pending;
- int status;
-};
-
-static int store_message(struct ldb_message *msg, struct search_context *sctx) {
-
- sctx->store = talloc_realloc(sctx, sctx->store, struct ldb_message *, sctx->num_stored + 2);
- if (!sctx->store) {
- fprintf(stderr, "talloc_realloc failed while storing messages\n");
- return -1;
- }
-
- sctx->store[sctx->num_stored] = talloc_move(sctx->store, &msg);
- sctx->num_stored++;
- sctx->store[sctx->num_stored] = NULL;
-
- return 0;
-}
-
-static int store_referral(char *referral, struct search_context *sctx) {
-
- sctx->refs_store = talloc_realloc(sctx, sctx->refs_store, char *, sctx->refs_stored + 2);
- if (!sctx->refs_store) {
- fprintf(stderr, "talloc_realloc failed while storing referrals\n");
- return -1;
- }
-
- sctx->refs_store[sctx->refs_stored] = talloc_move(sctx->refs_store, &referral);
- sctx->refs_stored++;
- sctx->refs_store[sctx->refs_stored] = NULL;
-
- return 0;
-}
-
-static int display_message(struct ldb_message *msg, struct search_context *sctx) {
- struct ldb_ldif ldif;
-
- sctx->entries++;
- printf("# record %d\n", sctx->entries);
-
- ldif.changetype = LDB_CHANGETYPE_NONE;
- ldif.msg = msg;
-
- if (sctx->sort) {
- /*
- * Ensure attributes are always returned in the same
- * order. For testing, this makes comparison of old
- * vs. new much easier.
- */
- ldb_msg_sort_elements(ldif.msg);
- }
-
- ldb_ldif_write_file(sctx->ldb, stdout, &ldif);
-
- return 0;
-}
-
-static int display_referral(char *referral, struct search_context *sctx)
-{
-
- sctx->refs++;
- printf("# Referral\nref: %s\n\n", referral);
-
- return 0;
-}
-
-static int search_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
- struct search_context *sctx;
- int ret = LDB_SUCCESS;
-
- sctx = talloc_get_type(req->context, struct search_context);
-
- if (!ares) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
- if (ares->error != LDB_SUCCESS) {
- return ldb_request_done(req, ares->error);
- }
-
- switch (ares->type) {
- case LDB_REPLY_ENTRY:
- if (sctx->sort) {
- ret = store_message(ares->message, sctx);
- } else {
- ret = display_message(ares->message, sctx);
- }
- break;
-
- case LDB_REPLY_REFERRAL:
- if (sctx->sort) {
- ret = store_referral(ares->referral, sctx);
- } else {
- ret = display_referral(ares->referral, sctx);
- }
- if (ret) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
- break;
-
- case LDB_REPLY_DONE:
- if (ares->controls) {
- if (handle_controls_reply(ares->controls, sctx->req_ctrls) == 1)
- sctx->pending = 1;
- }
- talloc_free(ares);
- return ldb_request_done(req, LDB_SUCCESS);
- }
-
- talloc_free(ares);
- if (ret != LDB_SUCCESS) {
- return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
- }
-
- return LDB_SUCCESS;
-}
-
-static int do_search(struct ldb_context *ldb,
- struct ldb_dn *basedn,
- struct ldb_cmdline *options,
- const char *expression,
- const char * const *attrs)
-{
- struct ldb_request *req;
- struct search_context *sctx;
- int ret;
-
- req = NULL;
-
- sctx = talloc_zero(ldb, struct search_context);
- if (!sctx) return LDB_ERR_OPERATIONS_ERROR;
-
- sctx->ldb = ldb;
- sctx->sort = options->sorted;
- sctx->req_ctrls = ldb_parse_control_strings(ldb, sctx, (const char **)options->controls);
- if (options->controls != NULL && sctx->req_ctrls== NULL) {
- printf("parsing controls failed: %s\n", ldb_errstring(ldb));
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (basedn == NULL) {
- basedn = ldb_get_default_basedn(ldb);
- }
-
-again:
- /* free any previous requests */
- if (req) talloc_free(req);
-
- ret = ldb_build_search_req(&req, ldb, ldb,
- basedn, options->scope,
- expression, attrs,
- sctx->req_ctrls,
- sctx, search_callback,
- NULL);
- if (ret != LDB_SUCCESS) {
- talloc_free(sctx);
- printf("allocating request failed: %s\n", ldb_errstring(ldb));
- return ret;
- }
-
- sctx->pending = 0;
-
- ret = ldb_request(ldb, req);
- if (ret != LDB_SUCCESS) {
- printf("search failed - %s\n", ldb_errstring(ldb));
- return ret;
- }
-
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- if (ret != LDB_SUCCESS) {
- printf("search error - %s\n", ldb_errstring(ldb));
- return ret;
- }
-
- if (sctx->pending)
- goto again;
-
- if (sctx->sort && (sctx->num_stored != 0 || sctx->refs != 0)) {
- unsigned int i;
-
- if (sctx->num_stored) {
- LDB_TYPESAFE_QSORT(sctx->store, sctx->num_stored, ldb, do_compare_msg);
- }
- for (i = 0; i < sctx->num_stored; i++) {
- display_message(sctx->store[i], sctx);
- }
-
- for (i = 0; i < sctx->refs_stored; i++) {
- display_referral(sctx->refs_store[i], sctx);
- }
- }
-
- printf("# returned %u records\n# %u entries\n# %u referrals\n",
- sctx->entries + sctx->refs, sctx->entries, sctx->refs);
-
- talloc_free(sctx);
- talloc_free(req);
-
- return LDB_SUCCESS;
-}
-
-int main(int argc, const char **argv)
-{
- struct ldb_context *ldb;
- struct ldb_dn *basedn = NULL;
- const char * const * attrs = NULL;
- struct ldb_cmdline *options;
- int ret = -1;
- const char *expression = "(|(objectClass=*)(distinguishedName=*))";
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
-
- ldb = ldb_init(mem_ctx, NULL);
- if (ldb == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- options = ldb_cmdline_process(ldb, argc, argv, usage);
-
- /* the check for '=' is for compatibility with ldapsearch */
- if (!options->interactive &&
- options->argc > 0 &&
- strchr(options->argv[0], '=')) {
- expression = options->argv[0];
- options->argv++;
- options->argc--;
- }
-
- if (options->argc > 0) {
- attrs = (const char * const *)(options->argv);
- }
-
- if (options->basedn != NULL) {
- basedn = ldb_dn_new(ldb, ldb, options->basedn);
- if (basedn == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- if (options->interactive) {
- char line[1024];
- while (fgets(line, sizeof(line), stdin)) {
- ret = do_search(ldb, basedn, options, line, attrs);
- }
- } else {
- ret = do_search(ldb, basedn, options, expression, attrs);
- }
-
- talloc_free(mem_ctx);
-
- return ret;
-}
diff --git a/source4/lib/ldb/tools/ldbtest.c b/source4/lib/ldb/tools/ldbtest.c
deleted file mode 100644
index 4e181af9d5..0000000000
--- a/source4/lib/ldb/tools/ldbtest.c
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- ldb database library
-
- Copyright (C) Andrew Tridgell 2004
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Component: ldbtest
- *
- * Description: utility to test ldb
- *
- * Author: Andrew Tridgell
- */
-
-#include "replace.h"
-#include "system/filesys.h"
-#include "system/time.h"
-#include "ldb.h"
-#include "tools/cmdline.h"
-
-static struct timespec tp1,tp2;
-static struct ldb_cmdline *options;
-
-static void _start_timer(void)
-{
- if (clock_gettime(CUSTOM_CLOCK_MONOTONIC, &tp1) != 0) {
- clock_gettime(CLOCK_REALTIME, &tp1);
- }
-}
-
-static double _end_timer(void)
-{
- if (clock_gettime(CUSTOM_CLOCK_MONOTONIC, &tp2) != 0) {
- clock_gettime(CLOCK_REALTIME, &tp2);
- }
- return((tp2.tv_sec - tp1.tv_sec) +
- (tp2.tv_nsec - tp1.tv_nsec)*1.0e-9);
-}
-
-static void add_records(struct ldb_context *ldb,
- struct ldb_dn *basedn,
- unsigned int count)
-{
- struct ldb_message msg;
- unsigned int i;
-
-#if 0
- if (ldb_lock(ldb, "transaction") != 0) {
- printf("transaction lock failed\n");
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-#endif
- for (i=0;i<count;i++) {
- struct ldb_message_element el[6];
- struct ldb_val vals[6][1];
- char *name;
- TALLOC_CTX *tmp_ctx = talloc_new(ldb);
-
- name = talloc_asprintf(tmp_ctx, "Test%d", i);
-
- msg.dn = ldb_dn_copy(tmp_ctx, basedn);
- ldb_dn_add_child_fmt(msg.dn, "cn=%s", name);
- msg.num_elements = 6;
- msg.elements = el;
-
- el[0].flags = 0;
- el[0].name = talloc_strdup(tmp_ctx, "cn");
- el[0].num_values = 1;
- el[0].values = vals[0];
- vals[0][0].data = (uint8_t *)name;
- vals[0][0].length = strlen(name);
-
- el[1].flags = 0;
- el[1].name = "title";
- el[1].num_values = 1;
- el[1].values = vals[1];
- vals[1][0].data = (uint8_t *)talloc_asprintf(tmp_ctx, "The title of %s", name);
- vals[1][0].length = strlen((char *)vals[1][0].data);
-
- el[2].flags = 0;
- el[2].name = talloc_strdup(tmp_ctx, "uid");
- el[2].num_values = 1;
- el[2].values = vals[2];
- vals[2][0].data = (uint8_t *)ldb_casefold(ldb, tmp_ctx, name, strlen(name));
- vals[2][0].length = strlen((char *)vals[2][0].data);
-
- el[3].flags = 0;
- el[3].name = talloc_strdup(tmp_ctx, "mail");
- el[3].num_values = 1;
- el[3].values = vals[3];
- vals[3][0].data = (uint8_t *)talloc_asprintf(tmp_ctx, "%s@example.com", name);
- vals[3][0].length = strlen((char *)vals[3][0].data);
-
- el[4].flags = 0;
- el[4].name = talloc_strdup(tmp_ctx, "objectClass");
- el[4].num_values = 1;
- el[4].values = vals[4];
- vals[4][0].data = (uint8_t *)talloc_strdup(tmp_ctx, "OpenLDAPperson");
- vals[4][0].length = strlen((char *)vals[4][0].data);
-
- el[5].flags = 0;
- el[5].name = talloc_strdup(tmp_ctx, "sn");
- el[5].num_values = 1;
- el[5].values = vals[5];
- vals[5][0].data = (uint8_t *)name;
- vals[5][0].length = strlen((char *)vals[5][0].data);
-
- ldb_delete(ldb, msg.dn);
-
- if (ldb_add(ldb, &msg) != LDB_SUCCESS) {
- printf("Add of %s failed - %s\n", name, ldb_errstring(ldb));
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- printf("adding uid %s\r", name);
- fflush(stdout);
-
- talloc_free(tmp_ctx);
- }
-#if 0
- if (ldb_unlock(ldb, "transaction") != 0) {
- printf("transaction unlock failed\n");
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-#endif
- printf("\n");
-}
-
-static void modify_records(struct ldb_context *ldb,
- struct ldb_dn *basedn,
- unsigned int count)
-{
- struct ldb_message msg;
- unsigned int i;
-
- for (i=0;i<count;i++) {
- struct ldb_message_element el[3];
- struct ldb_val vals[3];
- char *name;
- TALLOC_CTX *tmp_ctx = talloc_new(ldb);
-
- name = talloc_asprintf(tmp_ctx, "Test%d", i);
- msg.dn = ldb_dn_copy(tmp_ctx, basedn);
- ldb_dn_add_child_fmt(msg.dn, "cn=%s", name);
-
- msg.num_elements = 3;
- msg.elements = el;
-
- el[0].flags = LDB_FLAG_MOD_DELETE;
- el[0].name = talloc_strdup(tmp_ctx, "mail");
- el[0].num_values = 0;
-
- el[1].flags = LDB_FLAG_MOD_ADD;
- el[1].name = talloc_strdup(tmp_ctx, "mail");
- el[1].num_values = 1;
- el[1].values = &vals[1];
- vals[1].data = (uint8_t *)talloc_asprintf(tmp_ctx, "%s@other.example.com", name);
- vals[1].length = strlen((char *)vals[1].data);
-
- el[2].flags = LDB_FLAG_MOD_REPLACE;
- el[2].name = talloc_strdup(tmp_ctx, "mail");
- el[2].num_values = 1;
- el[2].values = &vals[2];
- vals[2].data = (uint8_t *)talloc_asprintf(tmp_ctx, "%s@other2.example.com", name);
- vals[2].length = strlen((char *)vals[2].data);
-
- if (ldb_modify(ldb, &msg) != LDB_SUCCESS) {
- printf("Modify of %s failed - %s\n", name, ldb_errstring(ldb));
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- printf("Modifying uid %s\r", name);
- fflush(stdout);
-
- talloc_free(tmp_ctx);
- }
-
- printf("\n");
-}
-
-
-static void delete_records(struct ldb_context *ldb,
- struct ldb_dn *basedn,
- unsigned int count)
-{
- unsigned int i;
-
- for (i=0;i<count;i++) {
- struct ldb_dn *dn;
- char *name = talloc_asprintf(ldb, "Test%d", i);
- dn = ldb_dn_copy(name, basedn);
- ldb_dn_add_child_fmt(dn, "cn=%s", name);
-
- printf("Deleting uid Test%d\r", i);
- fflush(stdout);
-
- if (ldb_delete(ldb, dn) != LDB_SUCCESS) {
- printf("Delete of %s failed - %s\n", ldb_dn_get_linearized(dn), ldb_errstring(ldb));
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
- talloc_free(name);
- }
-
- printf("\n");
-}
-
-static void search_uid(struct ldb_context *ldb, struct ldb_dn *basedn,
- unsigned int nrecords, unsigned int nsearches)
-{
- unsigned int i;
-
- for (i=0;i<nsearches;i++) {
- int uid = (i * 700 + 17) % (nrecords * 2);
- char *expr;
- struct ldb_result *res = NULL;
- int ret;
-
- expr = talloc_asprintf(ldb, "(uid=TEST%d)", uid);
- ret = ldb_search(ldb, ldb, &res, basedn, LDB_SCOPE_SUBTREE, NULL, "%s", expr);
-
- if (ret != LDB_SUCCESS || (uid < nrecords && res->count != 1)) {
- printf("Failed to find %s - %s\n", expr, ldb_errstring(ldb));
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- if (uid >= nrecords && res->count > 0) {
- printf("Found %s !? - %d\n", expr, ret);
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- printf("Testing uid %d/%d - %d \r", i, uid, res->count);
- fflush(stdout);
-
- talloc_free(res);
- talloc_free(expr);
- }
-
- printf("\n");
-}
-
-static void start_test(struct ldb_context *ldb, unsigned int nrecords,
- unsigned int nsearches)
-{
- struct ldb_dn *basedn;
-
- basedn = ldb_dn_new(ldb, ldb, options->basedn);
- if ( ! ldb_dn_validate(basedn)) {
- printf("Invalid base DN format\n");
- exit(LDB_ERR_INVALID_DN_SYNTAX);
- }
-
- printf("Adding %d records\n", nrecords);
- add_records(ldb, basedn, nrecords);
-
- printf("Starting search on uid\n");
- _start_timer();
- search_uid(ldb, basedn, nrecords, nsearches);
- printf("uid search took %.2f seconds\n", _end_timer());
-
- printf("Modifying records\n");
- modify_records(ldb, basedn, nrecords);
-
- printf("Deleting records\n");
- delete_records(ldb, basedn, nrecords);
-}
-
-
-/*
- 2) Store an @indexlist record
-
- 3) Store a record that contains fields that should be index according
-to @index
-
- 4) disconnection from database
-
- 5) connect to same database
-
- 6) search for record added in step 3 using a search key that should
-be indexed
-*/
-static void start_test_index(struct ldb_context **ldb)
-{
- struct ldb_message *msg;
- struct ldb_result *res = NULL;
- struct ldb_dn *indexlist;
- struct ldb_dn *basedn;
- int ret;
- unsigned int flags = 0;
- const char *specials;
-
- specials = getenv("LDB_SPECIALS");
- if (specials && atoi(specials) == 0) {
- printf("LDB_SPECIALS disabled - skipping index test\n");
- return;
- }
-
- if (options->nosync) {
- flags |= LDB_FLG_NOSYNC;
- }
-
- printf("Starting index test\n");
-
- indexlist = ldb_dn_new(*ldb, *ldb, "@INDEXLIST");
-
- ldb_delete(*ldb, indexlist);
-
- msg = ldb_msg_new(NULL);
-
- msg->dn = indexlist;
- ldb_msg_add_string(msg, "@IDXATTR", strdup("uid"));
-
- if (ldb_add(*ldb, msg) != 0) {
- printf("Add of %s failed - %s\n", ldb_dn_get_linearized(msg->dn), ldb_errstring(*ldb));
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- basedn = ldb_dn_new(*ldb, *ldb, options->basedn);
-
- memset(msg, 0, sizeof(*msg));
- msg->dn = ldb_dn_copy(msg, basedn);
- ldb_dn_add_child_fmt(msg->dn, "cn=test");
- ldb_msg_add_string(msg, "cn", strdup("test"));
- ldb_msg_add_string(msg, "sn", strdup("test"));
- ldb_msg_add_string(msg, "uid", strdup("test"));
- ldb_msg_add_string(msg, "objectClass", strdup("OpenLDAPperson"));
-
- if (ldb_add(*ldb, msg) != LDB_SUCCESS) {
- printf("Add of %s failed - %s\n", ldb_dn_get_linearized(msg->dn), ldb_errstring(*ldb));
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- if (talloc_free(*ldb) != 0) {
- printf("failed to free/close ldb database");
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- (*ldb) = ldb_init(options, NULL);
-
- ret = ldb_connect(*ldb, options->url, flags, NULL);
- if (ret != LDB_SUCCESS) {
- printf("failed to connect to %s\n", options->url);
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- basedn = ldb_dn_new(*ldb, *ldb, options->basedn);
- msg->dn = basedn;
- ldb_dn_add_child_fmt(msg->dn, "cn=test");
-
- ret = ldb_search(*ldb, *ldb, &res, basedn, LDB_SCOPE_SUBTREE, NULL, "uid=test");
- if (ret != LDB_SUCCESS) {
- printf("Search with (uid=test) filter failed!\n");
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
- if(res->count != 1) {
- printf("Should have found 1 record - found %d\n", res->count);
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- indexlist = ldb_dn_new(*ldb, *ldb, "@INDEXLIST");
-
- if (ldb_delete(*ldb, msg->dn) != 0 ||
- ldb_delete(*ldb, indexlist) != 0) {
- printf("cleanup failed - %s\n", ldb_errstring(*ldb));
- exit(LDB_ERR_OPERATIONS_ERROR);
- }
-
- printf("Finished index test\n");
-}
-
-
-static void usage(struct ldb_context *ldb)
-{
- printf("Usage: ldbtest <options>\n");
- printf("Options:\n");
- printf(" -H ldb_url choose the database (or $LDB_URL)\n");
- printf(" --num-records nrecords database size to use\n");
- printf(" --num-searches nsearches number of searches to do\n");
- printf("\n");
- printf("tests ldb API\n\n");
- exit(LDB_ERR_OPERATIONS_ERROR);
-}
-
-int main(int argc, const char **argv)
-{
- TALLOC_CTX *mem_ctx = talloc_new(NULL);
- struct ldb_context *ldb;
-
- ldb = ldb_init(mem_ctx, NULL);
- if (ldb == NULL) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- options = ldb_cmdline_process(ldb, argc, argv, usage);
-
- talloc_steal(mem_ctx, options);
-
- if (options->basedn == NULL) {
- options->basedn = "ou=Ldb Test,ou=People,o=University of Michigan,c=TEST";
- }
-
- srandom(1);
-
- printf("Testing with num-records=%d and num-searches=%d\n",
- options->num_records, options->num_searches);
-
- start_test(ldb,
- (unsigned int) options->num_records,
- (unsigned int) options->num_searches);
-
- start_test_index(&ldb);
-
- talloc_free(mem_ctx);
-
- return LDB_SUCCESS;
-}
diff --git a/source4/lib/ldb/tools/ldbutil.c b/source4/lib/ldb/tools/ldbutil.c
deleted file mode 100644
index 26f252704c..0000000000
--- a/source4/lib/ldb/tools/ldbutil.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- ldb database library utility
-
- Copyright (C) Matthieu Patou 2009
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Description: Common function used by ldb_add/ldb_modify/ldb_delete
- *
- * Author: Matthieu Patou
- */
-
-#include "ldb.h"
-#include "ldb_module.h"
-#include "ldbutil.h"
-
-
-/* autostarts a transacion if none active */
-static int ldb_do_autotransaction(struct ldb_context *ldb,
- struct ldb_request *req)
-{
- int ret;
-
- ret = ldb_transaction_start(ldb);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ldb_request(ldb, req);
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
- if (ret == LDB_SUCCESS) {
- return ldb_transaction_commit(ldb);
- }
- ldb_transaction_cancel(ldb);
-
- if (ldb_errstring(ldb) == NULL) {
- /* no error string was setup by the backend */
- ldb_asprintf_errstring(ldb, "%s (%d)", ldb_strerror(ret), ret);
- }
-
- return ret;
-}
-/*
- Same as ldb_add but accept control
-*/
-int ldb_add_ctrl(struct ldb_context *ldb,
- const struct ldb_message *message,
- struct ldb_control **controls)
-{
- struct ldb_request *req;
- int ret;
-
- ret = ldb_msg_sanity_check(ldb, message);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ldb_build_add_req(&req, ldb, ldb,
- message,
- controls,
- NULL,
- ldb_op_default_callback,
- NULL);
-
- if (ret != LDB_SUCCESS) return ret;
-
- /* do request and autostart a transaction */
- ret = ldb_do_autotransaction(ldb, req);
-
- talloc_free(req);
- return ret;
-}
-
-/*
- same as ldb_delete but accept control
-*/
-int ldb_delete_ctrl(struct ldb_context *ldb, struct ldb_dn *dn,
- struct ldb_control **controls)
-{
- struct ldb_request *req;
- int ret;
-
- ret = ldb_build_del_req(&req, ldb, ldb,
- dn,
- controls,
- NULL,
- ldb_op_default_callback,
- NULL);
-
- if (ret != LDB_SUCCESS) return ret;
-
- /* do request and autostart a transaction */
- ret = ldb_do_autotransaction(ldb, req);
-
- talloc_free(req);
- return ret;
-}
-
-
-/*
- same as ldb_modify, but accepts controls
-*/
-int ldb_modify_ctrl(struct ldb_context *ldb,
- const struct ldb_message *message,
- struct ldb_control **controls)
-{
- struct ldb_request *req;
- int ret;
-
- ret = ldb_msg_sanity_check(ldb, message);
- if (ret != LDB_SUCCESS) {
- return ret;
- }
-
- ret = ldb_build_mod_req(&req, ldb, ldb,
- message,
- controls,
- NULL,
- ldb_op_default_callback,
- NULL);
-
- if (ret != LDB_SUCCESS) return ret;
-
- /* do request and autostart a transaction */
- ret = ldb_do_autotransaction(ldb, req);
-
- talloc_free(req);
- return ret;
-}
-
-
-/*
- ldb_search with controls
-*/
-int ldb_search_ctrl(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
- struct ldb_result **result, struct ldb_dn *base,
- enum ldb_scope scope, const char * const *attrs,
- struct ldb_control **controls,
- const char *exp_fmt, ...)
-{
- struct ldb_request *req;
- struct ldb_result *res;
- char *expression;
- va_list ap;
- int ret;
-
- expression = NULL;
- *result = NULL;
- req = NULL;
-
- res = talloc_zero(mem_ctx, struct ldb_result);
- if (!res) {
- return LDB_ERR_OPERATIONS_ERROR;
- }
-
- if (exp_fmt) {
- va_start(ap, exp_fmt);
- expression = talloc_vasprintf(mem_ctx, exp_fmt, ap);
- va_end(ap);
-
- if (!expression) {
- talloc_free(res);
- return LDB_ERR_OPERATIONS_ERROR;
- }
- }
-
- ret = ldb_build_search_req(&req, ldb, mem_ctx,
- base?base:ldb_get_default_basedn(ldb),
- scope,
- expression,
- attrs,
- controls,
- res,
- ldb_search_default_callback,
- NULL);
- ldb_req_set_location(req, "ldb_search_ctrl");
-
- if (ret != LDB_SUCCESS) goto done;
-
- ret = ldb_request(ldb, req);
-
- if (ret == LDB_SUCCESS) {
- ret = ldb_wait(req->handle, LDB_WAIT_ALL);
- }
-
-done:
- if (ret != LDB_SUCCESS) {
- talloc_free(res);
- res = NULL;
- }
-
- talloc_free(expression);
- talloc_free(req);
-
- *result = res;
- return ret;
-}
diff --git a/source4/lib/ldb/tools/ldbutil.h b/source4/lib/ldb/tools/ldbutil.h
deleted file mode 100644
index f8d3f3a210..0000000000
--- a/source4/lib/ldb/tools/ldbutil.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- ldb database library utility header file
-
- Copyright (C) Matthieu Patou 2009
-
- ** NOTE! The following LGPL license applies to the ldb
- ** library. This does NOT imply that all of Samba is released
- ** under the LGPL
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 3 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Name: ldb
- *
- * Description: Common function used by ldb_add/ldb_modify/ldb_delete
- *
- * Author: Matthieu Patou
- */
-
-#include "ldb.h"
-
-int ldb_add_ctrl(struct ldb_context *ldb,
- const struct ldb_message *message,
- struct ldb_control **controls);
-int ldb_delete_ctrl(struct ldb_context *ldb, struct ldb_dn *dn,
- struct ldb_control **controls);
-int ldb_modify_ctrl(struct ldb_context *ldb,
- const struct ldb_message *message,
- struct ldb_control **controls);
-int ldb_search_ctrl(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
- struct ldb_result **result, struct ldb_dn *base,
- enum ldb_scope scope, const char * const *attrs,
- struct ldb_control **controls,
- const char *exp_fmt, ...);
diff --git a/source4/lib/ldb/web/index.html b/source4/lib/ldb/web/index.html
deleted file mode 100644
index 7f50cdc63a..0000000000
--- a/source4/lib/ldb/web/index.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<HEAD>
-<TITLE>ldb</TITLE>
-</HEAD>
-<BODY BGCOLOR="#ffffff" TEXT="#000000" VLINK="#292555" LINK="#292555" ALINK="#cc0033">
-
-<h1>ldb</h1>
-
-ldb is a LDAP-like embedded database. It is not at all
-<a href="http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol">LDAP</a>
-standards compliant, so if you want a standards compliant database then please
-see the excellent <a href="http://www.openldap.org/">OpenLDAP</a>
-project.<p>
-
-What ldb does is provide a fast database with an LDAP-like API
-designed to be used within an application. In some ways it can be seen
-as a intermediate solution between key-value pair databases and a real
-LDAP database.<p>
-
-ldb is the database engine used in Samba4.
-
-<h2>Features</h2>
-
-The main features that separate ldb from other solutions are:
-
-<ul>
-<li>Safe multi-reader, multi-writer, using byte range locking
-<li><a href="http://en.wikipedia.org/wiki/LDAP_Application_Program_Interface">LDAP-like API</a>
-<li>fast operation
-<li>choice of local tdb or remote LDAP backends
-<li>integration with <a href="http://talloc.samba.org">talloc</a>
-<li>schema-less operation, for trivial setup
-<li>modules for extensions (such as schema support)
-<li>easy setup of indexes and attribute properties
-<li><a href="http://en.wikipedia.org/wiki/LDAP_Data_Interchange_Format">LDIF</a> for import/export
-<li>ldbedit tool for database (via LDIF) editing (reminiscent of 'vipw')
-</ul>
-
-<h2>Documentation</h2>
-
-Currently ldb is completely lacking in programmer or user
-documentation. This is your opportunity to make a contribution! Start
-with the public functions declared in <a
-href="http://samba.org/ftp/unpacked/ldb/include/ldb.h">ldb.h</a>
-and the example code in the <a
-href="http://samba.org/ftp/unpacked/ldb/tools/">tools
-directory</a>. Documentation in the same docbook format used by Samba
-would be preferred.
-
-<h2>Discussion and bug reports</h2>
-
-ldb does not have its own mailing list or bug tracking system. Please
-use
-the <a href="https://lists.samba.org/mailman/listinfo/samba-technical">samba-technical</a>
-mailing list, and the <a href="http://bugzilla.samba.org/">Samba
-bugzilla</a> bug tracking system.
-
-<h2>Download</h2>
-
-You can download the latest release here:<br>
- <a href="http://samba.org/ftp/pub/ldb">http://samba.org/ftp/pub/ldb</a>
-
-Alternatively, you can fetch via git. See the following guide:<br>
-<a href="http://wiki.samba.org/index.php/Using_Git_for_Samba_Development">Using Git for Samba Development</a><br>
-
-<hr>
-<tiny>
-<a href="http://samba.org/~tridge/">Andrew Tridgell</a><br>
-ldb AT tridgell.net
-</tiny>
-
-</BODY>
-</HTML>
diff --git a/source4/lib/ldb/wscript b/source4/lib/ldb/wscript
deleted file mode 100755
index 7de95494c7..0000000000
--- a/source4/lib/ldb/wscript
+++ /dev/null
@@ -1,287 +0,0 @@
-#!/usr/bin/env python
-
-APPNAME = 'ldb'
-VERSION = '1.1.0'
-
-blddir = 'bin'
-
-import sys, os
-
-# find the buildtools directory
-srcdir = '.'
-while not os.path.exists(srcdir+'/buildtools') and len(srcdir.split('/')) < 5:
- srcdir = '../' + srcdir
-sys.path.insert(0, srcdir + '/buildtools/wafsamba')
-
-import wafsamba, samba_dist, Options
-
-samba_dist.DIST_DIRS('''source4/lib/ldb:. lib/replace:lib/replace lib/talloc:lib/talloc
- lib/tdb:lib/tdb lib/tdb2:lib/tdb2 lib/tdb_compat:lib/tdb_compat lib/ccan:lib/ccan lib/tevent:lib/tevent lib/popt:lib/popt
- buildtools:buildtools''')
-
-
-def set_options(opt):
- opt.BUILTIN_DEFAULT('replace')
- opt.PRIVATE_EXTENSION_DEFAULT('ldb', noextension='ldb')
- opt.RECURSE('lib/tdb_compat')
- opt.RECURSE('lib/tevent')
- opt.RECURSE('lib/replace')
- opt.tool_options('python') # options for disabling pyc or pyo compilation
-
-def configure(conf):
- conf.RECURSE('lib/tdb_compat')
- conf.RECURSE('lib/tevent')
- conf.RECURSE('lib/popt')
- conf.RECURSE('lib/replace')
- conf.RECURSE('lib/tdb_compat')
- conf.find_program('python', var='PYTHON')
- conf.find_program('xsltproc', var='XSLTPROC')
- conf.check_tool('python')
- conf.check_python_version((2,4,2))
- conf.SAMBA_CHECK_PYTHON_HEADERS(mandatory=True)
-
- # This make #include <ccan/...> work.
- conf.ADD_EXTRA_INCLUDES('''#lib''')
-
- # where does the default LIBDIR end up? in conf.env somewhere?
- #
- conf.CONFIG_PATH('LDB_MODULESDIR', conf.SUBST_ENV_VAR('MODULESDIR') + '/ldb')
-
- conf.env.standalone_ldb = conf.IN_LAUNCH_DIR()
-
- if not conf.env.standalone_ldb:
- if conf.CHECK_BUNDLED_SYSTEM('ldb', minversion=VERSION,
- onlyif='talloc tdb tevent',
- implied_deps='replace talloc tdb tevent'):
- conf.define('USING_SYSTEM_LDB', 1)
- if conf.CHECK_BUNDLED_SYSTEM('pyldb-util', minversion=VERSION,
- onlyif='talloc tdb tevent ldb',
- implied_deps='replace talloc tdb tevent ldb'):
- conf.define('USING_SYSTEM_PYLDB_UTIL', 1)
-
- if conf.env.standalone_ldb:
- conf.CHECK_XSLTPROC_MANPAGES()
-
- # we need this for the ldap backend
- if conf.CHECK_FUNCS_IN('ber_flush ldap_open ldap_initialize', 'lber ldap', headers='lber.h ldap.h'):
- conf.env.ENABLE_LDAP_BACKEND = True
-
- conf.DEFINE('HAVE_CONFIG_H', 1, add_to_cflags=True)
-
- # we don't want any libraries or modules to rely on runtime
- # resolution of symbols
- if sys.platform != "openbsd4":
- conf.ADD_LDFLAGS('-Wl,-no-undefined', testflags=True)
-
- conf.SAMBA_CONFIG_H()
-
-def build(bld):
- bld.RECURSE('lib/tdb_compat')
- bld.RECURSE('lib/tevent')
- bld.RECURSE('lib/popt')
- bld.RECURSE('lib/replace')
- bld.RECURSE('lib/tdb_compat')
-
- if bld.env.standalone_ldb:
- private_library = False
- ldb_pc_files='ldb.pc'
- pyldb_pc_files='pyldb-util.pc'
- else:
- private_library = True
- ldb_pc_files=None
- pyldb_pc_files=None
-
- LDB_MAP_SRC = bld.SUBDIR('ldb_map',
- 'ldb_map.c ldb_map_inbound.c ldb_map_outbound.c')
-
- COMMON_SRC = bld.SUBDIR('common',
- '''ldb_modules.c ldb_ldif.c ldb_parse.c ldb_msg.c ldb_utf8.c
- ldb_debug.c ldb_dn.c ldb_match.c ldb_options.c
- ldb_attributes.c attrib_handlers.c ldb_controls.c qsort.c''')
-
- bld.SAMBA_MODULE('ldb_ldap', 'ldb_ldap/ldb_ldap.c',
- init_function='ldb_ldap_init',
- module_init_name='ldb_init_module',
- deps='talloc lber ldap ldb',
- enabled=bld.env.ENABLE_LDAP_BACKEND,
- internal_module=False,
- subsystem='ldb')
-
- # we're not currently linking against the ldap libs, but ldb.pc.in
- # has @LDAP_LIBS@
- bld.env.LDAP_LIBS = ''
-
- if not 'PACKAGE_VERSION' in bld.env:
- bld.env.PACKAGE_VERSION = VERSION
- bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig'
-
- if not bld.CONFIG_SET('USING_SYSTEM_PYLDB_UTIL'):
- bld.SAMBA_LIBRARY('pyldb-util',
- deps='ldb pytalloc-util',
- source='pyldb_util.c',
- public_headers='pyldb.h',
- public_headers_install=not private_library,
- vnum=VERSION,
- private_library=private_library,
- pc_files=pyldb_pc_files,
- pyext=True)
-
- if not bld.CONFIG_SET('USING_SYSTEM_LDB'):
- if Options.is_install:
- modules_dir = bld.EXPAND_VARIABLES('${LDB_MODULESDIR}')
- else:
- # when we run from the source directory, we want to use
- # the current modules, not the installed ones
- modules_dir = os.path.join(os.getcwd(), 'bin/modules/ldb')
-
- abi_match = '!ldb_*module_ops !ldb_*backend_ops ldb_*'
-
- bld.SAMBA_LIBRARY('ldb',
- COMMON_SRC + ' ' + LDB_MAP_SRC,
- deps='tevent LIBLDB_MAIN',
- includes='include',
- public_headers='include/ldb.h include/ldb_errors.h '\
- 'include/ldb_module.h include/ldb_handlers.h',
- public_headers_install=not private_library,
- pc_files=ldb_pc_files,
- vnum=VERSION,
- private_library=private_library,
- manpages='man/ldb.3',
- abi_directory = 'ABI',
- abi_match = abi_match)
-
- # generate a include/ldb_version.h
- t = bld.SAMBA_GENERATOR('ldb_version.h',
- rule='echo "#define LDB_VERSION \\"${LDB_VERSION}\\"" > ${TGT}',
- target='include/ldb_version.h',
- public_headers='include/ldb_version.h',
- public_headers_install=not private_library)
- t.env.LDB_VERSION = VERSION
- bld.add_manual_dependency(bld.path.find_or_declare('include/ldb_version.h'), VERSION)
-
-
-
- bld.SAMBA_PYTHON('pyldb', 'pyldb.c',
- deps='ldb pyldb-util',
- realname='ldb.so',
- cflags='-DPACKAGE_VERSION=\"%s\"' % VERSION)
-
- bld.SAMBA_MODULE('ldb_paged_results',
- 'modules/paged_results.c',
- init_function='ldb_paged_results_init',
- module_init_name='ldb_init_module',
- internal_module=False,
- deps='ldb',
- subsystem='ldb')
-
- bld.SAMBA_MODULE('ldb_asq',
- 'modules/asq.c',
- init_function='ldb_asq_init',
- module_init_name='ldb_init_module',
- internal_module=False,
- deps='ldb',
- subsystem='ldb')
-
- bld.SAMBA_MODULE('ldb_server_sort',
- 'modules/sort.c',
- init_function='ldb_server_sort_init',
- internal_module=False,
- module_init_name='ldb_init_module',
- deps='ldb',
- subsystem='ldb')
-
- bld.SAMBA_MODULE('ldb_paged_searches',
- 'modules/paged_searches.c',
- init_function='ldb_paged_searches_init',
- internal_module=False,
- module_init_name='ldb_init_module',
- deps='ldb',
- subsystem='ldb')
-
- bld.SAMBA_MODULE('ldb_rdn_name',
- 'modules/rdn_name.c',
- init_function='ldb_rdn_name_init',
- internal_module=False,
- module_init_name='ldb_init_module',
- deps='ldb',
- subsystem='ldb')
-
- bld.SAMBA_MODULE('ldb_sample',
- 'tests/sample_module.c',
- init_function='ldb_sample_init',
- internal_module=False,
- module_init_name='ldb_init_module',
- deps='ldb',
- subsystem='ldb')
-
- bld.SAMBA_MODULE('ldb_skel',
- 'modules/skel.c',
- init_function='ldb_skel_init',
- internal_module=False,
- module_init_name='ldb_init_module',
- deps='ldb',
- subsystem='ldb')
-
- bld.SAMBA_MODULE('ldb_sqlite3',
- 'sqlite3/ldb_sqlite3.c',
- init_function='ldb_sqlite3_init',
- internal_module=False,
- module_init_name='ldb_init_module',
- enabled=False,
- deps='ldb',
- subsystem='ldb')
-
- bld.SAMBA_MODULE('ldb_tdb',
- bld.SUBDIR('ldb_tdb',
- '''ldb_tdb.c ldb_pack.c ldb_search.c ldb_index.c
- ldb_cache.c ldb_tdb_wrap.c'''),
- init_function='ldb_tdb_init',
- module_init_name='ldb_init_module',
- internal_module=False,
- deps='tdb_compat ldb',
- subsystem='ldb')
-
- # have a separate subsystem for common/ldb.c, so it can rebuild
- # for install with a different -DLDB_MODULESDIR=
- bld.SAMBA_SUBSYSTEM('LIBLDB_MAIN',
- 'common/ldb.c',
- deps='tevent tdb_compat',
- includes='include',
- cflags=['-DLDB_MODULESDIR=\"%s\"' % modules_dir])
-
- LDB_TOOLS='ldbadd ldbsearch ldbdel ldbmodify ldbedit ldbrename'
- for t in LDB_TOOLS.split():
- bld.SAMBA_BINARY(t, 'tools/%s.c' % t, deps='ldb-cmdline ldb',
- manpages='man/%s.1' % t)
-
- # ldbtest doesn't get installed
- bld.SAMBA_BINARY('ldbtest', 'tools/ldbtest.c', deps='ldb-cmdline ldb',
- install=False)
-
- bld.SAMBA_LIBRARY('ldb-cmdline',
- source='tools/ldbutil.c tools/cmdline.c',
- deps='ldb dl popt',
- private_library=True)
-
-
-def test(ctx):
- '''run ldb testsuite'''
- import Utils, samba_utils, shutil
- test_prefix = "%s/st" % (Utils.g_module.blddir)
- shutil.rmtree(test_prefix, ignore_errors=True)
- os.makedirs(test_prefix)
- os.environ['TEST_DATA_PREFIX'] = test_prefix
- cmd = 'tests/test-tdb.sh'
- ret = samba_utils.RUN_COMMAND(cmd)
- print("testsuite returned %d" % ret)
- # FIXME: Run python testsuite
- sys.exit(ret)
-
-def dist():
- '''makes a tarball for distribution'''
- samba_dist.dist()
-
-def reconfigure(ctx):
- '''reconfigure if config scripts have changed'''
- import samba_utils
- samba_utils.reconfigure(ctx)
diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py
index 1ffc8cd74a..518c28452b 100755
--- a/source4/selftest/tests.py
+++ b/source4/selftest/tests.py
@@ -93,7 +93,7 @@ for options in ['-U"$USERNAME%$PASSWORD"']:
for t in smb4torture_testsuites("ldap."):
plansmbtorturetestsuite(t, "dc", '-U"$USERNAME%$PASSWORD" //$SERVER_IP/_none_')
-ldbdir = os.path.join(samba4srcdir, "lib/ldb")
+ldbdir = os.path.join(srcdir(), "lib/ldb")
# Don't run LDB tests when using system ldb, as we won't have ldbtest installed
if os.path.exists(os.path.join(samba4bindir, "ldbtest")):
plantestsuite("ldb.base", "none", "%s/tests/test-tdb.sh" % ldbdir,
@@ -377,7 +377,7 @@ def plansambapythontestsuite(name, env, path, module, environ={}, extra_args=[])
plantestsuite(name, env, args)
-plansambapythontestsuite("ldb.python", "none", "%s/lib/ldb/tests/python/" % samba4srcdir, 'api')
+plansambapythontestsuite("ldb.python", "none", "%s/lib/ldb/tests/python/" % srcdir(), 'api')
planpythontestsuite("none", "samba.tests.credentials")
plantestsuite_idlist("samba.tests.gensec", "dc:local", [subunitrun, "$LISTOPT", '-U"$USERNAME%$PASSWORD"', "samba.tests.gensec"])
planpythontestsuite("none", "samba.tests.registry")