2 * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
3 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5 * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
7 * This work has been developed to fulfill the requirements
8 * of SysNet s.n.c. <http:www.sys-net.it> and it has been donated
9 * to the OpenLDAP Foundation in the hope that it may be useful
10 * to the Open Source community, but WITHOUT ANY WARRANTY.
12 * Permission is granted to anyone to use this software for any purpose
13 * on any computer system, and to alter it and redistribute it, subject
14 * to the following restrictions:
16 * 1. The author and SysNet s.n.c. are not responsible for the consequences
17 * of use of this software, no matter how awful, even if they arise from
20 * 2. The origin of this software must not be misrepresented, either by
21 * explicit claim or by omission. Since few users ever read sources,
22 * credits should appear in the documentation.
24 * 3. Altered versions must be plainly marked as such, and must not be
25 * misrepresented as being the original software. Since few users
26 * ever read sources, credits should appear in the documentation.
27 * SysNet s.n.c. cannot be responsible for the consequences of the
30 * 4. This notice may not be removed or altered.
33 * This software is based on the backend back-ldap, implemented
34 * by Howard Chu <hyc@highlandsun.com>, and modified by Mark Valence
35 * <kurash@sassafras.com>, Pierangelo Masarati <ando@sys-net.it> and other
36 * contributors. The contribution of the original software to the present
37 * implementation is acknowledged in this copyright statement.
39 * A special acknowledgement goes to Howard for the overall architecture
40 * (and for borrowing large pieces of code), and to Mark, who implemented
41 * from scratch the attribute/objectclass mapping.
43 * The original copyright statement follows.
45 * Copyright 1999, Howard Chu, All rights reserved. <hyc@highlandsun.com>
47 * Permission is granted to anyone to use this software for any purpose
48 * on any computer system, and to alter it and redistribute it, subject
49 * to the following restrictions:
51 * 1. The author is not responsible for the consequences of use of this
52 * software, no matter how awful, even if they arise from flaws in it.
54 * 2. The origin of this software must not be misrepresented, either by
55 * explicit claim or by omission. Since few users ever read sources,
56 * credits should appear in the documentation.
58 * 3. Altered versions must be plainly marked as such, and must not be
59 * misrepresented as being the original software. Since few users
60 * ever read sources, credits should appear in the
63 * 4. This notice may not be removed or altered.
72 #include "../back-ldap/back-ldap.h"
73 #include "back-meta.h"
76 * The meta-directory has one suffix, called <suffix>.
77 * It handles a pool of target servers, each with a branch suffix
78 * of the form <branch X>,<suffix>
80 * When the meta-directory receives a request with a dn that belongs
81 * to a branch, the corresponding target is invoked. When the dn
82 * does not belong to a specific branch, all the targets that
83 * are compatible with the dn are selected as candidates, and
84 * the request is spawned to all the candidate targets
86 * A request is characterized by a dn. The following cases are handled:
87 * - the dn is the suffix: <dn> == <suffix>,
88 * all the targets are candidates (search ...)
89 * - the dn is a branch suffix: <dn> == <branch X>,<suffix>, or
90 * - the dn is a subtree of a branch suffix:
91 * <dn> == <rdn>,<branch X>,<suffix>,
92 * the target is the only candidate.
94 * A possible extension will include the handling of multiple suffixes
98 * returns 1 if suffix is candidate for dn, otherwise 0
100 * Note: this function should never be called if dn is the <suffix>.
103 meta_back_is_candidate(
104 struct berval *nsuffix,
108 if ( dnIsSuffix( nsuffix, ndn ) || dnIsSuffix( ndn, nsuffix ) ) {
110 * suffix longer than dn
112 return META_CANDIDATE;
115 return META_NOT_CANDIDATE;
119 * meta_back_count_candidates
121 * returns a count of the possible candidate targets
122 * Note: dn MUST be normalized
126 meta_back_count_candidates(
134 * I know assertions should not check run-time values;
135 * at present I didn't find a place for such checks
138 assert( li->targets != NULL );
139 assert( li->ntargets != 0 );
141 for ( i = 0; i < li->ntargets; ++i ) {
142 if ( meta_back_is_candidate( &li->targets[ i ]->suffix, ndn ) ) {
151 * meta_back_is_candidate_unique
153 * checks whether a candidate is unique
154 * Note: dn MUST be normalized
157 meta_back_is_candidate_unique(
162 return ( meta_back_count_candidates( li, ndn ) == 1 );
166 * meta_back_select_unique_candidate
168 * returns the index of the candidate in case it is unique, otherwise -1
169 * Note: dn MUST be normalized.
170 * Note: if defined, the default candidate is returned in case of no match.
173 meta_back_select_unique_candidate(
180 switch ( meta_back_count_candidates( li, ndn ) ) {
185 return ( li->defaulttarget == META_DEFAULT_TARGET_NONE
186 ? -1 : li->defaulttarget );
189 for ( i = 0; i < li->ntargets; ++i ) {
190 if ( meta_back_is_candidate( &li->targets[ i ]->suffix, ndn ) ) {
199 * meta_clear_unused_candidates
201 * clears all candidates except candidate
204 meta_clear_unused_candidates(
213 for ( i = 0; i < li->ntargets; ++i ) {
214 if ( i == candidate ) {
217 meta_clear_one_candidate( lc->conns[ i ], reallyclean );
224 * meta_clear_one_candidate
226 * clears the selected candidate
229 meta_clear_one_candidate(
230 struct metasingleconn *lsc,
234 lsc->candidate = META_NOT_CANDIDATE;
236 if ( !reallyclean ) {
241 ldap_unbind( lsc->ld );
245 if ( lsc->bound_dn.bv_val != NULL ) {
246 ber_memfree( lsc->bound_dn.bv_val );
247 lsc->bound_dn.bv_val = NULL;
248 lsc->bound_dn.bv_len = 0;