mirror of
https://github.com/samba-team/samba.git
synced 2024-12-28 07:21:54 +03:00
r8515: ldb_dn_cmp now uses ldb_dn_compare so that the DNs are compared
on a content level not ona form level, his means that the 2 DNs: a) cn= user, dc=this, dc = is,dc=test b) cn=user,dc=this,dc=is,dc=test are now identical even if the string form differ (spaces)
This commit is contained in:
parent
876f0a095b
commit
76d496c308
@ -450,6 +450,29 @@ int ldb_dn_compare(struct ldb_context *ldb,
|
||||
return ldb_dn_compare_base(ldb, edn0, edn1);
|
||||
}
|
||||
|
||||
int ldb_dn_cmp(struct ldb_context *ldb, const char *dn0, const char *dn1)
|
||||
{
|
||||
struct ldb_dn *edn0;
|
||||
struct ldb_dn *edn1;
|
||||
int ret;
|
||||
|
||||
edn0 = ldb_dn_explode_casefold(ldb, dn0);
|
||||
if (edn0 == NULL) return 0;
|
||||
|
||||
edn1 = ldb_dn_explode_casefold(ldb, dn1);
|
||||
if (edn1 == NULL) {
|
||||
talloc_free(edn0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = ldb_dn_compare(ldb, edn0, edn1);
|
||||
|
||||
talloc_free(edn0);
|
||||
talloc_free(edn1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
casefold a dn. We need to casefold the attribute names, and canonicalize
|
||||
attribute values of case insensitive attributes.
|
||||
|
@ -72,15 +72,6 @@ int ldb_caseless_cmp(const char *s1, const char *s2)
|
||||
return s2[i];
|
||||
}
|
||||
|
||||
/*
|
||||
compare two basedn fields
|
||||
return 0 for match
|
||||
*/
|
||||
int ldb_dn_cmp(const char *dn1, const char *dn2)
|
||||
{
|
||||
return ldb_caseless_cmp(dn1, dn2);
|
||||
}
|
||||
|
||||
/*
|
||||
compare two attributes
|
||||
return 0 for match
|
||||
|
@ -335,7 +335,7 @@ int ldb_attrib_add_handlers(struct ldb_context *ldb,
|
||||
|
||||
/* useful functions for ldb_message structure manipulation */
|
||||
|
||||
int ldb_dn_cmp(const char *dn1, const char *dn2);
|
||||
int ldb_dn_cmp(struct ldb_context *ldb, const char *dn1, const char *dn2);
|
||||
int ldb_attr_cmp(const char *dn1, const char *dn2);
|
||||
|
||||
/* case-fold a DN */
|
||||
|
@ -93,12 +93,14 @@ static int modify_record(struct ldb_context *ldb,
|
||||
/*
|
||||
find dn in msgs[]
|
||||
*/
|
||||
static struct ldb_message *msg_find(struct ldb_message **msgs, int count,
|
||||
static struct ldb_message *msg_find(struct ldb_context *ldb,
|
||||
struct ldb_message **msgs,
|
||||
int count,
|
||||
const char *dn)
|
||||
{
|
||||
int i;
|
||||
for (i=0;i<count;i++) {
|
||||
if (ldb_dn_cmp(dn, msgs[i]->dn) == 0) {
|
||||
if (ldb_dn_cmp(ldb, dn, msgs[i]->dn) == 0) {
|
||||
return msgs[i];
|
||||
}
|
||||
}
|
||||
@ -119,7 +121,7 @@ static int merge_edits(struct ldb_context *ldb,
|
||||
|
||||
/* do the adds and modifies */
|
||||
for (i=0;i<count2;i++) {
|
||||
msg = msg_find(msgs1, count1, msgs2[i]->dn);
|
||||
msg = msg_find(ldb, msgs1, count1, msgs2[i]->dn);
|
||||
if (!msg) {
|
||||
if (options->verbose > 0) {
|
||||
ldif_write_msg(ldb, stdout, LDB_CHANGETYPE_ADD, msgs2[i]);
|
||||
@ -139,7 +141,7 @@ static int merge_edits(struct ldb_context *ldb,
|
||||
|
||||
/* do the deletes */
|
||||
for (i=0;i<count1;i++) {
|
||||
msg = msg_find(msgs2, count2, msgs1[i]->dn);
|
||||
msg = msg_find(ldb, msgs2, count2, msgs1[i]->dn);
|
||||
if (!msg) {
|
||||
if (options->verbose > 0) {
|
||||
ldif_write_msg(ldb, stdout, LDB_CHANGETYPE_DELETE, msgs1[i]);
|
||||
|
@ -55,10 +55,12 @@ static void usage(void)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
struct ldb_context *ldbsearch_ldb;
|
||||
|
||||
static int do_compare_msg(struct ldb_message **el1,
|
||||
struct ldb_message **el2)
|
||||
struct ldb_message **el2)
|
||||
{
|
||||
return ldb_dn_cmp((*el1)->dn, (*el2)->dn);
|
||||
return ldb_dn_cmp(ldbsearch_ldb, (*el1)->dn, (*el2)->dn);
|
||||
}
|
||||
|
||||
static int do_search(struct ldb_context *ldb,
|
||||
@ -79,6 +81,7 @@ static int do_search(struct ldb_context *ldb,
|
||||
|
||||
printf("# returned %d records\n", ret);
|
||||
|
||||
ldbsearch_ldb = ldb;
|
||||
if (sort_attribs) {
|
||||
qsort(msgs, ret, sizeof(struct ldb_message *),
|
||||
(comparison_fn_t)do_compare_msg);
|
||||
|
Loading…
Reference in New Issue
Block a user