From 32ab51876728577375b954a04103f71ddd4d93dc Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 12 Jul 2006 04:59:41 +0000 Subject: r16972: Replace the sequence_number function pointer in ldb with the ldb flags. The function pointer was meant to be unused, this patch fixes partition.c to use ldb_sequence_number(). (No backend provided the pointer any more). Set the flags onto the ldb structure, so that all backends opened by the partitions module inherit the flags. Set the read-ony flag when accessed as the global catalog Modify the LDAP server to track that this query is for the global catalog (by incoming port), and set a opqaue pointer. Next step is to read that opaque pointer in the partitions module. Andrew Bartlett (This used to be commit a1161cb30e4ffa09657a89e03ca85dd6efd4feba) --- source4/dsdb/samdb/ldb_modules/partition.c | 2 +- source4/ldap_server/ldap_backend.c | 9 +++++++-- source4/ldap_server/ldap_server.c | 2 ++ source4/ldap_server/ldap_server.h | 2 ++ source4/lib/ldb/common/ldb.c | 10 ++++++---- source4/lib/ldb/include/ldb_private.h | 5 ++--- source4/lib/ldb/modules/operational.c | 23 ++++++++++++++--------- 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/source4/dsdb/samdb/ldb_modules/partition.c b/source4/dsdb/samdb/ldb_modules/partition.c index 05ba701653..6f41513200 100644 --- a/source4/dsdb/samdb/ldb_modules/partition.c +++ b/source4/dsdb/samdb/ldb_modules/partition.c @@ -363,7 +363,7 @@ static int partition_init(struct ldb_module *module) } data->partitions[i]->backend = private_path(data->partitions[i], p); - ret = ldb_connect_backend(module->ldb, data->partitions[i]->backend, 0, NULL, &data->partitions[i]->module); + ret = ldb_connect_backend(module->ldb, data->partitions[i]->backend, NULL, &data->partitions[i]->module); if (ret != LDB_SUCCESS) { return ret; } diff --git a/source4/ldap_server/ldap_backend.c b/source4/ldap_server/ldap_backend.c index 0dafd0f312..fcd282da9e 100644 --- a/source4/ldap_server/ldap_backend.c +++ b/source4/ldap_server/ldap_backend.c @@ -24,7 +24,7 @@ #include "libcli/ldap/ldap.h" #include "lib/ldb/include/ldb.h" #include "lib/ldb/include/ldb_errors.h" -#include "dsdb/samdb/samdb.h" +#include "lib/db_wrap.h" #define VALID_DN_SYNTAX(dn,i) do {\ if (!(dn)) {\ @@ -49,12 +49,17 @@ static int map_ldb_error(struct ldb_context *ldb, int err, const char **errstrin */ NTSTATUS ldapsrv_backend_Init(struct ldapsrv_connection *conn) { - conn->ldb = samdb_connect(conn, conn->session_info); + conn->ldb = ldb_wrap_connect(conn, lp_sam_url(), conn->session_info, + NULL, conn->global_catalog ? LDB_FLG_RDONLY : 0, NULL); if (conn->ldb == NULL) { return NT_STATUS_INTERNAL_DB_CORRUPTION; } ldb_set_opaque(conn->ldb, "server_credentials", conn->server_credentials); + if (conn->global_catalog) { + ldb_set_opaque(conn->ldb, "global_catalog", (void *)(-1)); + } + return NT_STATUS_OK; } diff --git a/source4/ldap_server/ldap_server.c b/source4/ldap_server/ldap_server.c index 6f57073f18..07b1bc6a27 100644 --- a/source4/ldap_server/ldap_server.c +++ b/source4/ldap_server/ldap_server.c @@ -433,6 +433,8 @@ static void ldapsrv_accept(struct stream_connection *c) ldapsrv_terminate_connection(conn, "ldapsrv_accept: tls_init_server() failed"); return; } + } else if (port == 3268) /* Global catalog */ { + conn->global_catalog = True; } conn->packet = packet_init(conn); if (conn->packet == NULL) { diff --git a/source4/ldap_server/ldap_server.h b/source4/ldap_server/ldap_server.h index 033f8ef67c..0b0b78ea7f 100644 --- a/source4/ldap_server/ldap_server.h +++ b/source4/ldap_server/ldap_server.h @@ -32,6 +32,8 @@ struct ldapsrv_connection { /* are we using gensec wrapping? */ BOOL enable_wrap; + BOOL global_catalog; + struct packet_context *packet; struct { diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c index c059646629..8e814778d1 100644 --- a/source4/lib/ldb/common/ldb.c +++ b/source4/lib/ldb/common/ldb.c @@ -103,7 +103,7 @@ static ldb_connect_fn ldb_find_backend(const char *url) 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_connect_backend(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[], +int ldb_connect_backend(struct ldb_context *ldb, const char *url, const char *options[], struct ldb_module **backend_module) { int ret; @@ -132,7 +132,7 @@ int ldb_connect_backend(struct ldb_context *ldb, const char *url, unsigned int f return LDB_ERR_OTHER; } - ret = fn(ldb, url, flags, options, backend_module); + ret = fn(ldb, url, ldb->flags, options, backend_module); if (ret != LDB_SUCCESS) { ldb_debug(ldb, LDB_DEBUG_ERROR, "Failed to connect to '%s'\n", url); @@ -156,7 +156,9 @@ int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, co { int ret; - ret = ldb_connect_backend(ldb, url, flags, options, &ldb->modules); + ldb->flags = flags; + + ret = ldb_connect_backend(ldb, url, options, &ldb->modules); if (ret != LDB_SUCCESS) { return ret; } @@ -701,7 +703,7 @@ int ldb_rename(struct ldb_context *ldb, const struct ldb_dn *olddn, const struct /* - rename a record in the database + return the global sequence number */ int ldb_sequence_number(struct ldb_context *ldb, uint64_t *seq_num) { diff --git a/source4/lib/ldb/include/ldb_private.h b/source4/lib/ldb/include/ldb_private.h index a10c343352..2f2df1a970 100644 --- a/source4/lib/ldb/include/ldb_private.h +++ b/source4/lib/ldb/include/ldb_private.h @@ -117,8 +117,7 @@ struct ldb_context { int default_timeout; - /* a backend supplied highestCommittedUSN function */ - uint64_t (*sequence_number)(struct ldb_context *); + unsigned int flags; }; #ifndef ARRAY_SIZE @@ -132,7 +131,7 @@ struct ldb_context { /* The following definitions come from lib/ldb/common/ldb.c */ -int ldb_connect_backend(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[], +int ldb_connect_backend(struct ldb_context *ldb, const char *url, const char *options[], struct ldb_module **backend_module); /* The following definitions come from lib/ldb/common/ldb_modules.c */ diff --git a/source4/lib/ldb/modules/operational.c b/source4/lib/ldb/modules/operational.c index b404e94580..a15a553286 100644 --- a/source4/lib/ldb/modules/operational.c +++ b/source4/lib/ldb/modules/operational.c @@ -349,6 +349,7 @@ static int operational_add(struct ldb_module *module, struct ldb_request *req) struct ldb_request *down_req; struct ldb_message *msg; time_t t = time(NULL); + uint64_t seq_num; int ret; if (ldb_dn_is_special(req->op.add.message->dn)) { @@ -373,9 +374,9 @@ static int operational_add(struct ldb_module *module, struct ldb_request *req) return LDB_ERR_OPERATIONS_ERROR; } - /* see if the backend can give us the USN */ - if (module->ldb->sequence_number != NULL) { - uint64_t seq_num = module->ldb->sequence_number(module->ldb); + /* Get a sequence number from the backend */ + ret = ldb_sequence_number(module->ldb, &seq_num); + if (ret == LDB_SUCCESS) { if (add_uint64_element(msg, "uSNCreated", seq_num) != 0 || add_uint64_element(msg, "uSNChanged", seq_num) != 0) { talloc_free(down_req); @@ -405,6 +406,7 @@ static int operational_modify(struct ldb_module *module, struct ldb_request *req struct ldb_request *down_req; struct ldb_message *msg; time_t t = time(NULL); + uint64_t seq_num; int ret; if (ldb_dn_is_special(req->op.mod.message->dn)) { @@ -428,12 +430,15 @@ static int operational_modify(struct ldb_module *module, struct ldb_request *req return LDB_ERR_OPERATIONS_ERROR; } - /* update the records USN if possible */ - if (module->ldb->sequence_number != NULL && - add_uint64_element(msg, "uSNChanged", - module->ldb->sequence_number(module->ldb)) != 0) { - talloc_free(down_req); - return -1; + /* Get a sequence number from the backend */ + ret = ldb_sequence_number(module->ldb, &seq_num); + if (ret == LDB_SUCCESS) { + /* update the records USN if possible */ + if (add_uint64_element(msg, "uSNChanged", + seq_num) != 0) { + talloc_free(down_req); + return -1; + } } ldb_set_timeout_from_prev_req(module->ldb, req, down_req); -- cgit