diff --git a/lib/ldb/tests/sample_module.c b/lib/ldb/tests/sample_module.c index bee40a5e80f..6ba9ed28b65 100644 --- a/lib/ldb/tests/sample_module.c +++ b/lib/ldb/tests/sample_module.c @@ -22,24 +22,75 @@ */ #include "replace.h" -#include "system/filesys.h" -#include "system/time.h" #include "ldb_module.h" +static int sample_add_callback(struct ldb_request *down_req, + struct ldb_reply *ares) +{ + struct ldb_request *req = + talloc_get_type_abort(down_req->context, + struct ldb_request); + + if (ares == NULL) { + return ldb_module_done(req, NULL, NULL, + LDB_ERR_OPERATIONS_ERROR); + } + + if (ares->type == LDB_REPLY_REFERRAL) { + return ldb_module_send_referral(req, ares->referral); + } + + if (ares->error != LDB_SUCCESS) { + return ldb_module_done(req, ares->controls, + ares->response, ares->error); + } + + if (ares->type != LDB_REPLY_DONE) { + return ldb_module_done(req, NULL, NULL, + LDB_ERR_OPERATIONS_ERROR); + } + + return ldb_module_done(req, ares->controls, + ares->response, LDB_SUCCESS); +} + 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"); + struct ldb_context *ldb = ldb_module_get_ctx(mod); + struct ldb_control *control = NULL; + struct ldb_message *msg = NULL; + struct ldb_request *down_req = NULL; + int ret; /* 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 { + if (control != NULL) { return LDB_ERR_UNWILLING_TO_PERFORM; } + + msg = ldb_msg_copy_shallow(req, req->op.add.message); + if (msg == NULL) { + return LDB_ERR_OPERATIONS_ERROR; + } + + ret = ldb_msg_add_fmt(msg, "touchedBy", "sample"); + if (ret != LDB_SUCCESS) { + return ret; + } + + ret = ldb_build_add_req(&down_req, ldb, req, + msg, + req->controls, + req, sample_add_callback, + req); + if (ret != LDB_SUCCESS) { + return ret; + } + + talloc_steal(down_req, msg); + + /* go on with the call chain */ + return ldb_next_request(mod, down_req); } static int sample_modify(struct ldb_module *mod, struct ldb_request *req) @@ -48,12 +99,12 @@ static int sample_modify(struct ldb_module *mod, struct ldb_request *req) /* 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 { + if (control != NULL) { return LDB_ERR_UNWILLING_TO_PERFORM; } + + /* not found go on */ + return ldb_next_request(mod, req); }