summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2016-01-31 15:29:29 +0100
committerGünther Deschner <gd@samba.org>2016-02-03 15:04:11 +0100
commitf09cebd4fcae562e110a5356d6144ce9d2e220a5 (patch)
treed4f85ef6e617e805d27221cd41e50feec0661681 /source3
parent0d1165a4241c67f88d5f0f1b718e29597698d515 (diff)
downloadsamba-f09cebd4fcae562e110a5356d6144ce9d2e220a5.tar.gz
tldap: Make tldap_search use tldap_search_all
Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Guenther Deschner <gd@samba.org>
Diffstat (limited to 'source3')
-rw-r--r--source3/include/tldap.h4
-rw-r--r--source3/lib/tldap.c121
-rw-r--r--source3/lib/tldap_util.c2
-rw-r--r--source3/torture/torture.c2
4 files changed, 30 insertions, 99 deletions
diff --git a/source3/include/tldap.h b/source3/include/tldap.h
index a5f2ddcd47f..0d7e55df9ca 100644
--- a/source3/include/tldap.h
+++ b/source3/include/tldap.h
@@ -189,8 +189,8 @@ TLDAPRC tldap_search(struct tldap_context *ld,
struct tldap_control *sctrls, int num_sctrls,
struct tldap_control *cctrls, int num_cctrls,
int timelimit, int sizelimit, int deref,
- TALLOC_CTX *mem_ctx, struct tldap_message ***entries,
- struct tldap_message ***refs);
+ TALLOC_CTX *mem_ctx, struct tldap_message ***pmsgs);
+
bool tldap_entry_dn(struct tldap_message *msg, char **dn);
bool tldap_entry_attributes(struct tldap_message *msg,
struct tldap_attribute **attributes,
diff --git a/source3/lib/tldap.c b/source3/lib/tldap.c
index 12203236b67..1f9462adaf9 100644
--- a/source3/lib/tldap.c
+++ b/source3/lib/tldap.c
@@ -1948,124 +1948,55 @@ TLDAPRC tldap_search_all_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
return TLDAP_SUCCESS;
}
-struct tldap_sync_search_state {
- TALLOC_CTX *mem_ctx;
- struct tldap_message **entries;
- struct tldap_message **refs;
- TLDAPRC rc;
-};
-
-static void tldap_search_cb(struct tevent_req *req)
-{
- struct tldap_sync_search_state *state =
- (struct tldap_sync_search_state *)
- tevent_req_callback_data_void(req);
- struct tldap_message *msg, **tmp;
- int num_entries, num_refs;
-
- state->rc = tldap_search_recv(req, talloc_tos(), &msg);
- if (!TLDAP_RC_IS_SUCCESS(state->rc)) {
- return;
- }
-
- switch (tldap_msg_type(msg)) {
- case TLDAP_RES_SEARCH_ENTRY:
- num_entries = talloc_array_length(state->entries);
- tmp = talloc_realloc(state->mem_ctx, state->entries,
- struct tldap_message *, num_entries + 1);
- if (tmp == NULL) {
- state->rc = TLDAP_NO_MEMORY;
- return;
- }
- state->entries = tmp;
- state->entries[num_entries] = talloc_move(state->entries,
- &msg);
- break;
- case TLDAP_RES_SEARCH_REFERENCE:
- num_refs = talloc_array_length(state->refs);
- tmp = talloc_realloc(state->mem_ctx, state->refs,
- struct tldap_message *, num_refs + 1);
- if (tmp == NULL) {
- state->rc = TLDAP_NO_MEMORY;
- return;
- }
- state->refs = tmp;
- state->refs[num_refs] = talloc_move(state->refs, &msg);
- break;
- case TLDAP_RES_SEARCH_RESULT:
- state->rc = TLDAP_SUCCESS;
- break;
- default:
- state->rc = TLDAP_PROTOCOL_ERROR;
- break;
- }
-}
-
TLDAPRC tldap_search(struct tldap_context *ld,
const char *base, int scope, const char *filter,
const char **attrs, int num_attrs, int attrsonly,
struct tldap_control *sctrls, int num_sctrls,
struct tldap_control *cctrls, int num_cctrls,
int timelimit, int sizelimit, int deref,
- TALLOC_CTX *mem_ctx, struct tldap_message ***entries,
- struct tldap_message ***refs)
+ TALLOC_CTX *mem_ctx, struct tldap_message ***pmsgs)
{
- TALLOC_CTX *frame = talloc_stackframe();
+ TALLOC_CTX *frame;
struct tevent_context *ev;
struct tevent_req *req;
- struct tldap_sync_search_state state = {
- .mem_ctx = mem_ctx, .rc = TLDAP_SUCCESS
- };
+ TLDAPRC rc = TLDAP_NO_MEMORY;
+ struct tldap_message **msgs;
+ struct tldap_message *result;
+
+ if (tldap_pending_reqs(ld)) {
+ return TLDAP_BUSY;
+ }
+
+ frame = talloc_stackframe();
ev = samba_tevent_context_init(frame);
if (ev == NULL) {
- state.rc = TLDAP_NO_MEMORY;
goto fail;
}
-
- req = tldap_search_send(frame, ev, ld, base, scope, filter,
- attrs, num_attrs, attrsonly,
- sctrls, num_sctrls, cctrls, num_cctrls,
- timelimit, sizelimit, deref);
+ req = tldap_search_all_send(frame, ev, ld, base, scope, filter,
+ attrs, num_attrs, attrsonly,
+ sctrls, num_sctrls, cctrls, num_cctrls,
+ timelimit, sizelimit, deref);
if (req == NULL) {
- state.rc = TLDAP_NO_MEMORY;
goto fail;
}
-
- tevent_req_set_callback(req, tldap_search_cb, &state);
-
- if (!tevent_req_is_in_progress(req)) {
- /* an error happend before sending */
- if (tevent_req_is_ldap_error(req, &state.rc)) {
- goto fail;
- }
+ if (!tevent_req_poll(req, ev)) {
+ rc = TLDAP_OPERATIONS_ERROR;
+ goto fail;
}
-
- while (tevent_req_is_in_progress(req) &&
- TLDAP_RC_IS_SUCCESS(state.rc)) {
- if (tevent_loop_once(ev) == -1) {
- return TLDAP_OPERATIONS_ERROR;
- }
+ rc = tldap_search_all_recv(req, mem_ctx, &msgs, &result);
+ TALLOC_FREE(req);
+ if (!TLDAP_RC_IS_SUCCESS(rc)) {
+ return rc;
}
- if (!TLDAP_RC_IS_SUCCESS(state.rc)) {
- return state.rc;
- }
+ TALLOC_FREE(ld->last_msg);
+ ld->last_msg = talloc_move(ld, &result);
- if (entries != NULL) {
- *entries = state.entries;
- } else {
- TALLOC_FREE(state.entries);
- }
- if (refs != NULL) {
- *refs = state.refs;
- } else {
- TALLOC_FREE(state.refs);
- }
- tldap_save_msg(ld, req);
+ *pmsgs = msgs;
fail:
TALLOC_FREE(frame);
- return state.rc;
+ return rc;
}
static bool tldap_parse_search_entry(struct tldap_message *msg)
diff --git a/source3/lib/tldap_util.c b/source3/lib/tldap_util.c
index 88e704fedf6..b7233f68705 100644
--- a/source3/lib/tldap_util.c
+++ b/source3/lib/tldap_util.c
@@ -365,7 +365,7 @@ TLDAPRC tldap_search_va(struct tldap_context *ld, const char *base, int scope,
attrs, num_attrs, attrsonly,
NULL /*sctrls*/, 0, NULL /*cctrls*/, 0,
0 /*timelimit*/, 0 /*sizelimit*/, 0 /*deref*/,
- mem_ctx, res, NULL);
+ mem_ctx, res);
TALLOC_FREE(filter);
return rc;
}
diff --git a/source3/torture/torture.c b/source3/torture/torture.c
index 8196993fe4b..1df2ba0d7a7 100644
--- a/source3/torture/torture.c
+++ b/source3/torture/torture.c
@@ -7993,7 +7993,7 @@ static bool run_tldap(int dummy)
rc = tldap_search(ld, "", TLDAP_SCOPE_BASE, filter,
NULL, 0, 0, NULL, 0, NULL, 0, 0, 0, 0,
- talloc_tos(), NULL, NULL);
+ talloc_tos(), NULL);
if (!TLDAP_RC_IS_SUCCESS(rc)) {
d_printf("tldap_search with complex filter failed: %s\n",
tldap_errstr(talloc_tos(), ld, rc));