-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 07/29/2010 01:35 PM, Jakub Hrozek wrote: > > + attrs_list[1] = sysdb_new_attrs(test_ctx); > + sysdb_attrs_add_string(attrs_list[1], "test_attr", "attr2"); > + attrs_list[2] = sysdb_new_attrs(test_ctx); > + sysdb_attrs_add_string(attrs_list[1], "nottest_attr", "attr3"); > > I think the second sysdb_attrs_add_string() was supposed to say > 'attr_list[2]'? > > Otherwise looks fine. >
Thanks, that was a typo. Corrected patch attached. - -- Stephen Gallagher RHCE 804006346421761 Delivering value year after year. Red Hat ranks #1 in value among software vendors. http://www.redhat.com/promo/vendor/ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.14 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iEYEARECAAYFAkxRyK8ACgkQeiVVYja6o6P/PQCfS/yoqLo0p84U1fqcPiyUUECz PEoAoJowO84PuBc3TQHTURCpKPvHldHh =NjRG -----END PGP SIGNATURE-----
From 34b9e5c0495c3a91b5532df74419143e04e60964 Mon Sep 17 00:00:00 2001 From: Stephen Gallagher <sgall...@redhat.com> Date: Fri, 23 Jul 2010 13:20:40 -0400 Subject: [PATCH 1/6] Add sysdb_attrs_to_list() utility function --- src/db/sysdb.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ src/db/sysdb.h | 6 ++++ src/tests/sysdb-tests.c | 31 +++++++++++++++++++ 3 files changed, 112 insertions(+), 0 deletions(-) diff --git a/src/db/sysdb.c b/src/db/sysdb.c index 41e1756c97d346a96003fd679962c2c6937a3e0c..ebdaa0910347c52150561e04cb971a327f4a00ef 100644 --- a/src/db/sysdb.c +++ b/src/db/sysdb.c @@ -1924,3 +1924,78 @@ int sysdb_attrs_replace_name(struct sysdb_attrs *attrs, const char *oldname, return EOK; } + +/* Search for all incidences of attr_name in a list of + * sysdb_attrs and add their value to a list + * + * TODO: Currently only works for single-valued + * attributes. Multi-valued attributes will return + * only the first entry + */ +errno_t sysdb_attrs_to_list(TALLOC_CTX *memctx, + struct sysdb_attrs **attrs, + int attr_count, + const char *attr_name, + char ***_list) +{ + int attr_idx; + int i; + char **list; + char **tmp_list; + int list_idx; + + *_list = NULL; + + /* Assume that every attrs entry contains the attr_name + * This may waste a little memory if some entries don't + * have the attribute, but it will save us the trouble + * of continuously resizing the array. + */ + list = talloc_array(memctx, char *, attr_count+1); + if (!list) { + return ENOMEM; + } + + list_idx = 0; + /* Loop through all entries in attrs */ + for (attr_idx = 0; attr_idx < attr_count; attr_idx++) { + /* Examine each attribute within the entry */ + for (i = 0; i < attrs[attr_idx]->num; i++) { + if (strcasecmp(attrs[attr_idx]->a->name, attr_name) == 0) { + /* Attribute name matches the requested name + * Copy it to the output list + */ + list[list_idx] = talloc_strdup( + list, + (const char *)attrs[attr_idx]->a->values[0].data); + if (!list[list_idx]) { + talloc_free(list); + return ENOMEM; + } + list_idx++; + + /* We only support single-valued attributes + * Break here and go on to the next entry + */ + break; + } + } + } + + list[list_idx] = NULL; + + /* if list_idx < attr_count, do a realloc to + * reclaim unused memory + */ + if (list_idx < attr_count) { + tmp_list = talloc_realloc(memctx, list, char *, list_idx+1); + if (!tmp_list) { + talloc_zfree(list); + return ENOMEM; + } + list = tmp_list; + } + + *_list = list; + return EOK; +} diff --git a/src/db/sysdb.h b/src/db/sysdb.h index 50427d613241592badb62f2b093cc5301479522b..fee8e34a26c5c7b3fe541cadc093e24ca4c4646d 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -652,4 +652,10 @@ struct tevent_req *sysdb_delete_group_send(TALLOC_CTX *mem_ctx, const char *name, gid_t gid); int sysdb_delete_group_recv(struct tevent_req *req); +errno_t sysdb_attrs_to_list(TALLOC_CTX *memctx, + struct sysdb_attrs **attrs, + int attr_count, + const char *attr_name, + char ***_list); + #endif /* __SYS_DB_H__ */ diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c index 8557be5ad126adec06b1605b0708c3d6ac6d5e19..584335ed773ffedd90a935b195552ca6a1677124 100644 --- a/src/tests/sysdb-tests.c +++ b/src/tests/sysdb-tests.c @@ -3124,6 +3124,35 @@ START_TEST (test_sysdb_memberof_check_memberuid_loop_without_group_5) } END_TEST +START_TEST (test_sysdb_attrs_to_list) +{ + struct sysdb_attrs *attrs_list[3]; + char **list; + errno_t ret; + + TALLOC_CTX *test_ctx = talloc_new(NULL); + + attrs_list[0] = sysdb_new_attrs(test_ctx); + sysdb_attrs_add_string(attrs_list[0], "test_attr", "attr1"); + attrs_list[1] = sysdb_new_attrs(test_ctx); + sysdb_attrs_add_string(attrs_list[1], "test_attr", "attr2"); + attrs_list[2] = sysdb_new_attrs(test_ctx); + sysdb_attrs_add_string(attrs_list[2], "nottest_attr", "attr3"); + + ret = sysdb_attrs_to_list(test_ctx, attrs_list, 3, + "test_attr", &list); + fail_unless(ret == EOK, "sysdb_attrs_to_list failed with code %d", ret); + + fail_unless(strcmp(list[0],"attr1") == 0, "Expected [attr1], got [%s]", + list[0]); + fail_unless(strcmp(list[1],"attr2") == 0, "Expected [attr2], got [%s]", + list[1]); + fail_unless(list[2] == NULL, "List should be NULL-terminated"); + + talloc_free(test_ctx); +} +END_TEST + Suite *create_sysdb_suite(void) { Suite *s = suite_create("sysdb"); @@ -3233,6 +3262,8 @@ Suite *create_sysdb_suite(void) tcase_add_test(tc_sysdb, test_sysdb_attrs_replace_name); + tcase_add_test(tc_sysdb, test_sysdb_attrs_to_list); + /* Add all test cases to the test suite */ suite_add_tcase(s, tc_sysdb); -- 1.7.2
0001-Add-sysdb_attrs_to_list-utility-function.patch.sig
Description: PGP signature
_______________________________________________ sssd-devel mailing list sssd-devel@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/sssd-devel