Return per-entry controls in ldb_module_send_entry()
authorAndrew Bartlett <abartlet@samba.org>
Fri, 12 Dec 2008 01:34:02 +0000 (12:34 +1100)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 12 Dec 2008 01:34:02 +0000 (12:34 +1100)
Returning a control on each result is how the OpenLDAP dereference
control operates.

Andrew Bartlett

25 files changed:
source4/dsdb/samdb/ldb_modules/anr.c
source4/dsdb/samdb/ldb_modules/extended_dn_in.c
source4/dsdb/samdb/ldb_modules/extended_dn_out.c
source4/dsdb/samdb/ldb_modules/extended_dn_store.c
source4/dsdb/samdb/ldb_modules/kludge_acl.c
source4/dsdb/samdb/ldb_modules/local_password.c
source4/dsdb/samdb/ldb_modules/normalise.c
source4/dsdb/samdb/ldb_modules/partition.c
source4/dsdb/samdb/ldb_modules/proxy.c
source4/dsdb/samdb/ldb_modules/ranged_results.c
source4/dsdb/samdb/ldb_modules/rootdse.c
source4/dsdb/samdb/ldb_modules/schema_fsmo.c
source4/dsdb/samdb/ldb_modules/show_deleted.c
source4/lib/ldb/common/ldb_modules.c
source4/lib/ldb/include/ldb_private.h
source4/lib/ldb/ldb_ildap/ldb_ildap.c
source4/lib/ldb/ldb_ldap/ldb_ldap.c
source4/lib/ldb/ldb_map/ldb_map_outbound.c
source4/lib/ldb/ldb_tdb/ldb_index.c
source4/lib/ldb/ldb_tdb/ldb_search.c
source4/lib/ldb/modules/asq.c
source4/lib/ldb/modules/operational.c
source4/lib/ldb/modules/paged_results.c
source4/lib/ldb/modules/paged_searches.c
source4/lib/ldb/modules/sort.c

index da23030..49e453f 100644 (file)
@@ -289,7 +289,7 @@ static int anr_search_callback(struct ldb_request *req, struct ldb_reply *ares)
 
        switch (ares->type) {
        case LDB_REPLY_ENTRY:
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                return ldb_module_send_referral(ac->req, ares->referral);
index f21c171..c3db4fa 100644 (file)
@@ -58,7 +58,7 @@ static int extended_final_callback(struct ldb_request *req, struct ldb_reply *ar
                switch (ares->type) {
                case LDB_REPLY_ENTRY:
                        
-                       ret = ldb_module_send_entry(ac->req, ares->message);
+                       ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                        break;
                case LDB_REPLY_REFERRAL:
                        
index 1b38168..f284c71 100644 (file)
@@ -322,7 +322,7 @@ static int extended_callback(struct ldb_request *req, struct ldb_reply *ares)
                        talloc_free(dn);
                }
        }
-       return ldb_module_send_entry(ac->req, msg);
+       return ldb_module_send_entry(ac->req, msg, ares->controls);
 }
 
 
index f497b29..2ab036a 100644 (file)
@@ -99,7 +99,7 @@ static int extended_final_callback(struct ldb_request *req, struct ldb_reply *ar
                switch (ares->type) {
                case LDB_REPLY_ENTRY:
                        
-                       ret = ldb_module_send_entry(ac->req, ares->message);
+                       ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                        break;
                case LDB_REPLY_REFERRAL:
                        
index 97179a8..275e9b5 100644 (file)
@@ -301,7 +301,7 @@ static int kludge_acl_callback(struct ldb_request *req, struct ldb_reply *ares)
                        }
                }
 
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                return ldb_module_send_referral(ac->req, ares->referral);
index 4e864e1..55d8957 100644 (file)
@@ -820,7 +820,7 @@ static int lpdb_local_search_callback(struct ldb_request *req,
                /* free the rest */
                talloc_free(ares);
 
-               return ldb_module_send_entry(ac->req, merge->message);
+               return ldb_module_send_entry(ac->req, merge->message, merge->controls);
 
        case LDB_REPLY_REFERRAL:
                /* ignore */
@@ -833,7 +833,7 @@ static int lpdb_local_search_callback(struct ldb_request *req,
 
                /* if this entry was not returned yet, return it now */
                if (lr->remote) {
-                       ret = ldb_module_send_entry(ac->req, ac->remote->message);
+                       ret = ldb_module_send_entry(ac->req, ac->remote->message, ac->remote->controls);
                        if (ret != LDB_SUCCESS) {
                                return ldb_module_done(ac->req,
                                                        NULL, NULL, ret);
@@ -899,7 +899,7 @@ static int lpdb_remote_search_callback(struct ldb_request *req,
                                ldb_msg_remove_attr(ares->message, "objectClass");
                        }
                        
-                       return ldb_module_send_entry(ac->req, ares->message);
+                       return ldb_module_send_entry(ac->req, ares->message, ares->controls);
                }
 
                if (ldb_msg_find_ldb_val(ares->message, "objectGUID") == NULL) {
index d21a68f..f938672 100644 (file)
@@ -138,7 +138,7 @@ static int normalize_search_callback(struct ldb_request *req, struct ldb_reply *
                        }
                }
 
-               return ldb_module_send_entry(ac->req, msg);
+               return ldb_module_send_entry(ac->req, msg, ares->controls);
 
        case LDB_REPLY_REFERRAL:
 
index 5500c75..0d2ce64 100644 (file)
@@ -186,7 +186,7 @@ static int partition_req_callback(struct ldb_request *req,
                        return ldb_module_done(ac->req, NULL, NULL,
                                                LDB_ERR_OPERATIONS_ERROR);
                }
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_DONE:
                if (ares->error == LDB_SUCCESS) {
index 2ff4229..23116be 100644 (file)
@@ -280,7 +280,7 @@ static int proxy_search_callback(struct ldb_request *req,
                ac->count++;
 #endif
                proxy_convert_record(ac->module->ldb, proxy, ares->message);
-               ret = ldb_module_send_entry(ac->req, ares->message);
+               ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                break;
 
        case LDB_REPLY_REFERRAL:
index b8e43a7..eeb161b 100644 (file)
@@ -164,7 +164,7 @@ static int rr_search_callback(struct ldb_request *req, struct ldb_reply *ares)
                }
        }
 
-       return ldb_module_send_entry(ac->req, ares->message);
+       return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 }
 
 /* search */
index 639d910..461a554 100644 (file)
@@ -278,7 +278,7 @@ static int rootdse_callback(struct ldb_request *req, struct ldb_reply *ares)
                        return ldb_module_done(ac->req, NULL, NULL, ret);
                }
 
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                /* should we allow the backend to return referrals in this case
index df409a8..bfcf239 100644 (file)
@@ -406,7 +406,7 @@ static int schema_fsmo_search_callback(struct ldb_request *req, struct ldb_reply
        case LDB_REPLY_ENTRY:
 
                if (ldb_dn_compare(ares->message->dn, mc->aggregate_dn) != 0) {
-                       return ldb_module_send_entry(ac->req, ares->message);
+                       return ldb_module_send_entry(ac->req, ares->message, ares->controls);
                }
 
                for (i=0; i < ARRAY_SIZE(generated_attrs); i++) {
@@ -418,7 +418,7 @@ static int schema_fsmo_search_callback(struct ldb_request *req, struct ldb_reply
                        }
                }
 
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
 
index 0e3b46d..0914e51 100644 (file)
@@ -64,7 +64,7 @@ static int show_deleted_search_callback(struct ldb_request *req,
        switch (ares->type) {
        case LDB_REPLY_ENTRY:
 
-               return ldb_module_send_entry(ar->req, ares->message);
+               return ldb_module_send_entry(ar->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                return ldb_module_send_referral(ar->req, ares->referral);
index 2b453bb..4ac404b 100644 (file)
@@ -580,10 +580,13 @@ struct ldb_handle *ldb_handle_new(TALLOC_CTX *mem_ctx, struct ldb_context *ldb)
  *      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_message *msg,
+                         struct ldb_control **ctrls)
 {
        struct ldb_reply *ares;
 
@@ -595,6 +598,7 @@ int ldb_module_send_entry(struct ldb_request *req,
        }
        ares->type = LDB_REPLY_ENTRY;
        ares->message = talloc_steal(ares, msg);
+       ares->controls = talloc_steal(ares, ctrls);
        ares->error = LDB_SUCCESS;
 
        return req->callback(req, ares);
index 38818a9..fecb25d 100644 (file)
@@ -268,7 +268,8 @@ void *ldb_dso_load_symbol(struct ldb_context *ldb, const char *name,
 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_message *msg,
+                         struct ldb_control **ctrls);
 
 int ldb_module_send_referral(struct ldb_request *req,
                                           char *ref);
index ae79bdf..b17d063 100644 (file)
@@ -311,7 +311,9 @@ static void ildb_callback(struct ldap_request *req)
                                ldbmsg->num_elements = search->num_attributes;
                                ldbmsg->elements = talloc_move(ldbmsg, &search->attributes);
 
-                               ret = ldb_module_send_entry(ac->req, ldbmsg);
+                               controls = talloc_steal(ac, msg->controls);
+                               
+                               ret = ldb_module_send_entry(ac->req, ldbmsg, controls);
                                if (ret != LDB_SUCCESS) {
                                        callback_failed = true;
                                }
index 7caee10..9f8b3e9 100644 (file)
@@ -515,7 +515,7 @@ static bool lldb_parse_result(struct lldb_context *ac, LDAPMessage *result)
                        }
                        if (berptr) ber_free(berptr, 0);
 
-                       ret = ldb_module_send_entry(ac->req, ldbmsg);
+                       ret = ldb_module_send_entry(ac->req, ldbmsg, NULL /* controls not yet supported */);
                        if (ret != LDB_SUCCESS) {
 
                                callback_failed = true;
index 5f524a8..5588eaa 100644 (file)
@@ -1077,7 +1077,7 @@ int map_return_entry(struct map_context *ac, struct ldb_reply *ares)
                }
        }
 
-       return ldb_module_send_entry(ac->req, ares->message);
+       return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 }
 
 /* Search a record. */
index 65711d9..2e959cd 100644 (file)
@@ -715,7 +715,7 @@ static int ltdb_index_filter(const struct dn_list *dn_list,
                        return LDB_ERR_OPERATIONS_ERROR;
                }
 
-               ret = ldb_module_send_entry(ac->req, msg);
+               ret = ldb_module_send_entry(ac->req, msg, NULL);
                if (ret != LDB_SUCCESS) {
                        ac->callback_failed = true;
                        return ret;
index 6ab06c4..35149c4 100644 (file)
@@ -418,7 +418,7 @@ static int search_func(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, voi
                return -1;
        }
 
-       ret = ldb_module_send_entry(ac->req, msg);
+       ret = ldb_module_send_entry(ac->req, msg, NULL);
        if (ret != LDB_SUCCESS) {
                ac->callback_failed = true;
                /* the callback failed, abort the operation */
index 835715e..c650970 100644 (file)
@@ -178,7 +178,7 @@ static int asq_reqs_callback(struct ldb_request *req, struct ldb_reply *ares)
        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);
+               ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                if (ret != LDB_SUCCESS) {
                        return ldb_module_done(ac->req, NULL, NULL, ret);
                }
index abb1d4c..345441b 100644 (file)
@@ -206,7 +206,7 @@ static int operational_callback(struct ldb_request *req, struct ldb_reply *ares)
                        return ldb_module_done(ac->req, NULL, NULL,
                                                LDB_ERR_OPERATIONS_ERROR);
                }
-               return ldb_module_send_entry(ac->req, ares->message);
+               return ldb_module_send_entry(ac->req, ares->message, ares->controls);
 
        case LDB_REPLY_REFERRAL:
                /* ignore referrals */
index 1a242f1..dfc565f 100644 (file)
@@ -147,7 +147,7 @@ static int paged_results(struct paged_context *ac)
 
        while (ac->store->num_entries > 0 && ac->size > 0) {
                msg = ac->store->first;
-               ret = ldb_module_send_entry(ac->req, msg->r->message);
+               ret = ldb_module_send_entry(ac->req, msg->r->message, msg->r->controls);
                if (ret != LDB_SUCCESS) {
                        return ret;
                }
index 7a728e3..56f9b1c 100644 (file)
@@ -161,7 +161,7 @@ static int ps_callback(struct ldb_request *req, struct ldb_reply *ares)
 
        switch (ares->type) {
        case LDB_REPLY_ENTRY:
-               ret = ldb_module_send_entry(ac->req, ares->message);
+               ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                if (ret != LDB_SUCCESS) {
                        return ldb_module_done(ac->req, NULL, NULL, ret);
                }
index 64d60f3..25e56b2 100644 (file)
@@ -152,7 +152,7 @@ static int server_sort_results(struct sort_context *ac)
                ares->type = LDB_REPLY_ENTRY;
                ares->message = talloc_move(ares, &ac->msgs[i]);
 
-               ret = ldb_module_send_entry(ac->req, ares->message);
+               ret = ldb_module_send_entry(ac->req, ares->message, ares->controls);
                if (ret != LDB_SUCCESS) {
                        return ret;
                }