From 282cc79454f7b708085a04d04e98d11ffec8b293 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 14 Feb 2010 10:37:20 +1100 Subject: [PATCH] s4-ldb: use TYPESAFE_QSORT() in the rest of the ldb code --- lib/util/tsort.h | 4 +++- source4/lib/ldb/common/ldb_dn.c | 4 ++-- source4/lib/ldb/common/ldb_msg.c | 4 ++-- source4/lib/ldb/include/ldb.h | 11 +++++++++++ source4/lib/ldb/ldb_tdb/ldb_index.c | 2 +- source4/lib/ldb/tools/ldbdel.c | 10 ++++------ 6 files changed, 23 insertions(+), 12 deletions(-) diff --git a/lib/util/tsort.h b/lib/util/tsort.h index 236b3699123..811d6cd2f77 100644 --- a/lib/util/tsort.h +++ b/lib/util/tsort.h @@ -27,12 +27,14 @@ a wrapper around qsort() that ensures the comparison function is type safe. */ +#ifndef TYPESAFE_QSORT #define TYPESAFE_QSORT(base, numel, comparison) \ do { \ if (numel > 1) { \ - qsort(base, numel, sizeof((base)[0]), QSORT_CAST comparison); \ + qsort(base, numel, sizeof((base)[0]), (int (*)(const void *, const void *))comparison); \ assert(comparison(&((base)[0]), &((base)[1])) <= 0); \ } \ } while (0) +#endif #endif diff --git a/source4/lib/ldb/common/ldb_dn.c b/source4/lib/ldb/common/ldb_dn.c index 252a0c632b1..c395be29007 100644 --- a/source4/lib/ldb/common/ldb_dn.c +++ b/source4/lib/ldb/common/ldb_dn.c @@ -824,8 +824,8 @@ char *ldb_dn_get_extended_linearized(void *mem_ctx, struct ldb_dn *dn, int mode) * the resulting DNs consistent, plus to ensure that we put * 'DELETED' first, so it can be very quickly recognised */ - qsort(dn->ext_components, dn->ext_comp_num, sizeof(dn->ext_components[0]), - ldb_dn_extended_component_compare); + TYPESAFE_QSORT(dn->ext_components, dn->ext_comp_num, + ldb_dn_extended_component_compare); for (i = 0; i < dn->ext_comp_num; i++) { const struct ldb_dn_extended_syntax *ext_syntax; diff --git a/source4/lib/ldb/common/ldb_msg.c b/source4/lib/ldb/common/ldb_msg.c index 9f90f334056..f4adb560b1d 100644 --- a/source4/lib/ldb/common/ldb_msg.c +++ b/source4/lib/ldb/common/ldb_msg.c @@ -464,8 +464,8 @@ struct ldb_dn *ldb_msg_find_attr_as_dn(struct ldb_context *ldb, */ void ldb_msg_sort_elements(struct ldb_message *msg) { - qsort(msg->elements, msg->num_elements, sizeof(struct ldb_message_element), - (comparison_fn_t)ldb_msg_element_compare_name); + TYPESAFE_QSORT(msg->elements, msg->num_elements, + ldb_msg_element_compare_name); } /* diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h index 26a196f3113..fc5d47ac321 100644 --- a/source4/lib/ldb/include/ldb.h +++ b/source4/lib/ldb/include/ldb.h @@ -2002,6 +2002,17 @@ do { \ } \ } while (0) +/* allow ldb to also call TYPESAFE_QSORT() */ +#ifndef TYPESAFE_QSORT +#define TYPESAFE_QSORT(base, numel, comparison) \ +do { \ + if (numel > 1) { \ + qsort(base, numel, sizeof((base)[0]), (int (*)(const void *, const void *))comparison); \ + comparison(&((base)[0]), &((base)[1])); \ + } \ +} while (0) +#endif + /** diff --git a/source4/lib/ldb/ldb_tdb/ldb_index.c b/source4/lib/ldb/ldb_tdb/ldb_index.c index 4b310210011..bb4617db090 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_index.c +++ b/source4/lib/ldb/ldb_tdb/ldb_index.c @@ -973,7 +973,7 @@ static void ltdb_dn_list_remove_duplicates(struct dn_list *list) return; } - qsort(list->dn, list->count, sizeof(struct ldb_val), (comparison_fn_t) dn_list_cmp); + TYPESAFE_QSORT(list->dn, list->count, dn_list_cmp); new_count = 1; for (i=1; icount; i++) { diff --git a/source4/lib/ldb/tools/ldbdel.c b/source4/lib/ldb/tools/ldbdel.c index 6de15ee042a..1b8adf714c9 100644 --- a/source4/lib/ldb/tools/ldbdel.c +++ b/source4/lib/ldb/tools/ldbdel.c @@ -34,13 +34,11 @@ #include "ldb.h" #include "tools/cmdline.h" #include "ldbutil.h" +#include "replace.h" -static int dn_cmp(const void *p1, const void *p2) +static int dn_cmp(struct ldb_message **msg1, struct ldb_message **msg2) { - const struct ldb_message *msg1, *msg2; - msg1 = *(const struct ldb_message * const *)p1; - msg2 = *(const struct ldb_message * const *)p2; - return ldb_dn_compare(msg1->dn, msg2->dn); + return ldb_dn_compare((*msg1)->dn, (*msg2)->dn); } static int ldb_delete_recursive(struct ldb_context *ldb, struct ldb_dn *dn,struct ldb_control **req_ctrls) @@ -53,7 +51,7 @@ static int ldb_delete_recursive(struct ldb_context *ldb, struct ldb_dn *dn,struc if (ret != LDB_SUCCESS) return -1; /* sort the DNs, deepest first */ - qsort(res->msgs, res->count, sizeof(res->msgs[0]), dn_cmp); + TYPESAFE_QSORT(res->msgs, res->count, dn_cmp); for (i = 0; i < res->count; i++) { if (ldb_delete_ctrl(ldb, res->msgs[i]->dn,req_ctrls) == 0) { -- 2.34.1