[SSSD] [PATCH] Add sysdb_attrs_replace_name to sysdb API

Sumit Bose sbose at redhat.com
Wed Nov 4 11:53:22 UTC 2009


Hi,

this patch adds the sysdb_attrs_replace_name() call to replace the name
of an attribute with a new one. This is useful if you want to store the
results of an LDAP query in sysdb, but need to replace certain attribute
names, e.g. member or memberOf.

bye,
Sumit
-------------- next part --------------
>From 68d17d27f4f876e2060b93bbeb981a5a97667182 Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose at redhat.com>
Date: Wed, 4 Nov 2009 12:36:25 +0100
Subject: [PATCH] Add sysdb_attrs_replace_name to sysdb API.

---
 server/db/sysdb.c          |   32 +++++++++++++++++++++++++++++++
 server/db/sysdb.h          |    3 ++
 server/tests/sysdb-tests.c |   45 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/server/db/sysdb.c b/server/db/sysdb.c
index a2ac3b2..f090960 100644
--- a/server/db/sysdb.c
+++ b/server/db/sysdb.c
@@ -1429,3 +1429,35 @@ int compare_ldb_dn_comp_num(const void *m1, const void *m2)
     return ldb_dn_get_comp_num(msg2->dn) - ldb_dn_get_comp_num(msg1->dn);
 }
 
+int sysdb_attrs_replace_name(struct sysdb_attrs *attrs, const char *oldname,
+                             const char *newname)
+{
+    struct ldb_message_element *e = NULL;
+    int i;
+    const char *dummy;
+
+    if (attrs == NULL || oldname == NULL || newname == NULL) return EINVAL;
+
+    for (i = 0; i < attrs->num; i++) {
+        if (strcasecmp(oldname, attrs->a[i].name) == 0) {
+            e = &(attrs->a[i]);
+        }
+        if (strcasecmp(newname, attrs->a[i].name) == 0) {
+            DEBUG(3, ("New attribute name [%s] already exists.\n", newname));
+            return EEXIST;
+        }
+    }
+
+    if (e != NULL) {
+        dummy = talloc_strdup(e, newname);
+        if (dummy == NULL) {
+            DEBUG(1, ("talloc_strdup failed.\n"));
+            return ENOMEM;
+        }
+
+        talloc_free(discard_const(e->name));
+        e->name = dummy;
+    }
+
+    return EOK;
+}
diff --git a/server/db/sysdb.h b/server/db/sysdb.h
index 72f56db..8d6bd76 100644
--- a/server/db/sysdb.h
+++ b/server/db/sysdb.h
@@ -171,6 +171,9 @@ int sysdb_attrs_get_el(struct sysdb_attrs *attrs, const char *name,
 int sysdb_attrs_steal_string(struct sysdb_attrs *attrs,
                              const char *name, char *str);
 
+int sysdb_attrs_replace_name(struct sysdb_attrs *attrs, const char *oldname,
+                                 const char *newname);
+
 /* convert an ldb error into an errno error */
 int sysdb_error_to_errno(int ldberr);
 
diff --git a/server/tests/sysdb-tests.c b/server/tests/sysdb-tests.c
index ed61e27..d08a155 100644
--- a/server/tests/sysdb-tests.c
+++ b/server/tests/sysdb-tests.c
@@ -2310,6 +2310,49 @@ START_TEST (test_sysdb_delete_recursive)
 }
 END_TEST
 
+START_TEST (test_sysdb_attrs_replace_name)
+{
+    struct sysdb_attrs *attrs;
+    struct ldb_message_element *el;
+    int ret;
+
+    attrs = sysdb_new_attrs(NULL);
+    fail_unless(attrs != NULL, "sysdb_new_attrs failed");
+
+    ret = sysdb_attrs_add_string(attrs, "foo", "bar");
+    fail_unless(ret == EOK, "sysdb_attrs_add_string failed");
+
+    ret = sysdb_attrs_add_string(attrs, "fool", "bool");
+    fail_unless(ret == EOK, "sysdb_attrs_add_string failed");
+
+    ret = sysdb_attrs_add_string(attrs, "foot", "boot");
+    fail_unless(ret == EOK, "sysdb_attrs_add_string failed");
+
+    ret = sysdb_attrs_replace_name(attrs, "foo", "foot");
+    fail_unless(ret == EEXIST,
+                "sysdb_attrs_replace overwrites existing attribute");
+
+    ret = sysdb_attrs_replace_name(attrs, "foo", "oof");
+    fail_unless(ret == EOK, "sysdb_attrs_replace failed");
+
+    ret = sysdb_attrs_get_el(attrs, "foo", &el);
+    fail_unless(ret == EOK, "sysdb_attrs_get_el failed");
+    fail_unless(el->num_values == 0, "Attribute foo is not empty.");
+
+    ret = sysdb_attrs_get_el(attrs, "oof", &el);
+    fail_unless(ret == EOK, "sysdb_attrs_get_el failed");
+    fail_unless(el->num_values == 1,
+                "Wrong number of values for attribute oof, "
+                "expected [1] got [%d].", el->num_values);
+    fail_unless(strncmp("bar", (char *) el->values[0].data,
+                        el->values[0].length) == 0,
+                "Wrong value, expected [bar] got [%.*s]", el->values[0].length,
+                                                          el->values[0].data);
+
+    talloc_free(attrs);
+}
+END_TEST
+
 Suite *create_sysdb_suite(void)
 {
     Suite *s = suite_create("sysdb");
@@ -2404,6 +2447,8 @@ Suite *create_sysdb_suite(void)
     /* test recursive delete */
     tcase_add_test(tc_sysdb, test_sysdb_delete_recursive);
 
+    tcase_add_test(tc_sysdb, test_sysdb_attrs_replace_name);
+
 /* Add all test cases to the test suite */
     suite_add_tcase(s, tc_sysdb);
 
-- 
1.6.2.5



More information about the sssd-devel mailing list