xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/back-meta/back-meta.h (revision 4e6df137e8e14049b5a701d249962c480449c141)
1 /*	$NetBSD: back-meta.h,v 1.1.1.3 2010/03/08 02:14:20 lukem Exp $	*/
2 
3 /* OpenLDAP: pkg/ldap/servers/slapd/back-meta/back-meta.h,v 1.64.2.15 2009/08/26 00:50:20 quanah Exp */
4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5  *
6  * Copyright 1999-2009 The OpenLDAP Foundation.
7  * Portions Copyright 2001-2003 Pierangelo Masarati.
8  * Portions Copyright 1999-2003 Howard Chu.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted only as authorized by the OpenLDAP
13  * Public License.
14  *
15  * A copy of this license is available in the file LICENSE in the
16  * top-level directory of the distribution or, alternatively, at
17  * <http://www.OpenLDAP.org/license.html>.
18  */
19 /* ACKNOWLEDGEMENTS:
20  * This work was initially developed by the Howard Chu for inclusion
21  * in OpenLDAP Software and subsequently enhanced by Pierangelo
22  * Masarati.
23  */
24 
25 #ifndef SLAPD_LDAP_H
26 #error "include servers/slapd/back-ldap/back-ldap.h before this file!"
27 #endif /* SLAPD_LDAP_H */
28 
29 #ifndef SLAPD_META_H
30 #define SLAPD_META_H
31 
32 #include "proto-meta.h"
33 
34 /* String rewrite library */
35 #include "rewrite.h"
36 
37 LDAP_BEGIN_DECL
38 
39 /*
40  * Set META_BACK_PRINT_CONNTREE larger than 0 to dump the connection tree (debug only)
41  */
42 #ifndef META_BACK_PRINT_CONNTREE
43 #define META_BACK_PRINT_CONNTREE 0
44 #endif /* !META_BACK_PRINT_CONNTREE */
45 
46 /* from back-ldap.h before rwm removal */
47 struct ldapmap {
48 	int drop_missing;
49 
50 	Avlnode *map;
51 	Avlnode *remap;
52 };
53 
54 struct ldapmapping {
55 	struct berval src;
56 	struct berval dst;
57 };
58 
59 struct ldaprwmap {
60 	/*
61 	 * DN rewriting
62 	 */
63 #ifdef ENABLE_REWRITE
64 	struct rewrite_info *rwm_rw;
65 #else /* !ENABLE_REWRITE */
66 	/* some time the suffix massaging without librewrite
67 	 * will be disabled */
68 	BerVarray rwm_suffix_massage;
69 #endif /* !ENABLE_REWRITE */
70 
71 	/*
72 	 * Attribute/objectClass mapping
73 	 */
74 	struct ldapmap rwm_oc;
75 	struct ldapmap rwm_at;
76 };
77 
78 /* Whatever context ldap_back_dn_massage needs... */
79 typedef struct dncookie {
80 	struct metatarget_t	*target;
81 
82 #ifdef ENABLE_REWRITE
83 	Connection		*conn;
84 	char			*ctx;
85 	SlapReply		*rs;
86 #else
87 	int			normalized;
88 	int			tofrom;
89 #endif
90 } dncookie;
91 
92 int ldap_back_dn_massage(dncookie *dc, struct berval *dn,
93 	struct berval *res);
94 
95 extern int ldap_back_conn_cmp( const void *c1, const void *c2);
96 extern int ldap_back_conn_dup( void *c1, void *c2 );
97 extern void ldap_back_conn_free( void *c );
98 
99 /* attributeType/objectClass mapping */
100 int mapping_cmp (const void *, const void *);
101 int mapping_dup (void *, void *);
102 
103 void ldap_back_map_init ( struct ldapmap *lm, struct ldapmapping ** );
104 int ldap_back_mapping ( struct ldapmap *map, struct berval *s,
105 	struct ldapmapping **m, int remap );
106 void ldap_back_map ( struct ldapmap *map, struct berval *s, struct berval *m,
107 	int remap );
108 #define BACKLDAP_MAP	0
109 #define BACKLDAP_REMAP	1
110 char *
111 ldap_back_map_filter(
112 	struct ldapmap *at_map,
113 	struct ldapmap *oc_map,
114 	struct berval *f,
115 	int remap );
116 
117 int
118 ldap_back_map_attrs(
119 	struct ldapmap *at_map,
120 	AttributeName *a,
121 	int remap,
122 	char ***mapped_attrs );
123 
124 extern int ldap_back_map_config(
125 	struct ldapmap	*oc_map,
126 	struct ldapmap	*at_map,
127 	const char	*fname,
128 	int		lineno,
129 	int		argc,
130 	char		**argv );
131 
132 extern int
133 ldap_back_filter_map_rewrite(
134 	dncookie	*dc,
135 	Filter		*f,
136 	struct berval	*fstr,
137 	int		remap );
138 
139 /* suffix massaging by means of librewrite */
140 #ifdef ENABLE_REWRITE
141 extern int
142 suffix_massage_config( struct rewrite_info *info,
143 	struct berval *pvnc,
144 	struct berval *nvnc,
145 	struct berval *prnc,
146 	struct berval *nrnc );
147 #endif /* ENABLE_REWRITE */
148 extern int
149 ldap_back_referral_result_rewrite(
150 	dncookie	*dc,
151 	BerVarray	a_vals );
152 extern int
153 ldap_dnattr_rewrite(
154 	dncookie	*dc,
155 	BerVarray	a_vals );
156 extern int
157 ldap_dnattr_result_rewrite(
158 	dncookie	*dc,
159 	BerVarray	a_vals );
160 
161 /* (end of) from back-ldap.h before rwm removal */
162 
163 /*
164  * A metasingleconn_t can be in the following, mutually exclusive states:
165  *
166  *	- none			(0x0U)
167  *	- creating		META_BACK_FCONN_CREATING
168  *	- initialized		META_BACK_FCONN_INITED
169  *	- binding		LDAP_BACK_FCONN_BINDING
170  *	- bound/anonymous	LDAP_BACK_FCONN_ISBOUND/LDAP_BACK_FCONN_ISANON
171  *
172  * possible modifiers are:
173  *
174  *	- privileged		LDAP_BACK_FCONN_ISPRIV
175  *	- privileged, TLS	LDAP_BACK_FCONN_ISTLS
176  *	- subjected to idassert	LDAP_BACK_FCONN_ISIDASR
177  *	- tainted		LDAP_BACK_FCONN_TAINTED
178  */
179 
180 #define META_BACK_FCONN_INITED		(0x00100000U)
181 #define META_BACK_FCONN_CREATING	(0x00200000U)
182 
183 #define	META_BACK_CONN_INITED(lc)		LDAP_BACK_CONN_ISSET((lc), META_BACK_FCONN_INITED)
184 #define	META_BACK_CONN_INITED_SET(lc)		LDAP_BACK_CONN_SET((lc), META_BACK_FCONN_INITED)
185 #define	META_BACK_CONN_INITED_CLEAR(lc)		LDAP_BACK_CONN_CLEAR((lc), META_BACK_FCONN_INITED)
186 #define	META_BACK_CONN_INITED_CPY(lc, mlc)	LDAP_BACK_CONN_CPY((lc), META_BACK_FCONN_INITED, (mlc))
187 #define	META_BACK_CONN_CREATING(lc)		LDAP_BACK_CONN_ISSET((lc), META_BACK_FCONN_CREATING)
188 #define	META_BACK_CONN_CREATING_SET(lc)		LDAP_BACK_CONN_SET((lc), META_BACK_FCONN_CREATING)
189 #define	META_BACK_CONN_CREATING_CLEAR(lc)	LDAP_BACK_CONN_CLEAR((lc), META_BACK_FCONN_CREATING)
190 #define	META_BACK_CONN_CREATING_CPY(lc, mlc)	LDAP_BACK_CONN_CPY((lc), META_BACK_FCONN_CREATING, (mlc))
191 
192 struct metainfo_t;
193 
194 #define	META_NOT_CANDIDATE		((ber_tag_t)0x0)
195 #define	META_CANDIDATE			((ber_tag_t)0x1)
196 #define	META_BINDING			((ber_tag_t)0x2)
197 #define	META_RETRYING			((ber_tag_t)0x4)
198 
199 typedef struct metasingleconn_t {
200 #define META_CND_ISSET(rs,f)		( ( (rs)->sr_tag & (f) ) == (f) )
201 #define META_CND_SET(rs,f)		( (rs)->sr_tag |= (f) )
202 #define META_CND_CLEAR(rs,f)		( (rs)->sr_tag &= ~(f) )
203 
204 #define META_CANDIDATE_RESET(rs)	( (rs)->sr_tag = 0 )
205 #define META_IS_CANDIDATE(rs)		META_CND_ISSET( (rs), META_CANDIDATE )
206 #define META_CANDIDATE_SET(rs)		META_CND_SET( (rs), META_CANDIDATE )
207 #define META_CANDIDATE_CLEAR(rs)	META_CND_CLEAR( (rs), META_CANDIDATE )
208 #define META_IS_BINDING(rs)		META_CND_ISSET( (rs), META_BINDING )
209 #define META_BINDING_SET(rs)		META_CND_SET( (rs), META_BINDING )
210 #define META_BINDING_CLEAR(rs)		META_CND_CLEAR( (rs), META_BINDING )
211 #define META_IS_RETRYING(rs)		META_CND_ISSET( (rs), META_RETRYING )
212 #define META_RETRYING_SET(rs)		META_CND_SET( (rs), META_RETRYING )
213 #define META_RETRYING_CLEAR(rs)		META_CND_CLEAR( (rs), META_RETRYING )
214 
215 	LDAP            	*msc_ld;
216 	time_t			msc_time;
217 	struct berval          	msc_bound_ndn;
218 	struct berval		msc_cred;
219 	unsigned		msc_mscflags;
220 	/* NOTE: lc_lcflags is redefined to msc_mscflags to reuse the macros
221 	 * defined for back-ldap */
222 #define	lc_lcflags		msc_mscflags
223 } metasingleconn_t;
224 
225 typedef struct metaconn_t {
226 	ldapconn_base_t		lc_base;
227 #define	mc_base			lc_base
228 #define	mc_conn			mc_base.lcb_conn
229 #define	mc_local_ndn		mc_base.lcb_local_ndn
230 #define	mc_refcnt		mc_base.lcb_refcnt
231 #define	mc_create_time		mc_base.lcb_create_time
232 #define	mc_time			mc_base.lcb_time
233 
234 	LDAP_TAILQ_ENTRY(metaconn_t)	mc_q;
235 
236 	/* NOTE: msc_mscflags is used to recycle the #define
237 	 * in metasingleconn_t */
238 	unsigned		msc_mscflags;
239 
240 	/*
241 	 * means that the connection is bound;
242 	 * of course only one target actually is ...
243 	 */
244 	int             	mc_authz_target;
245 #define META_BOUND_NONE		(-1)
246 #define META_BOUND_ALL		(-2)
247 
248 	struct metainfo_t	*mc_info;
249 
250 	/* supersedes the connection stuff */
251 	metasingleconn_t	mc_conns[ 1 ];
252 	/* NOTE: mc_conns must be last, because
253 	 * the required number of conns is malloc'ed
254 	 * in one block with the metaconn_t structure */
255 } metaconn_t;
256 
257 typedef struct metatarget_t {
258 	char			*mt_uri;
259 	ldap_pvt_thread_mutex_t	mt_uri_mutex;
260 
261 	/* TODO: we might want to enable different strategies
262 	 * for different targets */
263 	LDAP_REBIND_PROC	*mt_rebind_f;
264 	LDAP_URLLIST_PROC	*mt_urllist_f;
265 	void			*mt_urllist_p;
266 
267 	BerVarray		mt_subtree_exclude;
268 	int			mt_scope;
269 
270 	struct berval		mt_psuffix;		/* pretty suffix */
271 	struct berval		mt_nsuffix;		/* normalized suffix */
272 
273 	struct berval		mt_binddn;
274 	struct berval		mt_bindpw;
275 
276 	slap_idassert_t		mt_idassert;
277 #define	mt_idassert_mode	mt_idassert.si_mode
278 #define	mt_idassert_authcID	mt_idassert.si_bc.sb_authcId
279 #define	mt_idassert_authcDN	mt_idassert.si_bc.sb_binddn
280 #define	mt_idassert_passwd	mt_idassert.si_bc.sb_cred
281 #define	mt_idassert_authzID	mt_idassert.si_bc.sb_authzId
282 #define	mt_idassert_authmethod	mt_idassert.si_bc.sb_method
283 #define	mt_idassert_sasl_mech	mt_idassert.si_bc.sb_saslmech
284 #define	mt_idassert_sasl_realm	mt_idassert.si_bc.sb_realm
285 #define	mt_idassert_secprops	mt_idassert.si_bc.sb_secprops
286 #define	mt_idassert_tls		mt_idassert.si_bc.sb_tls
287 #define	mt_idassert_flags	mt_idassert.si_flags
288 #define	mt_idassert_authz	mt_idassert.si_authz
289 
290 	int			mt_nretries;
291 #define META_RETRY_UNDEFINED	(-2)
292 #define META_RETRY_FOREVER	(-1)
293 #define META_RETRY_NEVER	(0)
294 #define META_RETRY_DEFAULT	(10)
295 
296 	struct ldaprwmap	mt_rwmap;
297 
298 	sig_atomic_t		mt_isquarantined;
299 	slap_retry_info_t	mt_quarantine;
300 	ldap_pvt_thread_mutex_t	mt_quarantine_mutex;
301 
302 	unsigned		mt_flags;
303 #define	META_BACK_TGT_ISSET(mt,f)		( ( (mt)->mt_flags & (f) ) == (f) )
304 #define	META_BACK_TGT_ISMASK(mt,m,f)		( ( (mt)->mt_flags & (m) ) == (f) )
305 
306 #define META_BACK_TGT_SAVECRED(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_SAVECRED )
307 
308 #define META_BACK_TGT_USE_TLS(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_USE_TLS )
309 #define META_BACK_TGT_PROPAGATE_TLS(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_PROPAGATE_TLS )
310 #define META_BACK_TGT_TLS_CRITICAL(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_TLS_CRITICAL )
311 
312 #define META_BACK_TGT_CHASE_REFERRALS(mt)	META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_CHASE_REFERRALS )
313 
314 #define	META_BACK_TGT_T_F(mt)			META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_T_F_MASK, LDAP_BACK_F_T_F )
315 #define	META_BACK_TGT_T_F_DISCOVER(mt)		META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_T_F_MASK2, LDAP_BACK_F_T_F_DISCOVER )
316 
317 #define	META_BACK_TGT_ABANDON(mt)		META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK, LDAP_BACK_F_CANCEL_ABANDON )
318 #define	META_BACK_TGT_IGNORE(mt)		META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK, LDAP_BACK_F_CANCEL_IGNORE )
319 #define	META_BACK_TGT_CANCEL(mt)		META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK, LDAP_BACK_F_CANCEL_EXOP )
320 #define	META_BACK_TGT_CANCEL_DISCOVER(mt)	META_BACK_TGT_ISMASK( (mt), LDAP_BACK_F_CANCEL_MASK2, LDAP_BACK_F_CANCEL_EXOP_DISCOVER )
321 #define	META_BACK_TGT_QUARANTINE(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_QUARANTINE )
322 
323 #ifdef SLAP_CONTROL_X_SESSION_TRACKING
324 #define	META_BACK_TGT_ST_REQUEST(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_ST_REQUEST )
325 #define	META_BACK_TGT_ST_RESPONSE(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_ST_RESPONSE )
326 #endif /* SLAP_CONTROL_X_SESSION_TRACKING */
327 
328 #define	META_BACK_TGT_NOREFS(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_NOREFS )
329 #define	META_BACK_TGT_NOUNDEFFILTER(mt)		META_BACK_TGT_ISSET( (mt), LDAP_BACK_F_NOUNDEFFILTER )
330 
331 	slap_mask_t		mt_rep_flags;
332 
333 	int			mt_version;
334 	time_t			mt_network_timeout;
335 	struct timeval		mt_bind_timeout;
336 #define META_BIND_TIMEOUT	LDAP_BACK_RESULT_UTIMEOUT
337 	time_t			mt_timeout[ SLAP_OP_LAST ];
338 } metatarget_t;
339 
340 typedef struct metadncache_t {
341 	ldap_pvt_thread_mutex_t mutex;
342 	Avlnode			*tree;
343 
344 #define META_DNCACHE_DISABLED   (0)
345 #define META_DNCACHE_FOREVER    ((time_t)(-1))
346 	time_t			ttl;  /* seconds; 0: no cache, -1: no expiry */
347 } metadncache_t;
348 
349 typedef struct metacandidates_t {
350 	int			mc_ntargets;
351 	SlapReply		*mc_candidates;
352 } metacandidates_t;
353 
354 /*
355  * Hook to allow mucking with metainfo_t/metatarget_t when quarantine is over
356  */
357 typedef int (*meta_back_quarantine_f)( struct metainfo_t *, int target, void * );
358 
359 typedef struct metainfo_t {
360 	int			mi_ntargets;
361 	int			mi_defaulttarget;
362 #define META_DEFAULT_TARGET_NONE	(-1)
363 	int			mi_nretries;
364 
365 	metatarget_t		**mi_targets;
366 	metacandidates_t	*mi_candidates;
367 
368 	LDAP_REBIND_PROC	*mi_rebind_f;
369 	LDAP_URLLIST_PROC	*mi_urllist_f;
370 
371 	metadncache_t		mi_cache;
372 
373 	/* cached connections;
374 	 * special conns are in tailq rather than in tree */
375 	ldap_avl_info_t		mi_conninfo;
376 	struct {
377 		int						mic_num;
378 		LDAP_TAILQ_HEAD(mc_conn_priv_q, metaconn_t)	mic_priv;
379 	}			mi_conn_priv[ LDAP_BACK_PCONN_LAST ];
380 	int			mi_conn_priv_max;
381 
382 	/* NOTE: quarantine uses the connection mutex */
383 	slap_retry_info_t	mi_quarantine;
384 	meta_back_quarantine_f	mi_quarantine_f;
385 	void			*mi_quarantine_p;
386 
387 	unsigned		mi_flags;
388 #define	li_flags		mi_flags
389 /* uses flags as defined in <back-ldap/back-ldap.h> */
390 #define	META_BACK_F_ONERR_STOP		(0x01000000U)
391 #define	META_BACK_F_ONERR_REPORT	(0x02000000U)
392 #define	META_BACK_F_ONERR_MASK		(META_BACK_F_ONERR_STOP|META_BACK_F_ONERR_REPORT)
393 #define	META_BACK_F_DEFER_ROOTDN_BIND	(0x04000000U)
394 #define	META_BACK_F_PROXYAUTHZ_ALWAYS	(0x08000000U)	/* users always proxyauthz */
395 #define	META_BACK_F_PROXYAUTHZ_ANON	(0x10000000U)	/* anonymous always proxyauthz */
396 #define	META_BACK_F_PROXYAUTHZ_NOANON	(0x20000000U)	/* anonymous remains anonymous */
397 
398 #define	META_BACK_ONERR_STOP(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_ONERR_STOP )
399 #define	META_BACK_ONERR_REPORT(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_ONERR_REPORT )
400 #define	META_BACK_ONERR_CONTINUE(mi)	( !LDAP_BACK_ISSET( (mi), META_BACK_F_ONERR_MASK ) )
401 
402 #define META_BACK_DEFER_ROOTDN_BIND(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_DEFER_ROOTDN_BIND )
403 #define META_BACK_PROXYAUTHZ_ALWAYS(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_PROXYAUTHZ_ALWAYS )
404 #define META_BACK_PROXYAUTHZ_ANON(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_PROXYAUTHZ_ANON )
405 #define META_BACK_PROXYAUTHZ_NOANON(mi)	LDAP_BACK_ISSET( (mi), META_BACK_F_PROXYAUTHZ_NOANON )
406 
407 #define META_BACK_QUARANTINE(mi)	LDAP_BACK_ISSET( (mi), LDAP_BACK_F_QUARANTINE )
408 
409 	int			mi_version;
410 	time_t			mi_network_timeout;
411 	time_t			mi_conn_ttl;
412 	time_t			mi_idle_timeout;
413 	struct timeval		mi_bind_timeout;
414 	time_t			mi_timeout[ SLAP_OP_LAST ];
415 
416 	ldap_extra_t	*mi_ldap_extra;
417 
418 } metainfo_t;
419 
420 typedef enum meta_op_type {
421 	META_OP_ALLOW_MULTIPLE = 0,
422 	META_OP_REQUIRE_SINGLE,
423 	META_OP_REQUIRE_ALL
424 } meta_op_type;
425 
426 SlapReply *
427 meta_back_candidates_get( Operation *op );
428 
429 extern metaconn_t *
430 meta_back_getconn(
431 	Operation		*op,
432 	SlapReply		*rs,
433 	int			*candidate,
434 	ldap_back_send_t	sendok );
435 
436 extern void
437 meta_back_release_conn_lock(
438        	metainfo_t		*mi,
439 	metaconn_t		*mc,
440 	int			dolock );
441 #define meta_back_release_conn(mi, mc)	meta_back_release_conn_lock( (mi), (mc), 1 )
442 
443 extern int
444 meta_back_retry(
445 	Operation		*op,
446 	SlapReply		*rs,
447 	metaconn_t		**mcp,
448 	int			candidate,
449 	ldap_back_send_t	sendok );
450 
451 extern void
452 meta_back_conn_free(
453 	void			*v_mc );
454 
455 #if META_BACK_PRINT_CONNTREE > 0
456 extern void
457 meta_back_print_conntree(
458 	metainfo_t		*mi,
459 	char			*msg );
460 #endif
461 
462 extern int
463 meta_back_init_one_conn(
464 	Operation		*op,
465 	SlapReply		*rs,
466 	metaconn_t		*mc,
467 	int			candidate,
468 	int			ispriv,
469 	ldap_back_send_t	sendok,
470 	int			dolock );
471 
472 extern void
473 meta_back_quarantine(
474 	Operation		*op,
475 	SlapReply		*rs,
476 	int			candidate );
477 
478 extern int
479 meta_back_dobind(
480 	Operation		*op,
481 	SlapReply		*rs,
482 	metaconn_t		*mc,
483 	ldap_back_send_t	sendok );
484 
485 extern int
486 meta_back_single_dobind(
487 	Operation		*op,
488 	SlapReply		*rs,
489 	metaconn_t		**mcp,
490 	int			candidate,
491 	ldap_back_send_t	sendok,
492 	int			retries,
493 	int			dolock );
494 
495 extern int
496 meta_back_proxy_authz_cred(
497 	metaconn_t		*mc,
498 	int			candidate,
499 	Operation		*op,
500 	SlapReply		*rs,
501 	ldap_back_send_t	sendok,
502 	struct berval		*binddn,
503 	struct berval		*bindcred,
504 	int			*method );
505 
506 extern int
507 meta_back_cancel(
508 	metaconn_t		*mc,
509 	Operation		*op,
510 	SlapReply		*rs,
511 	ber_int_t		msgid,
512 	int			candidate,
513 	ldap_back_send_t	sendok );
514 
515 extern int
516 meta_back_op_result(
517 	metaconn_t		*mc,
518 	Operation		*op,
519 	SlapReply		*rs,
520 	int			candidate,
521 	ber_int_t		msgid,
522 	time_t			timeout,
523 	ldap_back_send_t	sendok );
524 
525 extern int
526 meta_back_controls_add(
527 	Operation	*op,
528 	SlapReply	*rs,
529 	metaconn_t	*mc,
530 	int		candidate,
531 	LDAPControl	***pctrls );
532 
533 extern int
534 back_meta_LTX_init_module(
535 	int			argc,
536 	char			*argv[] );
537 
538 extern int
539 meta_back_conn_cmp(
540 	const void		*c1,
541 	const void		*c2 );
542 
543 extern int
544 meta_back_conndn_cmp(
545 	const void		*c1,
546 	const void		*c2 );
547 
548 extern int
549 meta_back_conndn_dup(
550 	void			*c1,
551 	void			*c2 );
552 
553 /*
554  * Candidate stuff
555  */
556 extern int
557 meta_back_is_candidate(
558 	metatarget_t		*mt,
559 	struct berval		*ndn,
560 	int			scope );
561 
562 extern int
563 meta_back_select_unique_candidate(
564 	metainfo_t		*mi,
565 	struct berval		*ndn );
566 
567 extern int
568 meta_clear_unused_candidates(
569 	Operation		*op,
570 	int			candidate );
571 
572 extern int
573 meta_clear_one_candidate(
574 	Operation		*op,
575 	metaconn_t		*mc,
576 	int			candidate );
577 
578 /*
579  * Dn cache stuff (experimental)
580  */
581 extern int
582 meta_dncache_cmp(
583 	const void		*c1,
584 	const void		*c2 );
585 
586 extern int
587 meta_dncache_dup(
588 	void			*c1,
589 	void			*c2 );
590 
591 #define META_TARGET_NONE	(-1)
592 #define META_TARGET_MULTIPLE	(-2)
593 extern int
594 meta_dncache_get_target(
595 	metadncache_t		*cache,
596 	struct berval		*ndn );
597 
598 extern int
599 meta_dncache_update_entry(
600 	metadncache_t		*cache,
601 	struct berval		*ndn,
602 	int			target );
603 
604 extern int
605 meta_dncache_delete_entry(
606 	metadncache_t		*cache,
607 	struct berval		*ndn );
608 
609 extern void
610 meta_dncache_free( void *entry );
611 
612 extern LDAP_REBIND_PROC		meta_back_default_rebind;
613 extern LDAP_URLLIST_PROC	meta_back_default_urllist;
614 
615 LDAP_END_DECL
616 
617 #endif /* SLAPD_META_H */
618 
619