From f545d5fa43ac0f08f69cf3e130a4b7be1d90784f Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 15 Oct 2009 10:49:25 +1100 Subject: s4:dsdb In partitions module, tell the caller what partition was used. This means we don't return any control for modifications to the control records in sam.ldb, but do if they modified one of the actual data LDB files. Andrew Bartlett --- source4/dsdb/samdb/ldb_modules/partition.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'source4') diff --git a/source4/dsdb/samdb/ldb_modules/partition.c b/source4/dsdb/samdb/ldb_modules/partition.c index d1892f0c54..64ec798e4c 100644 --- a/source4/dsdb/samdb/ldb_modules/partition.c +++ b/source4/dsdb/samdb/ldb_modules/partition.c @@ -66,7 +66,7 @@ static struct partition_context *partition_init_ctx(struct ldb_module *module, s * helper functions to call the next module in chain * */ -static int partition_request(struct ldb_module *module, struct ldb_request *request) +int partition_request(struct ldb_module *module, struct ldb_request *request) { int ret; switch (request->operation) { @@ -160,6 +160,7 @@ static int partition_req_callback(struct ldb_request *req, struct ldb_request *nreq; int ret, i; struct partition_private_data *data; + struct ldb_control *partition_ctrl; ac = talloc_get_type(req->context, struct partition_context); data = talloc_get_type(ac->module->private_data, struct partition_private_data); @@ -169,6 +170,21 @@ static int partition_req_callback(struct ldb_request *req, LDB_ERR_OPERATIONS_ERROR); } + partition_ctrl = ldb_request_get_control(req, DSDB_CONTROL_CURRENT_PARTITION_OID); + if (partition_ctrl && (ac->num_requests == 1 || ares->type == LDB_REPLY_ENTRY)) { + /* If we didn't fan this request out to mulitple partitions, + * or this is an individual search result, we can + * deterministily tell the caller what partition this was + * written to (repl_meta_data likes to know) */ + ret = ldb_reply_add_control(ares, + DSDB_CONTROL_CURRENT_PARTITION_OID, + false, partition_ctrl->data); + if (ret != LDB_SUCCESS) { + return ldb_module_done(ac->req, NULL, NULL, + ret); + } + } + if (ares->error != LDB_SUCCESS && !ac->got_success) { return ldb_module_done(ac->req, ares->controls, ares->response, ares->error); -- cgit