summaryrefslogtreecommitdiff
path: root/server/db
diff options
context:
space:
mode:
Diffstat (limited to 'server/db')
-rw-r--r--server/db/sysdb.c32
-rw-r--r--server/db/sysdb.h3
2 files changed, 35 insertions, 0 deletions
diff --git a/server/db/sysdb.c b/server/db/sysdb.c
index a2ac3b22..ae32ef4b 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(attrs, 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 642cc30a..0b474221 100644
--- a/server/db/sysdb.h
+++ b/server/db/sysdb.h
@@ -174,6 +174,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);