slap.h 31.5 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

Hallvard Furuseth's avatar
Hallvard Furuseth committed
43
44
45
#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
46

47
48
#define SERVICE_NAME  OPENLDAP_PACKAGE "-slapd"

Juan Gomez's avatar
Juan Gomez committed
49
50
51
52
53
54
55
/* 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)
 */
56
#define SLAP_MOD_SOFTADD	0x1000
Juan Gomez's avatar
Juan Gomez committed
57

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

62
63
#define MAXREMATCHES 10

64
65
66
67
68
69
/* psuedo error code indicating disconnect */
#define SLAPD_DISCONNECT -1

/* psuedo error code indicating abandoned operation */
#define SLAPD_ABANDON -2

70

71
72
/* We assume "C" locale, that is US-ASCII */
#define ASCII_SPACE(c)	( (c) == ' ' )
73
74
75
76
77
78
#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) )

79
80
81
82
83
84
85
86
#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) == '.' )
87

88
89
#define ATTR_LEADCHAR(c)	( DESC_LEADCHAR(c) || OID_LEADCHAR(c) )
#define ATTR_CHAR(c)	( DESC_CHAR((c)) || (c) == '.' )
90

91
92
#define AD_LEADCHAR(c)	( ATTR_CHAR(c) )
#define AD_CHAR(c)		( ATTR_CHAR(c) || (c) == ';' )
93

94
95
#define SLAPD_ACI_DEFAULT_ATTR		"aci"

96
97
/* schema needed by slapd */
#define SLAPD_OID_DN_SYNTAX "1.3.6.1.4.1.1466.115.121.1.12"
98
#define SLAPD_OID_ACI_SYNTAX "1.3.6.1.4.1.4203.666.2.1" /* experimental */
99

100
101
LIBSLAPD_F (int) slap_debug;

102
103
104
105
106
107
108
/*
 * Index types
 */
#define SLAP_INDEX_PRESENCE      0x0001U
#define SLAP_INDEX_EQUALITY      0x0002U
#define SLAP_INDEX_APPROX        0x0004U
#define SLAP_INDEX_SUB           0x0008U
109
110
#define SLAP_INDEX_EXTENDED		 0x0010U
#define SLAP_INDEX_UNDEFINED     0x1000U
111
112
#define SLAP_INDEX_FROMINIT      0x8000U	/* psuedo type */

113
114
115
/*
 * represents schema information for a database
 */
Julio Sánchez Fernández's avatar
   
Julio Sánchez Fernández committed
116
117
118
119
120
#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
121
122
123
124
125
126
#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
127
#define SLAP_SCHERR_MR_INCOMPLETE	12
Julio Sánchez Fernández's avatar
   
Julio Sánchez Fernández committed
128

129
typedef struct slap_oid_macro {
130
	struct berval som_oid;
131
	char **som_names;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
132
	struct slap_oid_macro *som_next;
133
134
} OidMacro;

Kurt Zeilenga's avatar
Kurt Zeilenga committed
135
136
137
138
/* forward declarations */
struct slap_syntax;
struct slap_matching_rule;

139
typedef int slap_syntax_validate_func LDAP_P((
Kurt Zeilenga's avatar
Kurt Zeilenga committed
140
	struct slap_syntax *syntax,
141
142
	struct berval * in));

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

typedef struct slap_syntax {
	LDAP_SYNTAX			ssyn_syn;
150
	unsigned	ssyn_flags;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
151

152
153
#define SLAP_SYNTAX_NONE	0x0U
#define SLAP_SYNTAX_BINARY	0x1U
154

155
	slap_syntax_validate_func	*ssyn_validate;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
156
157
158
159
160

	/* convert to and from binary */
	slap_syntax_transform_func	*ssyn_ber2str;
	slap_syntax_transform_func	*ssyn_str2ber;

161
162
163
164
165
	struct slap_syntax		*ssyn_next;
#define ssyn_oid			ssyn_syn.syn_oid
#define ssyn_desc			ssyn_syn.syn_desc
} Syntax;

166
167
168
169
/* 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
170
171
172

/* Normalizer */
typedef int slap_mr_normalize_func LDAP_P((
173
	unsigned use,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
174
175
176
177
178
179
	struct slap_syntax *syntax, /* NULL if in is asserted value */
	struct slap_matching_rule *mr,
	struct berval * in,
	struct berval ** out ));

/* Match (compare) function */
180
typedef int slap_mr_match_func LDAP_P((
181
	unsigned use,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
182
183
184
	struct slap_syntax *syntax,	/* syntax of stored value */
	struct slap_matching_rule *mr,
	struct berval * value,
185
	void * assertValue ));
186

187
188
/* Index generation function */
typedef int slap_mr_indexer_func LDAP_P((
189
	unsigned use,
190
191
192
193
194
195
	struct slap_syntax *syntax,	/* syntax of stored value */
	struct slap_matching_rule *mr,
	struct berval **values,
	struct berval **keys ));

struct slap_filter; 	/* forward declaration */
196

197
198
/* Filter index function */
typedef int slap_mr_filter_func LDAP_P((
199
	unsigned use,
200
201
202
203
204
	struct slap_syntax *syntax,	/* syntax of stored value */
	struct slap_matching_rule *mr,
	struct slap_filter *filter,
	struct berval **keys ));

205
206
typedef struct slap_matching_rule {
	LDAP_MATCHING_RULE		smr_mrule;
207
208
209
210
211
212
213
	unsigned				smr_usage;
#define SLAP_MR_NONE		0x00U
#define SLAP_MR_EQUALITY	0x01U
#define SLAP_MR_APPROX		0x02U
#define SLAP_MR_ORDERING	0x04U
#define SLAP_MR_SUBSTR		0x08U
#define SLAP_MR_EXT			0x10U
214
	Syntax					*smr_syntax;
215
	slap_mr_convert_func	*smr_convert;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
216
	slap_mr_normalize_func	*smr_normalize;
217
	slap_mr_match_func		*smr_match;
218
219
	slap_mr_indexer_func	*smr_indexer;
	slap_mr_filter_func		*smr_filter;
220
221
222
223
	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
224
225
#define smr_obsolete		smr_mrule.mr_obsolete
#define smr_syntax_oid		smr_mrule.mr_syntax_oid
226
227
228
} MatchingRule;

typedef struct slap_attribute_type {
229
230
231
#ifdef SLAPD_SCHEMA_NOT_COMPAT
	char					*sat_cname;
#endif
232
233
234
235
236
237
238
	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;
239
#ifndef SLAPD_SCHEMA_NOT_COMPAT
240
241
	/* The next one is created to help in the transition */
	int				sat_syntax_compat;
242
#endif
243
244
245
246
247
248
249
250
251
252
253
254
	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
255
#define sat_no_user_mod		sat_atype.at_no_user_mod
256
257
258
#define sat_usage		sat_atype.at_usage
} AttributeType;

259
260
261
262
263
#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)

264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
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
} ObjectClass;
279

280

281
282
283
284
285
286
287
288
289
290
291
292
293
294
#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;

typedef struct slap_attr_assertion {
295
	AttributeDescription	*aa_desc;
296
297
298
	struct berval *aa_value;
} AttributeAssertion;

299
300
301
302
303
304
305
typedef struct slap_ss_assertion {
	AttributeDescription	*sa_desc;
	struct berval			*sa_initial;
	struct berval			**sa_any;
	struct berval			*sa_final;
} SubstringAssertion;

306
307
308
309
310
311
typedef struct slap_mr_assertion {
	char					*ma_rule;	/* optional */
	AttributeDescription	*ma_desc;	/* optional */
	int						ma_dnattrs; /* boolean */
	struct berval			*ma_value;	/* required */
} MatchingRuleAssertion;
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332

#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;

333
334
#endif

Kurt Zeilenga's avatar
Kurt Zeilenga committed
335
336
337
/*
 * represents a search filter
 */
338

Kurt Zeilenga's avatar
Kurt Zeilenga committed
339
typedef struct slap_filter {
340
341
	ber_tag_t	f_choice;	/* values taken from ldap.h, plus: */
#define SLAPD_FILTER_COMPUTED ((ber_tag_t) 0x01U)
Kurt Zeilenga's avatar
Kurt Zeilenga committed
342

Kurt Zeilenga's avatar
Kurt Zeilenga committed
343
	union f_un_u {
344
345
346
		/* precomputed result */
		ber_int_t f_un_result;

347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
#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
379
380
381
382
383
384
		/* present */
		char		*f_un_type;

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

385
386
387
		/* extensible */
		Mra		f_un_fra;	

Kurt Zeilenga's avatar
Kurt Zeilenga committed
388
389
390
		/* substrings */
		struct sub {
			char	*f_un_sub_type;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
391
392
393
394

			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
395
		} f_un_sub;
396
397

#define f_dn		f_un.f_un_type  /* used for DN indices */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
398
399
400
401
#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
402
403
404
405
#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
406
407
408
409
410
#define f_sub		f_un.f_un_sub
#define f_sub_type	f_un.f_un_sub.f_un_sub_type
#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
411
#endif
412
413
414

		/* and, or, not */
		struct slap_filter *f_un_complex;
415
416
	} f_un;

417
#define f_result	f_un.f_un_result
418
419
420
421
#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
422

Kurt Zeilenga's avatar
Kurt Zeilenga committed
423
	struct slap_filter	*f_next;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
424
425
} Filter;

426
427
428
/* compare routines can return undefined */
#define SLAPD_COMPARE_UNDEFINED	((ber_tag_t) -1)

Kurt Zeilenga's avatar
Kurt Zeilenga committed
429
/*
430
 * represents an attribute (description + values)
Kurt Zeilenga's avatar
Kurt Zeilenga committed
431
 */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
432
typedef struct slap_attr {
433
#ifdef SLAPD_SCHEMA_NOT_COMPAT
434
	AttributeDescription *a_desc;
435
#else
436
	char		*a_type;	/* description */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
437
	int		a_syntax;
438
#endif
439
	struct berval	**a_vals;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
440
	struct slap_attr	*a_next;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
441
442
} Attribute;

443
#ifndef SLAPD_SCHEMA_NOT_COMPAT
Kurt Zeilenga's avatar
Kurt Zeilenga committed
444
445
446
447
448
449
450
451
452
/*
 * 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				*/
453
#endif
Kurt Zeilenga's avatar
Kurt Zeilenga committed
454
455
456
457
458

/*
 * the id used in the indexes to refer to an entry
 */
typedef unsigned long	ID;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
459
#define NOID	((ID)~0)
Kurt Zeilenga's avatar
Kurt Zeilenga committed
460
461
462
463

/*
 * represents an entry in core
 */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
464
typedef struct slap_entry {
465
466
467
468
469
	/*
	 * The ID field should only be changed before entry is
	 * inserted into a cache.  The ID value is backend
	 * specific.
	 */
470
	ID		e_id;
471

472
473
474
	char		*e_dn;		/* DN of this entry */
	char		*e_ndn;		/* normalized DN of this entry */
	Attribute	*e_attrs;	/* list of attributes + values */
475

476
477
	/* for use by the backend for any purpose */
	void*	e_private;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
478
479
} Entry;

480
481
482
483
484
485
/*
 * A list of LDAPMods
 */
#ifdef SLAPD_SCHEMA_NOT_COMPAT
typedef struct slap_mod {
	int sm_op;
486
	AttributeDescription *sm_desc;
487
488
489
490
	struct berval **sm_bvalues;
} Modification;
#else
#define Modification LDAPMod
491
492
493
#define sm_op mod_op
#define sm_desc	mod_type
#define sm_bvalues mod_bvalues
494
495
496
#endif

typedef struct slap_mod_list {
497
498
499
500
	Modification sml_mod;
#define sml_op		sml_mod.sm_op
#define sml_desc	sml_mod.sm_desc
#define sml_bvalues	sml_mod.sm_bvalues
501
#ifndef SLAPD_SCHEMA_NOT_COMPAT
502
#define sml_type	sml_mod.sm_desc
503
504
505
506
507
508
509
510
#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;
511
512
513
514
#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
515
516
517
518
519
520
521
522
523
} 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
524
525
#endif

Kurt Zeilenga's avatar
Kurt Zeilenga committed
526
527
528
529
/*
 * represents an access control list
 */

530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
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
549
/* the "by" part */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
550
typedef struct slap_access {
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
	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)
609

610
	slap_access_mask_t	a_mask;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
611

Kurt Zeilenga's avatar
Kurt Zeilenga committed
612
	char		*a_dn_pat;
613
#ifdef SLAPD_SCHEMA_NOT_COMPAT
614
	AttributeDescription	*a_dn_at;
615
616
#else
	char		*a_dn_at;
617
#endif
618
	int			a_dn_self;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
619
620
621
622
623

	char		*a_peername_pat;
	char		*a_sockname_pat;

	char		*a_domain_pat;
624
	char		*a_sockurl_pat;
625

626
#ifdef SLAPD_ACI_ENABLED
627
#ifdef SLAPD_SCHEMA_NOT_COMPAT
628
	AttributeDescription	*a_aci_at;
629
630
#else
	char		*a_aci_at;
631
#endif
632
633
#endif

634
	/* ACL Groups */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
635
	char		*a_group_pat;
636
	char		*a_group_oc;
637
#ifdef SLAPD_SCHEMA_NOT_COMPAT
638
	AttributeDescription	*a_group_at;
639
640
#else
	char		*a_group_at;
641
#endif
642

Kurt Zeilenga's avatar
Kurt Zeilenga committed
643
644
	struct slap_access	*a_next;
} Access;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
645
646

/* the "to" part */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
647
typedef struct slap_acl {
Kurt Zeilenga's avatar
Kurt Zeilenga committed
648
649
	/* "to" part: the entries this acl applies to */
	Filter		*acl_filter;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
650
651
	regex_t		acl_dn_re;
	char		*acl_dn_pat;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
652
653
654
	char		**acl_attrs;

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

Kurt Zeilenga's avatar
Kurt Zeilenga committed
657
658
	struct slap_acl	*acl_next;
} AccessControl;
Kurt Zeilenga's avatar
Kurt Zeilenga committed
659

Kurt Zeilenga's avatar
Kurt Zeilenga committed
660
/*
661
 * replog moddn param structure
Kurt Zeilenga's avatar
Kurt Zeilenga committed
662
 */
663
664
665
666
667
668
struct replog_moddn {
	char *newrdn;
	int	deloldrdn;
	char *newsup;
};

Kurt Zeilenga's avatar
Kurt Zeilenga committed
669
/*
670
671
 * Backend-info
 * represents a backend 
Kurt Zeilenga's avatar
Kurt Zeilenga committed
672
673
 */

Kurt Zeilenga's avatar
Kurt Zeilenga committed
674
675
typedef struct slap_backend_info BackendInfo;	/* per backend type */
typedef struct slap_backend_db BackendDB;		/* per backend database */
676

Howard Chu's avatar
Howard Chu committed
677
678
679
680
LIBSLAPD_F (int) nBackendInfo;
LIBSLAPD_F (int) nBackendDB;
LIBSLAPD_F (BackendInfo	*) backendInfo;
LIBSLAPD_F (BackendDB *) backendDB;
681

Howard Chu's avatar
Howard Chu committed
682
LIBSLAPD_F (int) slapMode;	
683
684
685
686
687
688
#define SLAP_UNDEFINED_MODE	0x0000
#define SLAP_SERVER_MODE	0x0001
#define SLAP_TOOL_MODE		0x0002
#define SLAP_MODE			0x0003

#define SLAP_TRUNCATE_MODE	0x0100
689
#ifdef SLAPD_BDB2
690
#define SLAP_TIMED_MODE		0x1000
691
#endif
692
#define SLAP_TOOLID_MODE    4
693
694
695
696
697
698

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

Kurt Zeilenga's avatar
Kurt Zeilenga committed
699
struct slap_backend_db {
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
	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

715
716
#define		be_extended	bd_info->bi_extended

717
#define		be_release	bd_info->bi_entry_release_rw
718
719
#define		be_group	bd_info->bi_acl_group

720
721
#define		be_controls	bd_info->bi_controls

722
723
724
#define		be_connection_init	bd_info->bi_connection_init
#define		be_connection_destroy	bd_info->bi_connection_destroy

725
726
727
728
729
730
731
732
733
734
#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
735
736
737
738
739
740
#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
741
#endif
742

743
	/* these should be renamed from be_ to bd_ */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
744
	char	**be_suffix;	/* the DN suffixes of data in this backend */
745
	char	**be_nsuffix;	/* the normalized DN suffixes in this backend */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
746
	char	**be_suffixAlias; /* pairs of DN suffix aliases and deref values */
747
748
	char	*be_root_dn;	/* the magic "root" dn for this db 	*/
	char	*be_root_ndn;	/* the magic "root" normalized dn for this db	*/
749
	struct berval be_root_pw;	/* the magic "root" password for this db	*/
Kurt Zeilenga's avatar
Kurt Zeilenga committed
750
	int	be_readonly;	/* 1 => db is in "read only" mode	   */
751
	unsigned int be_max_deref_depth;       /* limit for depth of an alias deref  */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
752
753
	int	be_sizelimit;	/* size limit for this backend   	   */
	int	be_timelimit;	/* time limit for this backend       	   */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
754
	AccessControl *be_acl;	/* access control list for this backend	   */
755
	slap_access_t	be_dfltaccess;	/* access given if no acl matches	   */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
756
757
	char	**be_replica;	/* replicas of this backend (in master)	   */
	char	*be_replogfile;	/* replication log file (in master)	   */
758
	char	*be_update_ndn;	/* allowed to make changes (in replicas) */
759
	struct berval **be_update_refs;	/* where to refer modifying clients to */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
760
761
	int	be_lastmod;	/* keep track of lastmodified{by,time}	   */

762
763
	char	*be_realm;

764
	void	*be_private;	/* anything the backend database needs 	   */
765
766
};

767
768
769
struct slap_conn;
struct slap_op;

770
771
772
773
typedef int (*SLAP_EXTENDED_FN) LDAP_P((
    Backend		*be,
    struct slap_conn		*conn,
    struct slap_op		*op,
774
	char		*reqoid,
775
    struct berval * reqdata,
776
	char		**rspoid,
777
    struct berval ** rspdata,
778
779
780
	LDAPControl *** rspctrls,
	char **	text,
	struct berval *** refs ));
781

Kurt Zeilenga's avatar
Kurt Zeilenga committed
782
struct slap_backend_info {
783
	char	*bi_type;	/* type of backend */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
784

785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
	/*
	 * 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
807
		const char *fname, int lineno, int argc, char **argv ));
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
	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
835
		const char *fname, int lineno, int argc, char **argv ));
836
837
838
839
840
841
	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,
842
		struct slap_conn *c, struct slap_op *o,
843
		char *dn, char *ndn, int method, char* mechanism,
844
		struct berval *cred, char** edn ));
845
	int (*bi_op_unbind) LDAP_P((BackendDB *bd,
846
		struct slap_conn *c, struct slap_op *o ));
847
	int	(*bi_op_search) LDAP_P((BackendDB *bd,
848
		struct slap_conn *c, struct slap_op *o,
849
		char *base, char *nbase, int scope, int deref,
850
851
852
		int slimit, int tlimit,
		Filter *f, char *filterstr, char **attrs,
		int attrsonly));
853
854
855
856
857
#ifdef SLAPD_SCHEMA_NOT_COMPAT
	int	(*bi_op_compare)LDAP_P((BackendDB *bd,
		struct slap_conn *c, struct slap_op *o,
		char *dn, char *ndn, AttributeAssertion *ava));
#else
858
	int	(*bi_op_compare)LDAP_P((BackendDB *bd,
859
		struct slap_conn *c, struct slap_op *o,
860
		char *dn, char *ndn, Ava *ava));
861
#endif
862
	int	(*bi_op_modify) LDAP_P((BackendDB *bd,
863
		struct slap_conn *c, struct slap_op *o,
864
		char *dn, char *ndn, Modifications *m));
865
	int	(*bi_op_modrdn) LDAP_P((BackendDB *bd,
866
		struct slap_conn *c, struct slap_op *o,
867
		char *dn, char *ndn, char *newrdn, int deleteoldrdn,
868
		char *newSuperior));
869
	int	(*bi_op_add)    LDAP_P((BackendDB *bd,
870
871
		struct slap_conn *c, struct slap_op *o,
		Entry *e));
872
	int	(*bi_op_delete) LDAP_P((BackendDB *bd,
873
		struct slap_conn *c, struct slap_op *o,
874
		char *dn, char *ndn));
875
	int	(*bi_op_abandon) LDAP_P((BackendDB *bd,
876
		struct slap_conn *c, struct slap_op *o,
877
		ber_int_t msgid));
878

879
880
881
	/* Extended Operations Helper */
	SLAP_EXTENDED_FN bi_extended;

882
	/* Auxilary Functions */
883
	int	(*bi_entry_release_rw) LDAP_P((BackendDB *bd, Entry *e, int rw));
884

885
#ifdef SLAPD_SCHEMA_NOT_COMPAT
886
	int	(*bi_acl_group)  LDAP_P((Backend *bd,
Kurt Zeilenga's avatar
Kurt Zeilenga committed
887
		Entry *e, const char *bdn, const char *edn,
888
		const char *objectclassValue,
889
		AttributeDescription *group_at ));
890
891
892
893
894
895
#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
896

897
898
899
900
901
	int	(*bi_connection_init) LDAP_P((BackendDB *bd,
		struct slap_conn *c));
	int	(*bi_connection_destroy) LDAP_P((BackendDB *bd,
		struct slap_conn *c));

902
903
904
905
906
907
908
	/* hooks for slap tools */
	int (*bi_tool_entry_open) LDAP_P(( BackendDB *be, int mode ));
	int (*bi_tool_entry_close) LDAP_P(( BackendDB *be ));
	ID (*bi_tool_entry_first) LDAP_P(( BackendDB *be ));
	ID (*bi_tool_entry_next) LDAP_P(( BackendDB *be ));
	Entry* (*bi_tool_entry_get) LDAP_P(( BackendDB *be, ID id ));
	ID (*bi_tool_entry_put) LDAP_P(( BackendDB *be, Entry *e ));
909
910
911
912
913
#ifdef SLAPD_SCHEMA_NOT_COMPAT
	int (*bi_tool_index_attr) LDAP_P(( BackendDB *be,
		AttributeDescription *desc ));
	int (*bi_tool_index_change) LDAP_P(( BackendDB *be,
		AttributeDescription *desc,
914
		struct berval **bv, ID id, int op ));
915
916
917
918
919
920
#else
	int (*bi_tool_index_attr) LDAP_P(( BackendDB *be,
		char* type ));
	int (*bi_tool_index_change) LDAP_P(( BackendDB *be,
		char* type,	struct berval **bv, ID id, int op ));
#endif
921
922
	int (*bi_tool_sync) LDAP_P(( BackendDB *be ));

923
924
925
926
927
928
929
930
931
932
933
934
#ifdef HAVE_CYRUS_SASL
	int (*bi_sasl_authorize) LDAP_P(( BackendDB *be,
		const char *authnid, const char *authzid,
		const char **canon_authzid, const char **errstr ));
	int (*bi_sasl_getsecret) LDAP_P(( BackendDB *be,
		const char *mechanism, const char *authzid,
		const char *realm, sasl_secret_t **secret ));
	int (*bi_sasl_putsecret) LDAP_P(( BackendDB *be,
		const char *mechanism, const char *auth_identity,
		const char *realm, const sasl_secret_t *secret ));
#endif /* HAVE_CYRUS_SASL */

935
936
#define SLAP_INDEX_ADD_OP		0x0001
#define SLAP_INDEX_DELETE_OP	0x0002
937

938
939
	char **bi_controls;		/* supported controls */

940
	unsigned int bi_nDB;	/* number of databases of this type */
941
	void	*bi_private;	/* anything the backend type needs */
942
};
Kurt Zeilenga's avatar
Kurt Zeilenga committed
943
944
945
946
947

/*
 * represents an operation pending from an ldap client
 */

948
typedef struct slap_op {
949
950
	ber_int_t	o_opid;		/* id of this operation		  */
	ber_int_t	o_msgid;	/* msgid of the request		  */
951
952
953

	ldap_pvt_thread_t	o_tid;		/* thread handling this op	  */

Kurt Zeilenga's avatar
Kurt Zeilenga committed
954
	BerElement	*o_ber;		/* ber of the request		  */
955

956
	ber_tag_t	o_tag;		/* tag of the request		  */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
957
	time_t		o_time;		/* time op was initiated	  */
958

959
960
961
962
963
964
965
#ifdef SLAP_AUTHZID
	/* should only be used for reporting purposes */
	char	*o_authc_dn;	/* authentication DN */

	/* should be used as the DN of the User */
	char	*o_authz_dn;	/* authorization DN */
	char	*o_authz_ndn;	/* authorizaiton NDN */
966

967
#else
Kurt Zeilenga's avatar
Kurt Zeilenga committed
968
	char		*o_dn;		/* dn bound when op was initiated */
969
	char		*o_ndn;		/* normalized dn bound when op was initiated */
970
971
#endif

972
	ber_int_t	o_protocol;	/* version of the LDAP protocol used by client */
973
	ber_tag_t	o_authtype;	/* auth method used to bind dn	  */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
974
975
					/* values taken from ldap.h	  */
					/* LDAP_AUTH_*			  */
976
977
978
	char		*o_authmech; /* SASL mechanism used to bind dn */

	LDAPControl	**o_ctrls;	 /* controls */
979

980
	unsigned long	o_connid; /* id of conn initiating this op  */
981

Kurt Zeilenga's avatar
Kurt Zeilenga committed
982
#ifdef LDAP_CONNECTIONLESS
Kurt Zeilenga's avatar
Kurt Zeilenga committed
983
984
985
986
987
	int		o_cldap;	/* != 0 if this came in via CLDAP */
	struct sockaddr	o_clientaddr;	/* client address if via CLDAP	  */
	char		o_searchbase;	/* search base if via CLDAP	  */
#endif

988
989
990
991
	ldap_pvt_thread_mutex_t	o_abandonmutex; /* protects o_abandon  */
	int		o_abandon;	/* abandon flag */

	struct slap_op	*o_next;	/* next operation in list	  */
992
	void	*o_private;	/* anything the backend needs	  */
Kurt Zeilenga's avatar
Kurt Zeilenga committed
993
994
995
996
997
998
} Operation;

/*
 * represents a connection from an ldap client
 */

999
typedef struct slap_conn {
1000
	int			c_struct_state; /* structure management state */
For faster browsing, not all history is shown. View entire blame