diff options
-rw-r--r-- | src/tests/cmocka/test_utils.c | 32 | ||||
-rw-r--r-- | src/util/usertools.c | 34 | ||||
-rw-r--r-- | src/util/util.h | 6 |
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); |