d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina/*
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina Authors:
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina Pavel Březina <pbrezina@redhat.com>
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina Copyright (C) 2015 Red Hat
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina This program is free software; you can redistribute it and/or modify
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina it under the terms of the GNU General Public License as published by
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina the Free Software Foundation; either version 3 of the License, or
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina (at your option) any later version.
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina This program is distributed in the hope that it will be useful,
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina GNU General Public License for more details.
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina You should have received a copy of the GNU General Public License
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina*/
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina#include <talloc.h>
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina#include <tevent.h>
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina#include "util/util.h"
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina#include "providers/ldap/sdap.h"
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina#include "providers/ldap/sdap_async.h"
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina#include "providers/ldap/ldap_common.h"
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinastruct sdap_search_bases_ex_state {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct tevent_context *ev;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct sdap_options *opts;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct sdap_handle *sh;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina const char *filter;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina const char **attrs;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct sdap_attr_map *map;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina int map_num_attrs;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina int timeout;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina bool allow_paging;
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina bool return_first_reply;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina size_t base_iter;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct sdap_search_base *cur_base;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct sdap_search_base **bases;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina size_t reply_count;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct sysdb_attrs **reply;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina};
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinastatic errno_t sdap_search_bases_ex_next_base(struct tevent_req *req);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinastatic void sdap_search_bases_ex_done(struct tevent_req *subreq);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinastatic struct tevent_req *
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinasdap_search_bases_ex_send(TALLOC_CTX *mem_ctx,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct tevent_context *ev,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_options *opts,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_handle *sh,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_search_base **bases,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_attr_map *map,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina bool allow_paging,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina bool return_first_reply,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina int timeout,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina const char *filter,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina const char **attrs)
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina{
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct tevent_req *req;
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_search_bases_ex_state *state;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina errno_t ret;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina req = tevent_req_create(mem_ctx, &state, struct sdap_search_bases_ex_state);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (req == NULL) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return NULL;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (bases == NULL) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "No search base specified!\n");
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina ret = ERR_INTERNAL;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina goto immediately;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->ev = ev;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->opts = opts;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->sh = sh;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->bases = bases;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->map = map;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->filter = filter;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->attrs = attrs;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->allow_paging = allow_paging;
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina state->return_first_reply = return_first_reply;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->timeout = timeout == 0
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina ? dp_opt_get_int(opts->basic, SDAP_SEARCH_TIMEOUT)
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina : timeout;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
15f3e53e7ab9285afbebc8e2ec4d6d4577fef3daPavel Březina if (state->map != NULL) {
15f3e53e7ab9285afbebc8e2ec4d6d4577fef3daPavel Březina for (state->map_num_attrs = 0;
15f3e53e7ab9285afbebc8e2ec4d6d4577fef3daPavel Březina state->map[state->map_num_attrs].opt_name != NULL;
15f3e53e7ab9285afbebc8e2ec4d6d4577fef3daPavel Březina state->map_num_attrs++) {
15f3e53e7ab9285afbebc8e2ec4d6d4577fef3daPavel Březina /* no op */;
15f3e53e7ab9285afbebc8e2ec4d6d4577fef3daPavel Březina }
15f3e53e7ab9285afbebc8e2ec4d6d4577fef3daPavel Březina } else {
15f3e53e7ab9285afbebc8e2ec4d6d4577fef3daPavel Březina state->map_num_attrs = 0;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (state->attrs == NULL) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina ret = build_attrs_from_map(state, state->map, state->map_num_attrs,
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina NULL, &state->attrs, NULL);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (ret != EOK) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Unable to build attrs from map "
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina "[%d]: %s\n", ret, sss_strerror(ret));
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina goto immediately;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->base_iter = 0;
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina ret = sdap_search_bases_ex_next_base(req);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (ret == EAGAIN) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina /* asynchronous processing */
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return req;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březinaimmediately:
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (ret == EOK) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina tevent_req_done(req);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina } else {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina tevent_req_error(req, ret);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina tevent_req_post(req, ev);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return req;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina}
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinastatic errno_t sdap_search_bases_ex_next_base(struct tevent_req *req)
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina{
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_search_bases_ex_state *state;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct tevent_req *subreq;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina char *filter;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina state = tevent_req_data(req, struct sdap_search_bases_ex_state);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->cur_base = state->bases[state->base_iter];
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (state->cur_base == NULL) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return EOK;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina /* Combine lookup and search base filters. */
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina filter = sdap_combine_filters(state, state->filter,
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->cur_base->filter);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (filter == NULL) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return ENOMEM;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Issuing LDAP lookup with base [%s]\n",
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->cur_base->basedn);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina subreq = sdap_get_generic_send(state, state->ev, state->opts, state->sh,
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->cur_base->basedn,
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->cur_base->scope, filter,
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->attrs, state->map,
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->map_num_attrs, state->timeout,
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->allow_paging);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (subreq == NULL) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return ENOMEM;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina tevent_req_set_callback(subreq, sdap_search_bases_ex_done, req);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->base_iter++;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return EAGAIN;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina}
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinastatic void sdap_search_bases_ex_done(struct tevent_req *subreq)
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina{
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct tevent_req *req;
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_search_bases_ex_state *state;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina struct sysdb_attrs **attrs;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina size_t count;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina size_t i;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina int ret;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina state = tevent_req_data(req, struct sdap_search_bases_ex_state);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Receiving data from base [%s]\n",
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina state->cur_base->basedn);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina ret = sdap_get_generic_recv(subreq, state, &count, &attrs);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina talloc_zfree(subreq);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (ret != EOK) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina tevent_req_error(req, ret);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina /* Add rules to result. */
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (count > 0) {
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina if (state->return_first_reply == false) {
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina /* Merge with previous reply. */
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina state->reply = talloc_realloc(state, state->reply,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sysdb_attrs *,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina state->reply_count + count);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina if (state->reply == NULL) {
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina tevent_req_error(req, ENOMEM);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina return;
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina }
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina for (i = 0; i < count; i++) {
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina state->reply[state->reply_count + i] = talloc_steal(state->reply,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina attrs[i]);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina }
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina state->reply_count += count;
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina } else {
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina /* Return the first successful search result. */
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina state->reply_count = count;
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina state->reply = attrs;
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina tevent_req_done(req);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina /* Try next search base. */
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina ret = sdap_search_bases_ex_next_base(req);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina if (ret == EOK) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina tevent_req_done(req);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina } else if (ret != EAGAIN) {
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina tevent_req_error(req, ret);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina }
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina}
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinastatic int sdap_search_bases_ex_recv(struct tevent_req *req,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina TALLOC_CTX *mem_ctx,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina size_t *reply_count,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sysdb_attrs ***reply)
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina{
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_search_bases_ex_state *state =
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina tevent_req_data(req, struct sdap_search_bases_ex_state);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina *reply_count = state->reply_count;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina *reply = talloc_steal(mem_ctx, state->reply);
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina return EOK;
d0599eaa9369fd867953e3c58b8d7bb445525ff5Pavel Březina}
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinastruct tevent_req *
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinasdap_search_bases_send(TALLOC_CTX *mem_ctx,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct tevent_context *ev,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_options *opts,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_handle *sh,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_search_base **bases,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_attr_map *map,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina bool allow_paging,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina int timeout,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina const char *filter,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina const char **attrs)
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina{
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina return sdap_search_bases_ex_send(mem_ctx, ev, opts, sh, bases, map,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina allow_paging, false, timeout,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina filter, attrs);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina}
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinaint sdap_search_bases_recv(struct tevent_req *req,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina TALLOC_CTX *mem_ctx,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina size_t *_reply_count,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sysdb_attrs ***_reply)
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina{
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina return sdap_search_bases_ex_recv(req, mem_ctx, _reply_count, _reply);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina}
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinastruct tevent_req *
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinasdap_search_bases_return_first_send(TALLOC_CTX *mem_ctx,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct tevent_context *ev,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_options *opts,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_handle *sh,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_search_base **bases,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sdap_attr_map *map,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina bool allow_paging,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina int timeout,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina const char *filter,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina const char **attrs)
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina{
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina return sdap_search_bases_ex_send(mem_ctx, ev, opts, sh, bases, map,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina allow_paging, true, timeout,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina filter, attrs);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina}
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březinaint sdap_search_bases_return_first_recv(struct tevent_req *req,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina TALLOC_CTX *mem_ctx,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina size_t *_reply_count,
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina struct sysdb_attrs ***_reply)
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina{
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina return sdap_search_bases_ex_recv(req, mem_ctx, _reply_count, _reply);
f48b1dda750511b57dce360fd18da2402adbcbb0Pavel Březina}
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinastruct sdap_deref_bases_ex_state {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct tevent_context *ev;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_options *opts;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_handle *sh;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char *filter;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char **attrs;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char *deref_attr;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_attr_map_info *maps;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina size_t num_maps;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina unsigned int flags;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina bool return_first_reply;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina int timeout;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina size_t base_iter;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_search_base *cur_base;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_search_base **bases;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina size_t reply_count;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_attrs **reply;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina};
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinastatic errno_t sdap_deref_bases_ex_next_base(struct tevent_req *req);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinastatic void sdap_deref_bases_ex_done(struct tevent_req *subreq);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinastatic struct tevent_req *
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinasdap_deref_bases_ex_send(TALLOC_CTX *mem_ctx,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct tevent_context *ev,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_options *opts,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_handle *sh,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_search_base **bases,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_attr_map_info *maps,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char *filter,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char **attrs,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char *deref_attr,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina unsigned int flags,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina bool return_first_reply,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina int timeout)
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina{
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct tevent_req *req;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_bases_ex_state *state;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina errno_t ret;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina req = tevent_req_create(mem_ctx, &state, struct sdap_deref_bases_ex_state);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (req == NULL) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return NULL;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (bases == NULL) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "No search base specified!\n");
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina ret = ERR_INTERNAL;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina goto immediately;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (maps == NULL || attrs == NULL || deref_attr == NULL) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "No attributes or map specified!\n");
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina ret = ERR_INTERNAL;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina goto immediately;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->ev = ev;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->opts = opts;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->sh = sh;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->bases = bases;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->maps = maps;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->filter = filter;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->attrs = attrs;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->deref_attr = deref_attr;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->return_first_reply = return_first_reply;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->flags = flags;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->timeout = timeout == 0
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina ? dp_opt_get_int(opts->basic, SDAP_SEARCH_TIMEOUT)
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina : timeout;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina for (state->num_maps = 0; maps[state->num_maps].map != NULL;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->num_maps++) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina /* no op */;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->base_iter = 0;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina ret = sdap_deref_bases_ex_next_base(req);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (ret == EAGAIN) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina /* asynchronous processing */
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return req;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinaimmediately:
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (ret == EOK) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_done(req);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina } else {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_error(req, ret);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_post(req, ev);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return req;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina}
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinastatic errno_t sdap_deref_bases_ex_next_base(struct tevent_req *req)
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina{
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_bases_ex_state *state;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct tevent_req *subreq;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state = tevent_req_data(req, struct sdap_deref_bases_ex_state);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->cur_base = state->bases[state->base_iter];
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (state->cur_base == NULL) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return EOK;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Issuing LDAP deref lookup with base [%s]\n",
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->cur_base->basedn);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina subreq = sdap_deref_search_with_filter_send(state, state->ev, state->opts,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->sh, state->cur_base->basedn, state->filter,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->deref_attr, state->attrs, state->num_maps, state->maps,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->timeout, state->flags);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (subreq == NULL) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return ENOMEM;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_set_callback(subreq, sdap_deref_bases_ex_done, req);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->base_iter++;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return EAGAIN;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina}
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinastatic void sdap_deref_bases_ex_done(struct tevent_req *subreq)
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina{
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct tevent_req *req;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_bases_ex_state *state;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_attrs **attrs;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina size_t count;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina size_t i;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina int ret;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state = tevent_req_data(req, struct sdap_deref_bases_ex_state);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina DEBUG(SSSDBG_TRACE_FUNC, "Receiving data from base [%s]\n",
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->cur_base->basedn);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina ret = sdap_deref_search_with_filter_recv(subreq, state, &count, &attrs);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina talloc_zfree(subreq);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (ret != EOK) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_error(req, ret);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina /* Add rules to result. */
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (count > 0) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (state->return_first_reply == false) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina /* Merge with previous reply. */
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->reply = talloc_realloc(state, state->reply,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_attrs *,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->reply_count + count);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (state->reply == NULL) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_error(req, ENOMEM);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina for (i = 0; i < count; i++) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->reply[state->reply_count + i] = talloc_steal(state->reply,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina attrs[i]);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->reply_count += count;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina } else {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina /* Return the first successful search result. */
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->reply_count = count;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina state->reply = attrs;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_done(req);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina /* Try next search base. */
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina ret = sdap_deref_bases_ex_next_base(req);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina if (ret == EOK) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_done(req);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina } else if (ret != EAGAIN) {
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_error(req, ret);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina }
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina}
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinastatic int sdap_deref_bases_ex_recv(struct tevent_req *req,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina TALLOC_CTX *mem_ctx,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina size_t *reply_count,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_attrs ***reply)
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina{
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_bases_ex_state *state =
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina tevent_req_data(req, struct sdap_deref_bases_ex_state);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina *reply_count = state->reply_count;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina *reply = talloc_steal(mem_ctx, state->reply);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return EOK;
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina}
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinastruct tevent_req *
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinasdap_deref_bases_send(TALLOC_CTX *mem_ctx,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct tevent_context *ev,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_options *opts,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_handle *sh,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_search_base **bases,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_attr_map_info *maps,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char *filter,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char **attrs,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char *deref_attr,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina unsigned int flags,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina int timeout)
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina{
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return sdap_deref_bases_ex_send(mem_ctx, ev, opts, sh, bases, maps,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina filter, attrs, deref_attr, flags,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina false, timeout);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina}
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinaint sdap_deref_bases_recv(struct tevent_req *req,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina TALLOC_CTX *mem_ctx,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina size_t *_reply_count,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_attrs ***_reply)
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina{
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return sdap_deref_bases_ex_recv(req, mem_ctx, _reply_count, _reply);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina}
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinastruct tevent_req *
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinasdap_deref_bases_return_first_send(TALLOC_CTX *mem_ctx,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct tevent_context *ev,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_options *opts,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_handle *sh,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_search_base **bases,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_attr_map_info *maps,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char *filter,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char **attrs,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina const char *deref_attr,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina unsigned int flags,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina int timeout)
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina{
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return sdap_deref_bases_ex_send(mem_ctx, ev, opts, sh, bases, maps,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina filter, attrs, deref_attr, flags,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina true, timeout);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina}
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březinaint sdap_deref_bases_return_first_recv(struct tevent_req *req,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina TALLOC_CTX *mem_ctx,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina size_t *_reply_count,
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina struct sdap_deref_attrs ***_reply)
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina{
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina return sdap_deref_bases_ex_recv(req, mem_ctx, _reply_count, _reply);
565b9955cc439ade58cc24a98168060a60f33e7aPavel Březina}