1 /* search.c - ldap backend search function */
4 * Copyright 1999, Howard Chu, All rights reserved. <hyc@highlandsun.com>
6 * Permission is granted to anyone to use this software for any purpose
7 * on any computer system, and to alter it and redistribute it, subject
8 * to the following restrictions:
10 * 1. The author is not responsible for the consequences of use of this
11 * software, no matter how awful, even if they arise from flaws in it.
13 * 2. The origin of this software must not be misrepresented, either by
14 * explicit claim or by omission. Since few users ever read sources,
15 * credits should appear in the documentation.
17 * 3. Altered versions must be plainly marked as such, and must not be
18 * misrepresented as being the original software. Since few users
19 * ever read sources, credits should appear in the documentation.
21 * 4. This notice may not be removed or altered.
28 #include <ac/socket.h>
29 #include <ac/string.h>
33 #include "back-ldap.h"
51 struct ldapinfo *li = (struct ldapinfo *) be->be_private;
55 int i, rc, msgid, sres = LDAP_SUCCESS;
56 char *match = NULL, *err = NULL;
58 lc = ldap_back_getconn(li, conn, op);
63 ldap_set_option( lc->ld, LDAP_OPT_DEREF, (void *)&deref);
65 ldap_set_option( lc->ld, LDAP_OPT_TIMELIMIT, (void *)&time);
67 ldap_set_option( lc->ld, LDAP_OPT_SIZELIMIT, (void *)&size);
69 ldap_back_dobind(lc, op);
74 if ((msgid = ldap_search(lc->ld, base, scope, filterstr, attrs,
76 fail: return( ldap_back_op_result(lc, op) );
78 /* We pull apart the ber result, stuff it into a slapd entry, and
79 * let send_search_entry stuff it back into ber format. Slow & ugly,
80 * but this is necessary for version matching, and for ACL processing.
83 for (i=0, rc=0; rc != -1;
84 rc = ldap_result(lc->ld, LDAP_RES_ANY, 0, &tv, &res)) {
87 /* check for abandon */
88 ldap_pvt_thread_mutex_lock( &op->o_abandonmutex );
90 ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex );
93 ldap_abandon(lc->ld, msgid);
97 ldap_pvt_thread_yield();
99 } else if (rc == LDAP_RES_SEARCH_ENTRY) {
100 e = ldap_first_entry(lc->ld,res);
101 ldap_send_entry(be, op, lc, e, attrs, attrsonly);
104 sres = ldap_result2error(lc->ld, res, 1);
105 ldap_get_option(lc->ld, LDAP_OPT_ERROR_STRING, &err);
106 ldap_get_option(lc->ld, LDAP_OPT_MATCHED_DN, &match);
119 send_search_result( conn, op, sres,
120 match, err, NULL, NULL, i );
139 BerElement *ber = NULL;
140 Attribute *attr, **attrp;
141 struct berval *dummy = NULL;
143 ent.e_dn = ldap_get_dn(lc->ld, e);
144 ent.e_ndn = ch_strdup( ent.e_dn);
145 (void) dn_normalize_case( ent.e_ndn );
149 attrp = &ent.e_attrs;
151 for (a = ldap_first_attribute(lc->ld, e, &ber); a;
152 a = ldap_next_attribute(lc->ld, e, ber)) {
153 attr = (Attribute *)ch_malloc( sizeof(Attribute) );
155 attr->a_type = ch_strdup(a);
156 attr->a_syntax = attr_syntax(a);
157 attr->a_vals = ldap_get_values_len(lc->ld, e, a);
159 attr->a_vals = &dummy;
161 attrp = &attr->a_next;
163 send_search_entry( be, lc->conn, op, &ent, attrs, attrsonly, NULL );
164 for (;ent.e_attrs;) {
166 ent.e_attrs = attr->a_next;
168 if (attr->a_vals != &dummy)
169 ber_bvecfree(attr->a_vals);