diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2011-05-17 10:20:04 +0200 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2011-05-20 07:21:45 -0400 |
commit | 0a4b0580d8f5de1733ea065553992edfcb793de5 (patch) | |
tree | 2669ca1068821d377056c21f395d337ee42218ae /src/providers/ldap | |
parent | 4dbc76b8784eed6dbf4d9b40c0f59fd0bceeeec7 (diff) | |
download | sssd-0a4b0580d8f5de1733ea065553992edfcb793de5.tar.gz sssd-0a4b0580d8f5de1733ea065553992edfcb793de5.tar.xz sssd-0a4b0580d8f5de1733ea065553992edfcb793de5.zip |
Generic dereference data structures and utilities
These will be shared by both dereference methods in a later patch.
Diffstat (limited to 'src/providers/ldap')
-rw-r--r-- | src/providers/ldap/sdap.h | 10 | ||||
-rw-r--r-- | src/providers/ldap/sdap_async.c | 35 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/providers/ldap/sdap.h b/src/providers/ldap/sdap.h index c00b3d3e6..cef2d23ae 100644 --- a/src/providers/ldap/sdap.h +++ b/src/providers/ldap/sdap.h @@ -305,6 +305,16 @@ struct sdap_server_opts { struct sdap_id_ctx; +struct sdap_attr_map_info { + struct sdap_attr_map *map; + int num_attrs; +}; + +struct sdap_deref_attrs { + struct sdap_attr_map *map; + struct sysdb_attrs *attrs; +}; + int sdap_get_map(TALLOC_CTX *memctx, struct confdb_ctx *cdb, const char *conf_path, diff --git a/src/providers/ldap/sdap_async.c b/src/providers/ldap/sdap_async.c index 7c7e2699a..94ffcc392 100644 --- a/src/providers/ldap/sdap_async.c +++ b/src/providers/ldap/sdap_async.c @@ -821,6 +821,41 @@ static errno_t add_to_reply(TALLOC_CTX *mem_ctx, return EOK; } +struct sdap_deref_reply { + size_t reply_max; + size_t reply_count; + struct sdap_deref_attrs **reply; +}; + +static errno_t add_to_deref_reply(TALLOC_CTX *mem_ctx, + int num_maps, + struct sdap_deref_reply *dreply, + struct sdap_deref_attrs **res) +{ + int i; + + for (i=0; i < num_maps; i++) { + if (res[i]->attrs == NULL) continue; /* Nothing in this map */ + + if (dreply->reply == NULL || + dreply->reply_max == dreply->reply_count) { + dreply->reply_max += REPLY_REALLOC_INCREMENT; + dreply->reply = talloc_realloc(mem_ctx, dreply->reply, + struct sdap_deref_attrs *, + dreply->reply_max); + if (dreply->reply == NULL) { + DEBUG(1, ("talloc_realloc failed.\n")); + return ENOMEM; + } + } + + dreply->reply[dreply->reply_count++] = + talloc_steal(dreply->reply, res[i]); + } + + return EOK; +} + /* ==Generic Search exposing all options======================= */ typedef errno_t (*sdap_parse_cb)(struct sdap_handle *sh, struct sdap_msg *msg, |