slap.h 34.9 KB
Newer Older
Kurt Zeilenga's avatar
Kurt Zeilenga committed
1
/* slap.h - stand alone ldap server include file */
2
/* $OpenLDAP$ */
3
/*
Kurt Zeilenga's avatar
Kurt Zeilenga committed
4
 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5
6
 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
 */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
7

Kurt Zeilenga's avatar
Kurt Zeilenga committed
8
9
#ifndef _SLAP_H_
#define _SLAP_H_
Kurt Zeilenga's avatar
Kurt Zeilenga committed
10

11
12
#include "ldap_defaults.h"

Kurt Zeilenga's avatar
Kurt Zeilenga committed
13
#include <ac/stdlib.h>
Kurt Zeilenga's avatar
Kurt Zeilenga committed
14

15
#include <sys/types.h>
Kurt Zeilenga's avatar
Kurt Zeilenga committed
16
17
#include <ac/syslog.h>
#include <ac/regex.h>
Kurt Zeilenga's avatar
Kurt Zeilenga committed
18
#include <ac/socket.h>
19
#include <ac/time.h>
20
#include <ac/param.h>
Kurt Zeilenga's avatar
Kurt Zeilenga committed
21

22
23
24
25
#ifdef HAVE_CYRUS_SASL
#include <sasl.h>
#endif

Kurt Zeilenga's avatar
Kurt Zeilenga committed
26
#include "avl.h"
27
28
29
30
31

#ifndef ldap_debug
#define ldap_debug slap_debug
#endif

32

33
34
#include "ldap_log.h"

Kurt Zeilenga's avatar
Kurt Zeilenga committed
35
36
#include <ldap.h>
#include <ldap_schema.h>
37

38
#include "ldap_pvt_thread.h"
Kurt Zeilenga's avatar
Kurt Zeilenga committed
39
#include "ldif.h"
40
41
42

LDAP_BEGIN_DECL

43
44
45
#define SERVICE_NAME  OPENLDAP_PACKAGE "-slapd"
#define SLAPD_ANONYMOUS "<anonymous>"

Hallvard Furuseth's avatar
Hallvard Furuseth committed
46
47
48
#ifdef f_next
#undef f_next /* name conflict between sys/file.h on SCO and struct filter */
#endif
Kurt Zeilenga's avatar
Kurt Zeilenga committed
49

Juan Gomez's avatar
Juan Gomez committed
50
51
52
53
54
55
56
/* LDAPMod.mod_op value ===> Must be kept in sync with ldap.h!
 *
 * This is a value used internally by the backends. It is needed to allow
 * adding values that already exist without getting an error as required by
 * modrdn when the new rdn was already an attribute value itself.
 * JCG 05/1999 (gomez@engr.sgi.com)
 */
57
#define SLAP_MOD_SOFTADD	0x1000
Juan Gomez's avatar
Juan Gomez committed
58

Kurt Zeilenga's avatar
Kurt Zeilenga committed
59
60
#define ON	1
#define OFF	(-1)
61
#define UNDEFINED 0
Kurt Zeilenga's avatar
Kurt Zeilenga committed
62

63
64
#define MAXREMATCHES 10

65
66

/* psuedo error code indicating abandoned operation */
67
68
69
70
#define SLAPD_ABANDON (-1)

/* psuedo error code indicating disconnect */
#define SLAPD_DISCONNECT (-2)
71

72

73
74
/* We assume "C" locale, that is US-ASCII */
#define ASCII_SPACE(c)	( (c) == ' ' )
75
76
77
78
79
80
#define ASCII_LOWER(c)	( (c) >= 'a' && (c) <= 'z' )
#define ASCII_UPPER(c)	( (c) >= 'A' && (c) <= 'Z' )
#define ASCII_ALPHA(c)	( ASCII_LOWER(c) || ASCII_UPPER(c) )
#define ASCII_DIGIT(c)	( (c) >= '0' && (c) <= '9' )
#define ASCII_ALNUM(c)	( ASCII_ALPHA(c) || ASCII_DIGIT(c) )

81
82
83
84
85
86
87
88
#define DN_SEPARATOR(c)	((c) == ',' || (c) == ';')
#define RDN_SEPARATOR(c)	((c) == ',' || (c) == ';' || (c) == '+')
#define RDN_NEEDSESCAPE(c)	((c) == '\\' || (c) == '"')

#define DESC_LEADCHAR(c)	( ASCII_ALPHA(c) )
#define DESC_CHAR(c)	( ASCII_ALNUM(c) || (c) == '-' )
#define OID_LEADCHAR(c)	( ASCII_DIGIT(c) )
#define OID_CHAR(c)	( ASCII_DIGIT(c) || (c) == '.' )
89

90
91
#define ATTR_LEADCHAR(c)	( DESC_LEADCHAR(c) || OID_LEADCHAR(c) )
#define ATTR_CHAR(c)	( DESC_CHAR((c)) || (c) == '.' )
92

93
94
#define AD_LEADCHAR(c)	( ATTR_CHAR(c) )
#define AD_CHAR(c)		( ATTR_CHAR(c) || (c) == ';' )
95

96
#ifndef SLAPD_SCHEMA_NOT_COMPAT
97
/* schema needed by slapd */
98
#define SLAPD_OID_ACI_SYNTAX "1.3.6.1.4.1.4203.666.2.1" /* experimental */
99
100
101
#define SLAPD_ACI_DEFAULT_ATTR		"aci"
#endif

102

103
104
LIBSLAPD_F (int) slap_debug;

105
106
107
108
109
110
/*
 * Index types
 */
#define SLAP_INDEX_PRESENCE      0x0001U
#define SLAP_INDEX_EQUALITY      0x0002U
#define SLAP_INDEX_APPROX        0x0004U
111
#define SLAP_INDEX_SUBSTR        0x0008U
112
113
#define SLAP_INDEX_EXTENDED		 0x0010U
#define SLAP_INDEX_UNDEFINED     0x1000U
114
115
#define SLAP_INDEX_FROMINIT      0x8000U	/* psuedo type */

116
117
118
/*
 * represents schema information for a database
 */
Julio Sánchez Fernández's avatar
   
Julio Sánchez Fernández committed
119
120
121
122
123
#define SLAP_SCHERR_OUTOFMEM		1
#define SLAP_SCHERR_CLASS_NOT_FOUND	2
#define SLAP_SCHERR_ATTR_NOT_FOUND	3
#define SLAP_SCHERR_DUP_CLASS		4
#define SLAP_SCHERR_DUP_ATTR		5
Julio Sánchez Fernández's avatar
   
Julio Sánchez Fernández committed
124
125
126
127
128
129
#define SLAP_SCHERR_DUP_SYNTAX		6
#define SLAP_SCHERR_DUP_RULE		7
#define SLAP_SCHERR_NO_NAME		8
#define SLAP_SCHERR_ATTR_INCOMPLETE	9
#define SLAP_SCHERR_MR_NOT_FOUND	10
#define SLAP_SCHERR_SYN_NOT_FOUND	11
130
#define SLAP_SCHERR_MR_INCOMPLETE	12
Julio Sánchez Fernández's avatar
   
Julio Sánchez Fernández committed
131

132
typedef struct slap_oid_macro {
133
	struct berval som_oid;
134
	char **som_names;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
135
	struct slap_oid_macro *som_next;
136
137
} OidMacro;

Kurt Zeilenga's avatar
Kurt Zeilenga committed
138
139
140
141
/* forward declarations */
struct slap_syntax;
struct slap_matching_rule;

142
typedef int slap_syntax_validate_func LDAP_P((
Kurt Zeilenga's avatar
Kurt Zeilenga committed
143
	struct slap_syntax *syntax,
144
145
	struct berval * in));

Kurt Zeilenga's avatar
Kurt Zeilenga committed
146
147
typedef int slap_syntax_transform_func LDAP_P((
	struct slap_syntax *syntax,
148
149
150
151
152
	struct berval * in,
	struct berval ** out));

typedef struct slap_syntax {
	LDAP_SYNTAX			ssyn_syn;
153
154
#define ssyn_oid		ssyn_syn.syn_oid
#define ssyn_desc		ssyn_syn.syn_desc
155
#define ssyn_extensions		ssyn_syn.syn_extensions
156

157
	unsigned	ssyn_flags;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
158

159
160
161
162
163
#define SLAP_SYNTAX_NONE	0x00U
#define SLAP_SYNTAX_BLOB	0x01U /* syntax treated as blob (audio) */
#define SLAP_SYNTAX_BINARY	0x02U /* binary transfer required (certificate) */
#define SLAP_SYNTAX_BER		0x04U /* stored using BER encoding (binary,certificate) */
#define SLAP_SYNTAX_HIDE	0x80U /* hide (do not publish) */
164

165
	slap_syntax_validate_func	*ssyn_validate;
166
167
	slap_syntax_transform_func	*ssyn_normalize;
	slap_syntax_transform_func	*ssyn_pretty;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
168

169
#ifdef SLAPD_BINARY_CONVERSION
Kurt Zeilenga's avatar
Kurt Zeilenga committed
170
171
172
	/* convert to and from binary */
	slap_syntax_transform_func	*ssyn_ber2str;
	slap_syntax_transform_func	*ssyn_str2ber;
173
#endif
Kurt Zeilenga's avatar
Kurt Zeilenga committed
174

175
176
177
	struct slap_syntax		*ssyn_next;
} Syntax;

178
179
180
181
#define slap_syntax_is_flag(s,flag) ((int)((s)->ssyn_flags & (flag)) ? 1 : 0)
#define slap_syntax_is_blob(s)		slap_syntax_is_flag((s),SLAP_SYNTAX_BLOB)
#define slap_syntax_is_binary(s)	slap_syntax_is_flag((s),SLAP_SYNTAX_BINARY)
#define slap_syntax_is_ber(s)		slap_syntax_is_flag((s),SLAP_SYNTAX_BER)
182
#define slap_syntax_is_hidden(s)	slap_syntax_is_flag((s),SLAP_SYNTAX_HIDE)
183

184
185
186
187
/* XXX -> UCS-2 Converter */
typedef int slap_mr_convert_func LDAP_P((
	struct berval * in,
	struct berval ** out ));
Kurt Zeilenga's avatar
Kurt Zeilenga committed
188
189
190

/* Normalizer */
typedef int slap_mr_normalize_func LDAP_P((
191
	unsigned use,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
192
193
194
195
196
197
	struct slap_syntax *syntax, /* NULL if in is asserted value */
	struct slap_matching_rule *mr,
	struct berval * in,
	struct berval ** out ));

/* Match (compare) function */
198
typedef int slap_mr_match_func LDAP_P((
199
	int *match,
200
	unsigned use,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
201
202
203
	struct slap_syntax *syntax,	/* syntax of stored value */
	struct slap_matching_rule *mr,
	struct berval * value,
204
	void * assertValue ));
205

206
207
/* Index generation function */
typedef int slap_mr_indexer_func LDAP_P((
208
	unsigned use,
209
210
211
212
213
214
	struct slap_syntax *syntax,	/* syntax of stored value */
	struct slap_matching_rule *mr,
	struct berval **values,
	struct berval **keys ));

struct slap_filter; 	/* forward declaration */
215

216
217
/* Filter index function */
typedef int slap_mr_filter_func LDAP_P((
218
	unsigned use,
219
220
221
222
223
	struct slap_syntax *syntax,	/* syntax of stored value */
	struct slap_matching_rule *mr,
	struct slap_filter *filter,
	struct berval **keys ));

224
225
typedef struct slap_matching_rule {
	LDAP_MATCHING_RULE		smr_mrule;
226
	unsigned				smr_usage;
227
228
229
230
231
232

#define SLAP_MR_TYPE_MASK		0xFF00U
#define SLAP_MR_SUBTYPE_MASK	0x00FFU

#define SLAP_MR_NONE			0x0000U
#define SLAP_MR_EQUALITY		0x0100U
233
234
235
#define SLAP_MR_ORDERING		0x0200U
#define SLAP_MR_SUBSTR			0x0400U
#define SLAP_MR_EXT				0x0800U
236

237
238
239
240
241
#define SLAP_MR_EQUALITY_APPROX	( SLAP_MR_EQUALITY | 0x0001U )

#define SLAP_MR_SUBSTR_INITIAL	( SLAP_MR_SUBSTR | 0x0001U )
#define SLAP_MR_SUBSTR_ANY		( SLAP_MR_SUBSTR | 0x0002U )
#define SLAP_MR_SUBSTR_FINAL	( SLAP_MR_SUBSTR | 0x0004U )
242

243
	Syntax					*smr_syntax;
244
	slap_mr_convert_func	*smr_convert;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
245
	slap_mr_normalize_func	*smr_normalize;
246
	slap_mr_match_func		*smr_match;
247
248
	slap_mr_indexer_func	*smr_indexer;
	slap_mr_filter_func		*smr_filter;
249
250
251
252
	struct slap_matching_rule	*smr_next;
#define smr_oid				smr_mrule.mr_oid
#define smr_names			smr_mrule.mr_names
#define smr_desc			smr_mrule.mr_desc
Kurt Zeilenga's avatar
Kurt Zeilenga committed
253
254
#define smr_obsolete		smr_mrule.mr_obsolete
#define smr_syntax_oid		smr_mrule.mr_syntax_oid
255
#define smr_extensions		smr_mrule.mr_extensions
256
257
258
} MatchingRule;

typedef struct slap_attribute_type {
259
260
261
#ifdef SLAPD_SCHEMA_NOT_COMPAT
	char					*sat_cname;
#endif
262
263
264
265
266
267
268
	LDAP_ATTRIBUTE_TYPE		sat_atype;
	struct slap_attribute_type	*sat_sup;
	struct slap_attribute_type	**sat_subtypes;
	MatchingRule			*sat_equality;
	MatchingRule			*sat_ordering;
	MatchingRule			*sat_substr;
	Syntax				*sat_syntax;
269
#ifndef SLAPD_SCHEMA_NOT_COMPAT
270
271
	/* The next one is created to help in the transition */
	int				sat_syntax_compat;
272
#endif
273
274
275
276
277
278
279
280
281
282
283
284
	struct slap_attribute_type	*sat_next;
#define sat_oid			sat_atype.at_oid
#define sat_names		sat_atype.at_names
#define sat_desc		sat_atype.at_desc
#define sat_obsolete		sat_atype.at_obsolete
#define sat_sup_oid		sat_atype.at_sup_oid
#define sat_equality_oid	sat_atype.at_equality_oid
#define sat_ordering_oid	sat_atype.at_ordering_oid
#define sat_substr_oid		sat_atype.at_substr_oid
#define sat_syntax_oid		sat_atype.at_syntax_oid
#define sat_single_value	sat_atype.at_single_value
#define sat_collective		sat_atype.at_collective
285
#define sat_no_user_mod		sat_atype.at_no_user_mod
286
#define sat_usage		sat_atype.at_usage
287
#define sat_extensions		sat_atype.at_extensions
288
289
} AttributeType;

290
291
292
293
294
#define is_at_operational(at)	((at)->sat_usage)
#define is_at_single_value(at)	((at)->sat_single_value)
#define is_at_collective(at)	((at)->sat_collective)
#define is_at_no_user_mod(at)	((at)->sat_no_user_mod)

295
296
297
298
299
300
301
302
303
304
305
306
307
308
typedef struct slap_object_class {
	LDAP_OBJECT_CLASS		soc_oclass;
	struct slap_object_class	**soc_sups;
	AttributeType			**soc_required;
	AttributeType			**soc_allowed;
	struct slap_object_class	*soc_next;
#define soc_oid			soc_oclass.oc_oid
#define soc_names		soc_oclass.oc_names
#define soc_desc		soc_oclass.oc_desc
#define soc_obsolete		soc_oclass.oc_obsolete
#define soc_sup_oids		soc_oclass.oc_sup_oids
#define soc_kind		soc_oclass.oc_kind
#define soc_at_oids_must	soc_oclass.oc_at_oids_must
#define soc_at_oids_may		soc_oclass.oc_at_oids_may
309
#define soc_extensions		soc_oclass.oc_extensions
310
} ObjectClass;
311

312

313
314
315
316
317
318
319
320
321
322
323
324
325
#ifdef SLAPD_SCHEMA_NOT_COMPAT
/*
 * represents a recognized attribute description ( type + options )
 */
typedef struct slap_attr_desc {
	struct berval *ad_cname;	/* canonical name */
	AttributeType *ad_type;		/* NULL if unknown */
	char *ad_lang;				/* NULL if no language tags */
	unsigned ad_flags;
#define SLAP_DESC_NONE		0x0U
#define SLAP_DESC_BINARY	0x1U
} AttributeDescription;

326
327
#define slap_ad_is_binary(ad)	( (int)((ad)->ad_flags & SLAP_DESC_BINARY) ? 1 : 0 )

328
329
330
331
/*
 * pointers to schema elements used internally
 */
struct slap_internal_schema {
332
	/* objectClass */
333
	ObjectClass *si_oc_top;
334
335
	ObjectClass *si_oc_alias;
	ObjectClass *si_oc_referral;
336
337
338
339
340
341
	ObjectClass *si_oc_subentry;
	ObjectClass *si_oc_subschema;
	ObjectClass *si_oc_rootdse;
#ifdef SLAPD_ACI_ENABLED
	ObjectClass *si_oc_groupOfNames;
#endif
342

343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
	/* objectClass attribute */
	AttributeDescription *si_ad_objectClass;

	/* operational attributes */
	AttributeDescription *si_ad_creatorsName;
	AttributeDescription *si_ad_createTimestamp;
	AttributeDescription *si_ad_modifiersName;
	AttributeDescription *si_ad_modifyTimestamp;
	AttributeDescription *si_ad_subschemaSubentry;

	/* root DSE attributes */
	AttributeDescription *si_ad_namingContexts;
	AttributeDescription *si_ad_supportedControl;
	AttributeDescription *si_ad_supportedExtension;
	AttributeDescription *si_ad_supportedLDAPVersion;
358
359
360
#ifdef SLAPD_ACI_ENABLED
	AttributeDescription *si_ad_supportedACIMechanisms;
#endif
361
362
363
364
365
366
367
368
369
370
371
372
373
	AttributeDescription *si_ad_supportedSASLMechanisms;

	/* subschema subentry attributes */
	AttributeDescription *si_ad_objectClasses;
	AttributeDescription *si_ad_attributeTypes;
	AttributeDescription *si_ad_ldapSyntaxes;
	AttributeDescription *si_ad_matchingRules;
	AttributeDescription *si_ad_matchingRulesUse;

	/* Aliases & Referrals */
	AttributeDescription *si_ad_aliasedObjectName;
	AttributeDescription *si_ad_ref;

374
	/* Access Control Internals */
375
376
	AttributeDescription *si_ad_entry;
	AttributeDescription *si_ad_children;
377
378
379
380
381
	AttributeDescription *si_ad_member;
	AttributeDescription *si_ad_distinguishedName;
#ifdef SLAPD_ACI_ENABLED
	AttributeDescription *si_ad_aci;
#endif
382
383
384

	/* Other */
	AttributeDescription *si_ad_userPassword;
385
386
387
388
	AttributeDescription *si_ad_authPassword;
#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND
	AttributeDescription *si_ad_krbName;
#endif
389
390
};

391
typedef struct slap_attr_assertion {
392
	AttributeDescription	*aa_desc;
393
394
395
	struct berval *aa_value;
} AttributeAssertion;

396
397
398
399
400
401
402
typedef struct slap_ss_assertion {
	AttributeDescription	*sa_desc;
	struct berval			*sa_initial;
	struct berval			**sa_any;
	struct berval			*sa_final;
} SubstringAssertion;

403
404
405
406
407
408
typedef struct slap_mr_assertion {
	char					*ma_rule;	/* optional */
	AttributeDescription	*ma_desc;	/* optional */
	int						ma_dnattrs; /* boolean */
	struct berval			*ma_value;	/* required */
} MatchingRuleAssertion;
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429

#else

/*
 * represents an attribute value assertion (i.e., attr;option=value)
 */
typedef struct slap_ava {
	char		*ava_type;	/* attribute description */
	struct berval	ava_value;
} Ava;

/*
 * represents an matching rule assertion
 */
typedef struct slap_mra {
	char	*mra_rule;	/* optional */
	char	*mra_type;	/* attribute description -- optional */
	int		mra_dnattrs;
	struct berval	*mra_value;
} Mra;

430
431
#endif

Kurt Zeilenga's avatar
Kurt Zeilenga committed
432
433
434
/*
 * represents a search filter
 */
435

Kurt Zeilenga's avatar
Kurt Zeilenga committed
436
typedef struct slap_filter {
437
	ber_tag_t	f_choice;	/* values taken from ldap.h, plus: */
438
439
440
441
#define SLAPD_FILTER_COMPUTED	((ber_tag_t) -1)
#define SLAPD_FILTER_DN_ONE		((ber_tag_t) -2)
#define SLAPD_FILTER_DN_SUBTREE	((ber_tag_t) -3)

Kurt Zeilenga's avatar
Kurt Zeilenga committed
442

Kurt Zeilenga's avatar
Kurt Zeilenga committed
443
	union f_un_u {
444
445
446
		/* precomputed result */
		ber_int_t f_un_result;

447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
#ifdef SLAPD_SCHEMA_NOT_COMPAT
		/* DN */
		char *f_un_dn;

		/* present */
		AttributeDescription *f_un_desc;

		/* simple value assertion */
		AttributeAssertion *f_un_ava;

		/* substring assertion */
		SubstringAssertion *f_un_ssa;

		/* matching rule assertion */
		MatchingRuleAssertion *f_un_mra;

#define f_dn			f_un.f_un_dn
#define f_desc			f_un.f_un_desc
#define f_ava			f_un.f_un_ava
#define f_av_desc		f_un.f_un_ava->aa_desc
#define f_av_value		f_un.f_un_ava->aa_value
#define f_sub			f_un.f_un_ssa
#define f_sub_desc		f_un.f_un_ssa->sa_desc
#define f_sub_initial	f_un.f_un_ssa->sa_initial
#define f_sub_any		f_un.f_un_ssa->sa_any
#define f_sub_final		f_un.f_un_ssa->sa_final
#define f_mra			f_un.f_un_mra
#define f_mr_rule		f_un.f_un_mra->ma_rule
#define f_mr_desc		f_un.f_un_mra->ma_desc
#define f_mr_value		f_un.f_un_mra->ma_value
#define	f_mr_dnaddrs	f_un.f_un_mra->ma_dnattrs
#else
Kurt Zeilenga's avatar
Kurt Zeilenga committed
479
480
481
482
483
484
		/* present */
		char		*f_un_type;

		/* equality, lessorequal, greaterorequal, approx */
		Ava		f_un_ava;

485
486
487
		/* extensible */
		Mra		f_un_fra;	

Kurt Zeilenga's avatar
Kurt Zeilenga committed
488
489
490
		/* substrings */
		struct sub {
			char	*f_un_sub_type;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
491
492
493
494

			struct berval	*f_un_sub_initial;
			struct berval	**f_un_sub_any;
			struct berval	*f_un_sub_final;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
495
		} f_un_sub;
496
497

#define f_dn		f_un.f_un_type  /* used for DN indices */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
498
499
500
501
#define f_type		f_un.f_un_type
#define f_ava		f_un.f_un_ava
#define f_avtype	f_un.f_un_ava.ava_type
#define f_avvalue	f_un.f_un_ava.ava_value
502
503
504
505
#define f_mra		f_un.f_un_mra
#define f_mrtype	f_un.f_un_mra.mra_type
#define f_mrvalue	f_un.f_un_mra.mra_value
#define	f_mrdnaddrs	f_un.f_un_mra.mra_dnattrs
Kurt Zeilenga's avatar
Kurt Zeilenga committed
506
507
#define f_sub		f_un.f_un_sub
#define f_sub_type	f_un.f_un_sub.f_un_sub_type
508
#define f_sub_desc	f_sub_type
Kurt Zeilenga's avatar
Kurt Zeilenga committed
509
510
511
#define f_sub_initial	f_un.f_un_sub.f_un_sub_initial
#define f_sub_any	f_un.f_un_sub.f_un_sub_any
#define f_sub_final	f_un.f_un_sub.f_un_sub_final
512
#endif
513
514
515

		/* and, or, not */
		struct slap_filter *f_un_complex;
516
517
	} f_un;

518
#define f_result	f_un.f_un_result
519
520
521
522
#define f_and		f_un.f_un_complex
#define f_or		f_un.f_un_complex
#define f_not		f_un.f_un_complex
#define f_list		f_un.f_un_complex
Kurt Zeilenga's avatar
Kurt Zeilenga committed
523

Kurt Zeilenga's avatar
Kurt Zeilenga committed
524
	struct slap_filter	*f_next;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
525
526
} Filter;

527
528
529
/* compare routines can return undefined */
#define SLAPD_COMPARE_UNDEFINED	((ber_tag_t) -1)

Kurt Zeilenga's avatar
Kurt Zeilenga committed
530
/*
531
 * represents an attribute (description + values)
Kurt Zeilenga's avatar
Kurt Zeilenga committed
532
 */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
533
typedef struct slap_attr {
534
#ifdef SLAPD_SCHEMA_NOT_COMPAT
535
	AttributeDescription *a_desc;
536
#else
537
	char		*a_type;	/* description */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
538
	int		a_syntax;
539
#endif
540
	struct berval	**a_vals;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
541
	struct slap_attr	*a_next;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
542
543
} Attribute;

544
#ifndef SLAPD_SCHEMA_NOT_COMPAT
Kurt Zeilenga's avatar
Kurt Zeilenga committed
545
546
547
548
549
550
551
552
553
/*
 * the attr_syntax() routine returns one of these values
 * telling what kind of syntax an attribute supports.
 */
#define SYNTAX_CIS	0x01	/* case insensitive string		*/
#define SYNTAX_CES	0x02	/* case sensitive string		*/
#define SYNTAX_BIN	0x04	/* binary data 				*/
#define SYNTAX_TEL	0x08	/* telephone number string		*/
#define SYNTAX_DN	0x10	/* dn string				*/
554
#endif
Kurt Zeilenga's avatar
Kurt Zeilenga committed
555
556
557
558
559

/*
 * the id used in the indexes to refer to an entry
 */
typedef unsigned long	ID;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
560
#define NOID	((ID)~0)
Kurt Zeilenga's avatar
Kurt Zeilenga committed
561
562
563
564

/*
 * represents an entry in core
 */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
565
typedef struct slap_entry {
566
567
568
569
570
	/*
	 * The ID field should only be changed before entry is
	 * inserted into a cache.  The ID value is backend
	 * specific.
	 */
571
	ID		e_id;
572

573
574
575
	char		*e_dn;		/* DN of this entry */
	char		*e_ndn;		/* normalized DN of this entry */
	Attribute	*e_attrs;	/* list of attributes + values */
576

577
578
	/* for use by the backend for any purpose */
	void*	e_private;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
579
580
} Entry;

581
582
583
584
585
586
/*
 * A list of LDAPMods
 */
#ifdef SLAPD_SCHEMA_NOT_COMPAT
typedef struct slap_mod {
	int sm_op;
587
	AttributeDescription *sm_desc;
588
589
590
591
	struct berval **sm_bvalues;
} Modification;
#else
#define Modification LDAPMod
592
593
594
#define sm_op mod_op
#define sm_desc	mod_type
#define sm_bvalues mod_bvalues
595
596
597
#endif

typedef struct slap_mod_list {
598
599
600
601
	Modification sml_mod;
#define sml_op		sml_mod.sm_op
#define sml_desc	sml_mod.sm_desc
#define sml_bvalues	sml_mod.sm_bvalues
602
#ifndef SLAPD_SCHEMA_NOT_COMPAT
603
#define sml_type	sml_mod.sm_desc
604
605
606
607
608
609
610
611
#endif
	struct slap_mod_list *sml_next;
} Modifications;

#ifdef SLAPD_SCHEMA_NOT_COMPAT
typedef struct slap_ldap_modlist {
	LDAPMod ml_mod;
	struct slap_ldap_modlist *ml_next;
612
613
614
615
#define ml_op		ml_mod.mod_op
#define ml_type		ml_mod.mod_type
#define ml_values	ml_mod.mod_values
#define ml_bvalues	ml_mod.mod_bvalues
616
617
618
619
620
621
622
623
624
} LDAPModList;
#else
#define LDAPModList Modifications
#define ml_mod		sml_mod
#define ml_op		sml_mod.mod_op
#define ml_type		sml_mod.mod_type
#define ml_values	sml_mod.mod_values
#define ml_bvalues	sml_mod.mod_bvalues
#define ml_next		sml_next
625
626
#endif

Kurt Zeilenga's avatar
Kurt Zeilenga committed
627
628
629
630
/*
 * represents an access control list
 */

631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
typedef enum slap_access_e {
	ACL_INVALID_ACCESS = -1,
	ACL_NONE = 0,
	ACL_AUTH,
	ACL_COMPARE,
	ACL_SEARCH,
	ACL_READ,
	ACL_WRITE
} slap_access_t;

typedef enum slap_control_e {
	ACL_INVALID_CONTROL	= 0,
	ACL_STOP,
	ACL_CONTINUE,
	ACL_BREAK
} slap_control_t;

typedef unsigned long slap_access_mask_t;

Kurt Zeilenga's avatar
Kurt Zeilenga committed
650
/* the "by" part */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
651
typedef struct slap_access {
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
	slap_control_t a_type;

#define ACL_ACCESS2PRIV(access)	(0x01U << (access))

#define ACL_PRIV_NONE			ACL_ACCESS2PRIV( ACL_NONE )
#define ACL_PRIV_AUTH			ACL_ACCESS2PRIV( ACL_AUTH )
#define ACL_PRIV_COMPARE		ACL_ACCESS2PRIV( ACL_COMPARE )
#define ACL_PRIV_SEARCH			ACL_ACCESS2PRIV( ACL_SEARCH )
#define ACL_PRIV_READ			ACL_ACCESS2PRIV( ACL_READ )
#define ACL_PRIV_WRITE			ACL_ACCESS2PRIV( ACL_WRITE )

#define ACL_PRIV_MASK			0x00ffUL

/* priv flags */
#define ACL_PRIV_LEVEL			0x1000UL
#define ACL_PRIV_ADDITIVE		0x2000UL
#define ACL_PRIV_SUBSTRACTIVE	0x4000UL

/* invalid privs */
#define ACL_PRIV_INVALID		0x0UL

#define ACL_PRIV_ISSET(m,p)		(((m) & (p)) == (p))
#define ACL_PRIV_ASSIGN(m,p)	do { (m)  =  (p); } while(0)
#define ACL_PRIV_SET(m,p)		do { (m) |=  (p); } while(0)
#define ACL_PRIV_CLR(m,p)		do { (m) &= ~(p); } while(0)

#define ACL_INIT(m)				ACL_PRIV_ASSIGN(m, ACL_PRIV_NONE)
#define ACL_INVALIDATE(m)		ACL_PRIV_ASSIGN(m, ACL_PRIV_INVALID)

#define ACL_GRANT(m,a)			ACL_PRIV_ISSET((m),ACL_ACCESS2PRIV(a))

#define ACL_IS_INVALID(m)		((m) == ACL_PRIV_INVALID)

#define ACL_IS_LEVEL(m)			ACL_PRIV_ISSET((m),ACL_PRIV_LEVEL)
#define ACL_IS_ADDITIVE(m)		ACL_PRIV_ISSET((m),ACL_PRIV_ADDITIVE)
#define ACL_IS_SUBTRACTIVE(m)	ACL_PRIV_ISSET((m),ACL_PRIV_SUBSTRACTIVE)

#define ACL_LVL_NONE			(ACL_PRIV_NONE|ACL_PRIV_LEVEL)
#define ACL_LVL_AUTH			(ACL_PRIV_AUTH|ACL_LVL_NONE)
#define ACL_LVL_COMPARE			(ACL_PRIV_COMPARE|ACL_LVL_AUTH)
#define ACL_LVL_SEARCH			(ACL_PRIV_SEARCH|ACL_LVL_COMPARE)
#define ACL_LVL_READ			(ACL_PRIV_READ|ACL_LVL_SEARCH)
#define ACL_LVL_WRITE			(ACL_PRIV_WRITE|ACL_LVL_READ)

#define ACL_LVL(m,l)			(((m)&ACL_PRIV_MASK) == ((l)&ACL_PRIV_MASK))
#define ACL_LVL_IS_NONE(m)		ACL_LVL((m),ACL_LVL_NONE)
#define ACL_LVL_IS_AUTH(m)		ACL_LVL((m),ACL_LVL_AUTH)
#define ACL_LVL_IS_COMPARE(m)	ACL_LVL((m),ACL_LVL_COMPARE)
#define ACL_LVL_IS_SEARCH(m)	ACL_LVL((m),ACL_LVL_SEARCH)
#define ACL_LVL_IS_READ(m)		ACL_LVL((m),ACL_LVL_READ)
#define ACL_LVL_IS_WRITE(m)		ACL_LVL((m),ACL_LVL_WRITE)

#define ACL_LVL_ASSIGN_NONE(m)		ACL_PRIV_ASSIGN((m),ACL_LVL_NONE)
#define ACL_LVL_ASSIGN_AUTH(m)		ACL_PRIV_ASSIGN((m),ACL_LVL_AUTH)
#define ACL_LVL_ASSIGN_COMPARE(m)	ACL_PRIV_ASSIGN((m),ACL_LVL_COMPARE)
#define ACL_LVL_ASSIGN_SEARCH(m)	ACL_PRIV_ASSIGN((m),ACL_LVL_SEARCH)
#define ACL_LVL_ASSIGN_READ(m)		ACL_PRIV_ASSIGN((m),ACL_LVL_READ)
#define ACL_LVL_ASSIGN_WRITE(m)		ACL_PRIV_ASSIGN((m),ACL_LVL_WRITE)
710

711
	slap_access_mask_t	a_mask;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
712

Kurt Zeilenga's avatar
Kurt Zeilenga committed
713
	char		*a_dn_pat;
714
#ifdef SLAPD_SCHEMA_NOT_COMPAT
715
	AttributeDescription	*a_dn_at;
716
717
#else
	char		*a_dn_at;
718
#endif
719
	int			a_dn_self;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
720
721
722
723
724

	char		*a_peername_pat;
	char		*a_sockname_pat;

	char		*a_domain_pat;
725
	char		*a_sockurl_pat;
726

727
#ifdef SLAPD_ACI_ENABLED
728
#ifdef SLAPD_SCHEMA_NOT_COMPAT
729
	AttributeDescription	*a_aci_at;
730
731
#else
	char		*a_aci_at;
732
#endif
733
734
#endif

735
	/* ACL Groups */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
736
	char		*a_group_pat;
737
	char		*a_group_oc;
738
#ifdef SLAPD_SCHEMA_NOT_COMPAT
739
	AttributeDescription	*a_group_at;
740
741
#else
	char		*a_group_at;
742
#endif
743

Kurt Zeilenga's avatar
Kurt Zeilenga committed
744
745
	struct slap_access	*a_next;
} Access;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
746
747

/* the "to" part */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
748
typedef struct slap_acl {
Kurt Zeilenga's avatar
Kurt Zeilenga committed
749
750
	/* "to" part: the entries this acl applies to */
	Filter		*acl_filter;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
751
752
	regex_t		acl_dn_re;
	char		*acl_dn_pat;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
753
754
755
	char		**acl_attrs;

	/* "by" part: list of who has what access to the entries */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
756
	Access	*acl_access;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
757

Kurt Zeilenga's avatar
Kurt Zeilenga committed
758
759
	struct slap_acl	*acl_next;
} AccessControl;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
760

Kurt Zeilenga's avatar
Kurt Zeilenga committed
761
/*
762
 * replog moddn param structure
Kurt Zeilenga's avatar
Kurt Zeilenga committed
763
 */
764
765
766
767
768
769
struct replog_moddn {
	char *newrdn;
	int	deloldrdn;
	char *newsup;
};

Kurt Zeilenga's avatar
Kurt Zeilenga committed
770
/*
771
772
 * Backend-info
 * represents a backend 
Kurt Zeilenga's avatar
Kurt Zeilenga committed
773
774
 */

Kurt Zeilenga's avatar
Kurt Zeilenga committed
775
776
typedef struct slap_backend_info BackendInfo;	/* per backend type */
typedef struct slap_backend_db BackendDB;		/* per backend database */
777

Howard Chu's avatar
Howard Chu committed
778
779
780
781
LIBSLAPD_F (int) nBackendInfo;
LIBSLAPD_F (int) nBackendDB;
LIBSLAPD_F (BackendInfo	*) backendInfo;
LIBSLAPD_F (BackendDB *) backendDB;
782

Howard Chu's avatar
Howard Chu committed
783
LIBSLAPD_F (int) slapMode;	
784
785
786
787
788
789
#define SLAP_UNDEFINED_MODE	0x0000
#define SLAP_SERVER_MODE	0x0001
#define SLAP_TOOL_MODE		0x0002
#define SLAP_MODE			0x0003

#define SLAP_TRUNCATE_MODE	0x0100
790
#ifdef SLAPD_BDB2
791
#define SLAP_TIMED_MODE		0x1000
792
#endif
793
794
795
796
797
798

/* temporary aliases */
typedef BackendDB Backend;
#define nbackends nBackendDB
#define backends backendDB

Kurt Zeilenga's avatar
Kurt Zeilenga committed
799
struct slap_backend_db {
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
	BackendInfo	*bd_info;	/* pointer to shared backend info */

	/* BackendInfo accessors */
#define		be_config	bd_info->bi_db_config
#define		be_type		bd_info->bi_type

#define		be_bind		bd_info->bi_op_bind
#define		be_unbind	bd_info->bi_op_unbind
#define		be_add		bd_info->bi_op_add
#define		be_compare	bd_info->bi_op_compare
#define		be_delete	bd_info->bi_op_delete
#define		be_modify	bd_info->bi_op_modify
#define		be_modrdn	bd_info->bi_op_modrdn
#define		be_search	bd_info->bi_op_search

815
816
#define		be_extended	bd_info->bi_extended

817
#define		be_release	bd_info->bi_entry_release_rw
818
819
#define		be_group	bd_info->bi_acl_group

820
821
#define		be_controls	bd_info->bi_controls

822
823
824
#define		be_connection_init	bd_info->bi_connection_init
#define		be_connection_destroy	bd_info->bi_connection_destroy

825
826
827
828
829
830
831
832
833
834
#ifdef SLAPD_TOOLS
#define		be_entry_open bd_info->bi_tool_entry_open
#define		be_entry_close bd_info->bi_tool_entry_close
#define		be_entry_first bd_info->bi_tool_entry_first
#define		be_entry_next bd_info->bi_tool_entry_next
#define		be_entry_get bd_info->bi_tool_entry_get
#define		be_entry_put bd_info->bi_tool_entry_put
#define		be_index_attr bd_info->bi_tool_index_attr
#define		be_index_change bd_info->bi_tool_index_change
#define		be_sync bd_info->bi_tool_sync
835
836
837
838
839
840
#endif

#ifdef HAVE_CYRUS_SASL
#define		be_sasl_authorize bd_info->bi_sasl_authorize
#define		be_sasl_getsecret bd_info->bi_sasl_getsecret
#define		be_sasl_putsecret bd_info->bi_sasl_putsecret
841
#endif
842

843
	/* these should be renamed from be_ to bd_ */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
844
	char	**be_suffix;	/* the DN suffixes of data in this backend */
845
	char	**be_nsuffix;	/* the normalized DN suffixes in this backend */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
846
	char	**be_suffixAlias; /* pairs of DN suffix aliases and deref values */
847
848
	char	*be_root_dn;	/* the magic "root" dn for this db 	*/
	char	*be_root_ndn;	/* the magic "root" normalized dn for this db	*/
849
	struct berval be_root_pw;	/* the magic "root" password for this db	*/
Kurt Zeilenga's avatar
Kurt Zeilenga committed
850
	int	be_readonly;	/* 1 => db is in "read only" mode	   */
851
	unsigned int be_max_deref_depth;       /* limit for depth of an alias deref  */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
852
853
	int	be_sizelimit;	/* size limit for this backend   	   */
	int	be_timelimit;	/* time limit for this backend       	   */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
854
	AccessControl *be_acl;	/* access control list for this backend	   */
855
	slap_access_t	be_dfltaccess;	/* access given if no acl matches	   */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
856
857
	char	**be_replica;	/* replicas of this backend (in master)	   */
	char	*be_replogfile;	/* replication log file (in master)	   */
858
	char	*be_update_ndn;	/* allowed to make changes (in replicas) */
859
	struct berval **be_update_refs;	/* where to refer modifying clients to */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
860
861
	int	be_lastmod;	/* keep track of lastmodified{by,time}	   */

862
863
	char	*be_realm;

864
	void	*be_private;	/* anything the backend database needs 	   */
865
866
};

867
868
869
struct slap_conn;
struct slap_op;

870
871
872
873
typedef int (*SLAP_EXTENDED_FN) LDAP_P((
    Backend		*be,
    struct slap_conn		*conn,
    struct slap_op		*op,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
874
	const char		*reqoid,
875
    struct berval * reqdata,
876
	char		**rspoid,
877
    struct berval ** rspdata,
878
	LDAPControl *** rspctrls,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
879
	const char **	text,
880
	struct berval *** refs ));
881

Kurt Zeilenga's avatar
Kurt Zeilenga committed
882
struct slap_backend_info {
883
	char	*bi_type;	/* type of backend */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
884

885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
	/*
	 * per backend type routines:
	 * bi_init: called to allocate a backend_info structure,
	 *		called once BEFORE configuration file is read.
	 *		bi_init() initializes this structure hence is
	 *		called directly from be_initialize()
	 * bi_config: called per 'backend' specific option
	 *		all such options must before any 'database' options
	 *		bi_config() is called only from read_config()
	 * bi_open: called to open each database, called
	 *		once AFTER configuration file is read but
	 *		BEFORE any bi_db_open() calls.
	 *		bi_open() is called from backend_startup()
	 * bi_close: called to close each database, called
	 *		once during shutdown after all bi_db_close calls.
	 *		bi_close() is called from backend_shutdown()
	 * bi_destroy: called to destroy each database, called
	 *		once during shutdown after all bi_db_destroy calls.
	 *		bi_destory() is called from backend_destroy()
	 */
	int (*bi_init)	LDAP_P((BackendInfo *bi));
	int	(*bi_config) LDAP_P((BackendInfo *bi,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
907
		const char *fname, int lineno, int argc, char **argv ));
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
	int (*bi_open) LDAP_P((BackendInfo *bi));
	int (*bi_close) LDAP_P((BackendInfo *bi));
	int (*bi_destroy) LDAP_P((BackendInfo *bi));

	/*
	 * per database routines:
	 * bi_db_init: called to initialize each database,
	 *	called upon reading 'database <type>' 
	 *	called only from backend_db_init()
	 * bi_db_config: called to configure each database,
	 *  called per database to handle per database options
	 *	called only from read_config()
	 * bi_db_open: called to open each database
	 *	called once per database immediately AFTER bi_open()
	 *	calls but before daemon startup.
	 *  called only by backend_startup()
	 * bi_db_close: called to close each database
	 *	called once per database during shutdown but BEFORE
	 *  any bi_close call.
	 *  called only by backend_shutdown()
	 * bi_db_destroy: called to destroy each database
	 *  called once per database during shutdown AFTER all
	 *  bi_close calls but before bi_destory calls.
	 *  called only by backend_destory()
	 */
	int (*bi_db_init) LDAP_P((Backend *bd));
	int	(*bi_db_config) LDAP_P((Backend *bd,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
935
		const char *fname, int lineno, int argc, char **argv ));
936
937
938
939
940
941
	int (*bi_db_open) LDAP_P((Backend *bd));
	int (*bi_db_close) LDAP_P((Backend *bd));
	int (*bi_db_destroy) LDAP_P((Backend *db));

	/* LDAP Operations Handling Routines */
	int	(*bi_op_bind)  LDAP_P(( BackendDB *bd,
942
		struct slap_conn *c, struct slap_op *o,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
943
		const char *dn, const char *ndn, int method,
944
		struct berval *cred, char** edn ));
945
	int (*bi_op_unbind) LDAP_P((BackendDB *bd,
946
		struct slap_conn *c, struct slap_op *o ));
947
	int	(*bi_op_search) LDAP_P((BackendDB *bd,
948
		struct slap_conn *c, struct slap_op *o,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
949
950
		const char *base, const char *nbase,
		int scope, int deref,
951
		int slimit, int tlimit,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
952
953
		Filter *f, const char *filterstr,
		char **attrs, int attrsonly));
954
955
956
#ifdef SLAPD_SCHEMA_NOT_COMPAT
	int	(*bi_op_compare)LDAP_P((BackendDB *bd,
		struct slap_conn *c, struct slap_op *o,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
957
958
		const char *dn, const char *ndn,
		AttributeAssertion *ava));
959
#else
960
	int	(*bi_op_compare)LDAP_P((BackendDB *bd,
961
		struct slap_conn *c, struct slap_op *o,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
962
963
		const char *dn, const char *ndn,
		Ava *ava));
964
#endif
965
	int	(*bi_op_modify) LDAP_P((BackendDB *bd,
966
		struct slap_conn *c, struct slap_op *o,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
967
		const char *dn, const char *ndn, Modifications *m));
968
	int	(*bi_op_modrdn) LDAP_P((BackendDB *bd,
969
		struct slap_conn *c, struct slap_op *o,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
970
971
972
		const char *dn, const char *ndn,
		const char *newrdn, int deleteoldrdn,
		const char *newSuperior));
973
	int	(*bi_op_add)    LDAP_P((BackendDB *bd,
974
975
		struct slap_conn *c, struct slap_op *o,
		Entry *e));
976
	int	(*bi_op_delete) LDAP_P((BackendDB *bd,
977
		struct slap_conn *c, struct slap_op *o,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
978
		const char *dn, const char *ndn));
979
	int	(*bi_op_abandon) LDAP_P((BackendDB *bd,
980
		struct slap_conn *c, struct slap_op *o,
981
		ber_int_t msgid));
982

983
984
985
	/* Extended Operations Helper */
	SLAP_EXTENDED_FN bi_extended;

986
	/* Auxilary Functions */
987
	int	(*bi_entry_release_rw) LDAP_P((BackendDB *bd, Entry *e, int rw));
988

989
#ifdef SLAPD_SCHEMA_NOT_COMPAT
990
	int	(*bi_acl_group)  LDAP_P((Backend *bd,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
991
		Entry *e, const char *bdn, const char *edn,
992
		const char *objectclassValue,
993
		AttributeDescription *group_at ));
994
995
996
997
998
999
#else
	int	(*bi_acl_group)  LDAP_P((Backend *bd,
		Entry *e, const char *bdn, const char *edn,
		const char *objectclassValue,
		const char *group_at ));
#endif
1000

For faster browsing, not all history is shown. View entire blame