>From b3a7d8ee6e8b18ae487a9bc66c21249fb3025556 Mon Sep 17 00:00:00 2001
From: Simo Sorce <ssorce@redhat.com>
Date: Mon, 30 Nov 2009 15:40:36 -0500
Subject: [PATCH 2/3] Make strdn build functions more available

---
 server/db/sysdb.c     |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
 server/db/sysdb.h     |    4 ++++
 server/db/sysdb_ops.c |   48 ++++++------------------------------------------
 3 files changed, 58 insertions(+), 42 deletions(-)

diff --git a/server/db/sysdb.c b/server/db/sysdb.c
index b59ffa4..c77c67c 100644
--- a/server/db/sysdb.c
+++ b/server/db/sysdb.c
@@ -254,6 +254,54 @@ int sysdb_attrs_add_time_t(struct sysdb_attrs *attrs,
     return ret;
 }
 
+static char *build_dom_dn_str_escape(TALLOC_CTX *memctx, const char *template,
+                                     const char *domain, const char *name)
+{
+    char *ret;
+    int l;
+
+    l = strcspn(name, ",=\n+<>#;\\\"");
+    if (name[l] != '\0') {
+        struct ldb_val v;
+        char *tmp;
+
+        v.data = discard_const_p(uint8_t, name);
+        v.length = strlen(name);
+
+        tmp = ldb_dn_escape_value(memctx, v);
+        if (!tmp) {
+            return NULL;
+        }
+
+        ret = talloc_asprintf(memctx, template, tmp, domain);
+        talloc_zfree(tmp);
+        if (!ret) {
+            return NULL;
+        }
+
+        return ret;
+    }
+
+    ret = talloc_asprintf(memctx, template, name, domain);
+    if (!ret) {
+        return NULL;
+    }
+
+    return ret;
+}
+
+char *sysdb_user_strdn(TALLOC_CTX *memctx,
+                       const char *domain, const char *name)
+{
+    return build_dom_dn_str_escape(memctx, SYSDB_TMPL_USER, domain, name);
+}
+
+char *sysdb_group_strdn(TALLOC_CTX *memctx,
+                        const char *domain, const char *name)
+{
+    return build_dom_dn_str_escape(memctx, SYSDB_TMPL_GROUP, domain, name);
+}
+
 /* TODO: make a more complete and precise mapping */
 int sysdb_error_to_errno(int ldberr)
 {
diff --git a/server/db/sysdb.h b/server/db/sysdb.h
index bc2bf66..33e1728 100644
--- a/server/db/sysdb.h
+++ b/server/db/sysdb.h
@@ -192,6 +192,10 @@ struct ldb_dn *sysdb_custom_subtree_dn(struct sysdb_ctx *ctx, void *memctx,
                                        const char *domain,
                                        const char *subtree_name);
 
+char *sysdb_user_strdn(TALLOC_CTX *memctx,
+                       const char *domain, const char *name);
+char *sysdb_group_strdn(TALLOC_CTX *memctx,
+                        const char *domain, const char *name);
 
 
 struct ldb_context *sysdb_ctx_get_ldb(struct sysdb_ctx *ctx);
diff --git a/server/db/sysdb_ops.c b/server/db/sysdb_ops.c
index da53fd3..93c24b1 100644
--- a/server/db/sysdb_ops.c
+++ b/server/db/sysdb_ops.c
@@ -2769,42 +2769,6 @@ int sysdb_store_user_recv(struct tevent_req *req)
 
 /* =Store-Group-(Native/Legacy)-(replaces-existing-data)================== */
 
-static char *build_dom_dn_str_escape(TALLOC_CTX *memctx, const char *template,
-                                     const char *domain, const char *name)
-{
-    char *ret;
-    int l;
-
-    l = strcspn(name, ",=\n+<>#;\\\"");
-    if (name[l] != '\0') {
-        struct ldb_val v;
-        char *tmp;
-
-        v.data = discard_const_p(uint8_t, name);
-        v.length = strlen(name);
-
-        tmp = ldb_dn_escape_value(memctx, v);
-        if (!tmp) {
-            return NULL;
-        }
-
-        ret = talloc_asprintf(memctx, template, tmp, domain);
-        talloc_zfree(tmp);
-        if (!ret) {
-            return NULL;
-        }
-
-        return ret;
-    }
-
-    ret = talloc_asprintf(memctx, template, name, domain);
-    if (!ret) {
-        return NULL;
-    }
-
-    return ret;
-}
-
 /* this function does not check that all user members are actually present */
 
 struct sysdb_store_group_state {
@@ -2909,9 +2873,9 @@ static void sysdb_store_group_check(struct tevent_req *subreq)
         for (i = 0; state->member_users && state->member_users[i]; i++) {
             char *member;
 
-            member = build_dom_dn_str_escape(state, SYSDB_TMPL_USER,
-                                             state->domain->name,
-                                             state->member_users[i]);
+            member = sysdb_user_strdn(state,
+                                      state->domain->name,
+                                      state->member_users[i]);
             if (!member) {
                 DEBUG(4, ("Error: Out of memory\n"));
                 tevent_req_error(req, ENOMEM);
@@ -2932,9 +2896,9 @@ static void sysdb_store_group_check(struct tevent_req *subreq)
         for (i = 0; state->member_groups && state->member_groups[i]; i++) {
             char *member;
 
-            member = build_dom_dn_str_escape(state, SYSDB_TMPL_GROUP,
-                                             state->domain->name,
-                                             state->member_groups[i]);
+            member = sysdb_group_strdn(state,
+                                       state->domain->name,
+                                       state->member_groups[i]);
             if (!member) {
                 DEBUG(4, ("Error: Out of memory\n"));
                 tevent_req_error(req, ENOMEM);
-- 
1.6.2.5

