summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/tests/cmocka/test_utils.c32
-rw-r--r--src/util/usertools.c34
-rw-r--r--src/util/util.h6
3 files changed, 72 insertions, 0 deletions
diff --git a/src/tests/cmocka/test_utils.c b/src/tests/cmocka/test_utils.c
index 874168c2b..456629581 100644
--- a/src/tests/cmocka/test_utils.c
+++ b/src/tests/cmocka/test_utils.c
@@ -1650,6 +1650,35 @@ static void test_sss_create_internal_fqname(void **state)
assert_true(check_leaks_pop(global_talloc_context) == true);
}
+static void test_sss_create_internal_fqname_list(void **state)
+{
+ char **fqlist = NULL;
+ const char *in_list1[] = { "aaa", "bbb", NULL };
+
+ check_leaks_push(global_talloc_context);
+
+ fqlist = sss_create_internal_fqname_list(global_talloc_context,
+ in_list1, "DOM");
+ assert_string_equal(fqlist[0], "aaa@dom");
+ assert_string_equal(fqlist[1], "bbb@dom");
+ assert_null(fqlist[2]);
+ talloc_zfree(fqlist);
+
+ fqlist = sss_create_internal_fqname_list(global_talloc_context,
+ in_list1, NULL);
+ assert_null(fqlist);
+
+ fqlist = sss_create_internal_fqname_list(global_talloc_context,
+ NULL, "DOM");
+ assert_null(fqlist);
+
+ fqlist = sss_create_internal_fqname_list(global_talloc_context,
+ NULL, NULL);
+ assert_null(fqlist);
+
+ assert_true(check_leaks_pop(global_talloc_context) == true);
+}
+
int main(int argc, const char *argv[])
{
poptContext pc;
@@ -1738,6 +1767,9 @@ int main(int argc, const char *argv[])
cmocka_unit_test_setup_teardown(test_sss_create_internal_fqname,
setup_leak_tests,
teardown_leak_tests),
+ cmocka_unit_test_setup_teardown(test_sss_create_internal_fqname_list,
+ setup_leak_tests,
+ teardown_leak_tests),
};
/* Set debug level to invalid value so we can deside if -d 0 was used. */
diff --git a/src/util/usertools.c b/src/util/usertools.c
index 44a56ed97..ee2e86264 100644
--- a/src/util/usertools.c
+++ b/src/util/usertools.c
@@ -797,3 +797,37 @@ char *sss_create_internal_fqname(TALLOC_CTX *mem_ctx,
done:
return fqname;
}
+
+/* Creates a list of internal fqnames in format shortname@domname.
+ * The domain portion is lowercased. */
+char **sss_create_internal_fqname_list(TALLOC_CTX *mem_ctx,
+ const char * const *shortname_list,
+ const char *dom_name)
+{
+ char **fqname_list = NULL;
+ size_t c;
+
+ if (shortname_list == NULL || dom_name == NULL) {
+ /* Avoid allocating null@null */
+ return NULL;
+ }
+
+ for (c = 0; shortname_list[c] != NULL; c++);
+ fqname_list = talloc_zero_array(mem_ctx, char *, c+1);
+ if (fqname_list == NULL) {
+ talloc_free(fqname_list);
+ return NULL;
+ }
+
+ for (size_t i = 0; shortname_list[i] != NULL; i++) {
+ fqname_list[i] = sss_create_internal_fqname(fqname_list,
+ shortname_list[i],
+ dom_name);
+ if (fqname_list == NULL) {
+ talloc_free(fqname_list);
+ return NULL;
+ }
+ }
+
+ return fqname_list;
+}
diff --git a/src/util/util.h b/src/util/util.h
index 57e9d9f9e..cd975c2c8 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -284,6 +284,12 @@ char *sss_create_internal_fqname(TALLOC_CTX *mem_ctx,
const char *shortname,
const char *dom_name);
+/* Creates internal fqnames list in format shortname@domname.
+ * The domain portion is lowercased. */
+char **sss_create_internal_fqname_list(TALLOC_CTX *mem_ctx,
+ const char * const *shortname_list,
+ const char *dom_name);
+
/* from backup-file.c */
int backup_file(const char *src, int dbglvl);