r16972: Replace the sequence_number function pointer in ldb with the ldb flags.
authorAndrew Bartlett <abartlet@samba.org>
Wed, 12 Jul 2006 04:59:41 +0000 (04:59 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:10:04 +0000 (14:10 -0500)
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
source4/ldap_server/ldap_backend.c
source4/ldap_server/ldap_server.c
source4/ldap_server/ldap_server.h
source4/lib/ldb/common/ldb.c
source4/lib/ldb/include/ldb_private.h
source4/lib/ldb/modules/operational.c

index 05ba7016538329b16098bd3f716bdeb21f9f7105..6f415132001fe350138e642cfcda7d1b7ef8cfd8 100644 (file)
@@ -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;
                }
index 0dafd0f312c290be20b04ce767cf57c52811c925..fcd282da9ea0530f97bf621a52d02fef2cdd5e60 100644 (file)
@@ -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;
 }
 
index 6f57073f185c55794ccb18df0f7168fd605075df..07b1bc6a27f04c03f18db351613661b8700d26a9 100644 (file)
@@ -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) {
index 033f8ef67cfd0ba724355c110892839964c0c46f..0b0b78ea7f400b70d8c528d9b8e19aabf6b4b527 100644 (file)
@@ -32,6 +32,8 @@ struct ldapsrv_connection {
        /* are we using gensec wrapping? */
        BOOL enable_wrap;
 
+       BOOL global_catalog;
+
        struct packet_context *packet;
 
        struct {
index c059646629d604b78e10d9ccdd12997d7b7d52cf..8e814778d10c2d05b6542f7c6c8214d3d63076b0 100644 (file)
@@ -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)
 {
index a10c3433525d0b7fb0b33229be85f47a84a0dbcc..2f2df1a97042bbf80a48d6fa8fbf56076b792204 100644 (file)
@@ -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  */
index b404e94580e3531058152f6b74bb367fcd5ca119..a15a553286acd9012574bdac3c87431923c4c0e8 100644 (file)
@@ -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);