diff options
author | Stephen Gallagher <sgallagh@redhat.com> | 2010-07-23 13:20:40 -0400 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2010-07-30 15:57:57 -0400 |
commit | 43be5d34c35874326a6d882181c024cbf09bad48 (patch) | |
tree | 2a4271ef18cfc4aa249317d0b06ec30c3b9bfa83 /src/db | |
parent | ef73b99b4feb506200291615a0093246a3bdc991 (diff) | |
download | sssd-43be5d34c35874326a6d882181c024cbf09bad48.tar.gz sssd-43be5d34c35874326a6d882181c024cbf09bad48.tar.xz sssd-43be5d34c35874326a6d882181c024cbf09bad48.zip |
Add sysdb_attrs_to_list() utility function
Diffstat (limited to 'src/db')
-rw-r--r-- | src/db/sysdb.c | 75 | ||||
-rw-r--r-- | src/db/sysdb.h | 6 |
2 files changed, 81 insertions, 0 deletions
diff --git a/src/db/sysdb.c b/src/db/sysdb.c index 41e1756c9..ebdaa0910 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 50427d613..fee8e34a2 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__ */ |