xref: /netbsd/external/bsd/openldap/dist/include/ldap.h (revision cf1d77f7)
1 /*	$NetBSD: ldap.h,v 1.3 2021/08/14 16:14:55 christos Exp $	*/
2 
3 /* $OpenLDAP$ */
4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5  *
6  * Copyright 1998-2021 The OpenLDAP Foundation.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted only as authorized by the OpenLDAP
11  * Public License.
12  *
13  * A copy of this license is available in file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 /* Portions Copyright (c) 1990 Regents of the University of Michigan.
18  * All rights reserved.
19  *
20  * Redistribution and use in source and binary forms are permitted
21  * provided that this notice is preserved and that due credit is given
22  * to the University of Michigan at Ann Arbor. The name of the University
23  * may not be used to endorse or promote products derived from this
24  * software without specific prior written permission. This software
25  * is provided ``as is'' without express or implied warranty.
26  */
27 
28 #ifndef _LDAP_H
29 #define _LDAP_H
30 
31 /* pull in lber */
32 #include <lber.h>
33 
34 /* include version and API feature defines */
35 #include <ldap_features.h>
36 
37 LDAP_BEGIN_DECL
38 
39 #define LDAP_VERSION1	1
40 #define LDAP_VERSION2	2
41 #define LDAP_VERSION3	3
42 
43 #define LDAP_VERSION_MIN	LDAP_VERSION2
44 #define	LDAP_VERSION		LDAP_VERSION2
45 #define LDAP_VERSION_MAX	LDAP_VERSION3
46 
47 /*
48  * We use 3000+n here because it is above 1823 (for RFC 1823),
49  * above 2000+rev of IETF LDAPEXT draft (now quite dated),
50  * yet below allocations for new RFCs (just in case there is
51  * someday an RFC produced).
52  */
53 #define LDAP_API_VERSION	3001
54 #define LDAP_VENDOR_NAME	"OpenLDAP"
55 
56 /* OpenLDAP API Features */
57 #define LDAP_API_FEATURE_X_OPENLDAP LDAP_VENDOR_VERSION
58 
59 #if defined( LDAP_API_FEATURE_X_OPENLDAP_REENTRANT )
60 #	define	LDAP_API_FEATURE_THREAD_SAFE 		1
61 #endif
62 #if defined( LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE )
63 #	define  LDAP_API_FEATURE_SESSION_THREAD_SAFE	1
64 #	define  LDAP_API_FEATURE_OPERATION_THREAD_SAFE	1
65 #endif
66 
67 
68 #define LDAP_PORT		389		/* ldap:///		default LDAP port */
69 #define LDAPS_PORT		636		/* ldaps:///	default LDAP over TLS port */
70 
71 #define LDAP_ROOT_DSE				""
72 #define LDAP_NO_ATTRS				"1.1"
73 #define LDAP_ALL_USER_ATTRIBUTES	"*"
74 #define LDAP_ALL_OPERATIONAL_ATTRIBUTES	"+" /* RFC 3673 */
75 
76 /* RFC 4511:  maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -- */
77 #define LDAP_MAXINT (2147483647)
78 
79 /*
80  * LDAP_OPTions
81  *	0x0000 - 0x0fff reserved for api options
82  *	0x1000 - 0x3fff reserved for api extended options
83  *	0x4000 - 0x7fff reserved for private and experimental options
84  */
85 
86 #define LDAP_OPT_API_INFO			0x0000
87 #define LDAP_OPT_DESC				0x0001 /* historic */
88 #define LDAP_OPT_DEREF				0x0002
89 #define LDAP_OPT_SIZELIMIT			0x0003
90 #define LDAP_OPT_TIMELIMIT			0x0004
91 /* 0x05 - 0x07 not defined */
92 #define LDAP_OPT_REFERRALS			0x0008
93 #define LDAP_OPT_RESTART			0x0009
94 /* 0x0a - 0x10 not defined */
95 #define LDAP_OPT_PROTOCOL_VERSION		0x0011
96 #define LDAP_OPT_SERVER_CONTROLS		0x0012
97 #define LDAP_OPT_CLIENT_CONTROLS		0x0013
98 /* 0x14 not defined */
99 #define LDAP_OPT_API_FEATURE_INFO		0x0015
100 /* 0x16 - 0x2f not defined */
101 #define LDAP_OPT_HOST_NAME			0x0030
102 #define LDAP_OPT_RESULT_CODE			0x0031
103 #define LDAP_OPT_ERROR_NUMBER			LDAP_OPT_RESULT_CODE
104 #define LDAP_OPT_DIAGNOSTIC_MESSAGE		0x0032
105 #define LDAP_OPT_ERROR_STRING			LDAP_OPT_DIAGNOSTIC_MESSAGE
106 #define LDAP_OPT_MATCHED_DN			0x0033
107 /* 0x0034 - 0x3fff not defined */
108 /* 0x0091 used by Microsoft for LDAP_OPT_AUTO_RECONNECT */
109 #define LDAP_OPT_SSPI_FLAGS			0x0092
110 /* 0x0093 used by Microsoft for LDAP_OPT_SSL_INFO */
111 /* 0x0094 used by Microsoft for LDAP_OPT_REF_DEREF_CONN_PER_MSG */
112 #define LDAP_OPT_SIGN				0x0095
113 #define LDAP_OPT_ENCRYPT			0x0096
114 #define LDAP_OPT_SASL_METHOD			0x0097
115 /* 0x0098 used by Microsoft for LDAP_OPT_AREC_EXCLUSIVE */
116 #define LDAP_OPT_SECURITY_CONTEXT		0x0099
117 /* 0x009A used by Microsoft for LDAP_OPT_ROOTDSE_CACHE */
118 /* 0x009B - 0x3fff not defined */
119 
120 /* API Extensions */
121 #define LDAP_OPT_API_EXTENSION_BASE 0x4000  /* API extensions */
122 
123 /* private and experimental options */
124 /* OpenLDAP specific options */
125 #define LDAP_OPT_DEBUG_LEVEL		0x5001	/* debug level */
126 #define LDAP_OPT_TIMEOUT			0x5002	/* default timeout */
127 #define LDAP_OPT_REFHOPLIMIT		0x5003	/* ref hop limit */
128 #define LDAP_OPT_NETWORK_TIMEOUT	0x5005	/* socket level timeout */
129 #define LDAP_OPT_URI				0x5006
130 #define LDAP_OPT_REFERRAL_URLS      0x5007  /* Referral URLs */
131 #define LDAP_OPT_SOCKBUF            0x5008  /* sockbuf */
132 #define LDAP_OPT_DEFBASE		0x5009	/* searchbase */
133 #define	LDAP_OPT_CONNECT_ASYNC		0x5010	/* create connections asynchronously */
134 #define	LDAP_OPT_CONNECT_CB			0x5011	/* connection callbacks */
135 #define	LDAP_OPT_SESSION_REFCNT		0x5012	/* session reference count */
136 #define	LDAP_OPT_KEEPCONN		0x5013	/* keep the connection on read error or NoD */
137 #define	LDAP_OPT_SOCKET_BIND_ADDRESSES	0x5014	/* user configured bind IPs */
138 #define	LDAP_OPT_TCP_USER_TIMEOUT	0x5015	/* set TCP_USER_TIMEOUT if the OS supports it, ignored otherwise */
139 
140 /* OpenLDAP TLS options */
141 #define LDAP_OPT_X_TLS				0x6000
142 #define LDAP_OPT_X_TLS_CTX			0x6001	/* OpenSSL CTX* */
143 #define LDAP_OPT_X_TLS_CACERTFILE	0x6002
144 #define LDAP_OPT_X_TLS_CACERTDIR	0x6003
145 #define LDAP_OPT_X_TLS_CERTFILE		0x6004
146 #define LDAP_OPT_X_TLS_KEYFILE		0x6005
147 #define LDAP_OPT_X_TLS_REQUIRE_CERT	0x6006
148 #define LDAP_OPT_X_TLS_PROTOCOL_MIN	0x6007
149 #define LDAP_OPT_X_TLS_CIPHER_SUITE	0x6008
150 #define LDAP_OPT_X_TLS_RANDOM_FILE	0x6009
151 #define LDAP_OPT_X_TLS_SSL_CTX		0x600a	/* OpenSSL SSL* */
152 #define LDAP_OPT_X_TLS_CRLCHECK		0x600b
153 #define LDAP_OPT_X_TLS_CONNECT_CB	0x600c
154 #define LDAP_OPT_X_TLS_CONNECT_ARG	0x600d
155 #define LDAP_OPT_X_TLS_DHFILE		0x600e
156 #define LDAP_OPT_X_TLS_NEWCTX		0x600f
157 #define LDAP_OPT_X_TLS_CRLFILE		0x6010	/* GNUtls only */
158 #define LDAP_OPT_X_TLS_PACKAGE		0x6011
159 #define LDAP_OPT_X_TLS_ECNAME		0x6012
160 #define LDAP_OPT_X_TLS_VERSION		0x6013	/* read-only */
161 #define LDAP_OPT_X_TLS_CIPHER		0x6014	/* read-only */
162 #define LDAP_OPT_X_TLS_PEERCERT		0x6015	/* read-only */
163 #define LDAP_OPT_X_TLS_CACERT		0x6016
164 #define LDAP_OPT_X_TLS_CERT			0x6017
165 #define LDAP_OPT_X_TLS_KEY			0x6018
166 #define LDAP_OPT_X_TLS_PEERKEY_HASH	0x6019
167 #define LDAP_OPT_X_TLS_REQUIRE_SAN	0x601a
168 #define LDAP_OPT_X_TLS_PROTOCOL_MAX	0x601b
169 
170 #define LDAP_OPT_X_TLS_NEVER	0
171 #define LDAP_OPT_X_TLS_HARD		1
172 #define LDAP_OPT_X_TLS_DEMAND	2
173 #define LDAP_OPT_X_TLS_ALLOW	3
174 #define LDAP_OPT_X_TLS_TRY		4
175 
176 #define LDAP_OPT_X_TLS_CRL_NONE	0
177 #define LDAP_OPT_X_TLS_CRL_PEER	1
178 #define LDAP_OPT_X_TLS_CRL_ALL	2
179 
180 /* for LDAP_OPT_X_TLS_PROTOCOL_MIN/MAX */
181 #define LDAP_OPT_X_TLS_PROTOCOL(maj,min)	(((maj) << 8) + (min))
182 #define LDAP_OPT_X_TLS_PROTOCOL_SSL2		(2 << 8)
183 #define LDAP_OPT_X_TLS_PROTOCOL_SSL3		(3 << 8)
184 #define LDAP_OPT_X_TLS_PROTOCOL_TLS1_0		((3 << 8) + 1)
185 #define LDAP_OPT_X_TLS_PROTOCOL_TLS1_1		((3 << 8) + 2)
186 #define LDAP_OPT_X_TLS_PROTOCOL_TLS1_2		((3 << 8) + 3)
187 #define LDAP_OPT_X_TLS_PROTOCOL_TLS1_3		((3 << 8) + 4)
188 
189 #define LDAP_OPT_X_SASL_CBINDING_NONE		0
190 #define LDAP_OPT_X_SASL_CBINDING_TLS_UNIQUE	1
191 #define LDAP_OPT_X_SASL_CBINDING_TLS_ENDPOINT	2
192 
193 /* OpenLDAP SASL options */
194 #define LDAP_OPT_X_SASL_MECH			0x6100
195 #define LDAP_OPT_X_SASL_REALM			0x6101
196 #define LDAP_OPT_X_SASL_AUTHCID			0x6102
197 #define LDAP_OPT_X_SASL_AUTHZID			0x6103
198 #define LDAP_OPT_X_SASL_SSF				0x6104 /* read-only */
199 #define LDAP_OPT_X_SASL_SSF_EXTERNAL	0x6105 /* write-only */
200 #define LDAP_OPT_X_SASL_SECPROPS		0x6106 /* write-only */
201 #define LDAP_OPT_X_SASL_SSF_MIN			0x6107
202 #define LDAP_OPT_X_SASL_SSF_MAX			0x6108
203 #define LDAP_OPT_X_SASL_MAXBUFSIZE		0x6109
204 #define LDAP_OPT_X_SASL_MECHLIST		0x610a /* read-only */
205 #define LDAP_OPT_X_SASL_NOCANON			0x610b
206 #define LDAP_OPT_X_SASL_USERNAME		0x610c /* read-only */
207 #define LDAP_OPT_X_SASL_GSS_CREDS		0x610d
208 #define LDAP_OPT_X_SASL_CBINDING		0x610e
209 
210 /* OpenLDAP GSSAPI options */
211 #define LDAP_OPT_X_GSSAPI_DO_NOT_FREE_CONTEXT      0x6200
212 #define LDAP_OPT_X_GSSAPI_ALLOW_REMOTE_PRINCIPAL   0x6201
213 
214 /*
215  * OpenLDAP per connection tcp-keepalive settings
216  * (Linux only, ignored where unsupported)
217  */
218 #define LDAP_OPT_X_KEEPALIVE_IDLE		0x6300
219 #define LDAP_OPT_X_KEEPALIVE_PROBES		0x6301
220 #define LDAP_OPT_X_KEEPALIVE_INTERVAL	0x6302
221 
222 /* Private API Extensions -- reserved for application use */
223 #define LDAP_OPT_PRIVATE_EXTENSION_BASE 0x7000  /* Private API inclusive */
224 
225 /*
226  * ldap_get_option() and ldap_set_option() return values.
227  * As later versions may return other values indicating
228  * failure, current applications should only compare returned
229  * value against LDAP_OPT_SUCCESS.
230  */
231 #define LDAP_OPT_SUCCESS	0
232 #define	LDAP_OPT_ERROR		(-1)
233 
234 /* option on/off values */
235 #define LDAP_OPT_ON		((void *) &ber_pvt_opt_on)
236 #define LDAP_OPT_OFF	((void *) 0)
237 
238 typedef struct ldapapiinfo {
239 	int		ldapai_info_version;		/* version of LDAPAPIInfo */
240 #define LDAP_API_INFO_VERSION	(1)
241 	int		ldapai_api_version;			/* revision of API supported */
242 	int		ldapai_protocol_version;	/* highest LDAP version supported */
243 	char	**ldapai_extensions;		/* names of API extensions */
244 	char	*ldapai_vendor_name;		/* name of supplier */
245 	int		ldapai_vendor_version;		/* supplier-specific version * 100 */
246 } LDAPAPIInfo;
247 
248 typedef struct ldap_apifeature_info {
249 	int		ldapaif_info_version;		/* version of LDAPAPIFeatureInfo */
250 #define LDAP_FEATURE_INFO_VERSION (1)	/* apifeature_info struct version */
251 	char*	ldapaif_name;				/* LDAP_API_FEATURE_* (less prefix) */
252 	int		ldapaif_version;			/* value of LDAP_API_FEATURE_... */
253 } LDAPAPIFeatureInfo;
254 
255 /*
256  * LDAP Control structure
257  */
258 typedef struct ldapcontrol {
259 	char *			ldctl_oid;			/* numericoid of control */
260 	struct berval	ldctl_value;		/* encoded value of control */
261 	char			ldctl_iscritical;	/* criticality */
262 } LDAPControl;
263 
264 /* LDAP Controls */
265 /*	standard track controls */
266 #define LDAP_CONTROL_MANAGEDSAIT	"2.16.840.1.113730.3.4.2"  /* RFC 3296 */
267 #define LDAP_CONTROL_PROXY_AUTHZ	"2.16.840.1.113730.3.4.18" /* RFC 4370 */
268 #define LDAP_CONTROL_SUBENTRIES		"1.3.6.1.4.1.4203.1.10.1"  /* RFC 3672 */
269 
270 #define LDAP_CONTROL_VALUESRETURNFILTER "1.2.826.0.1.3344810.2.3"/* RFC 3876 */
271 
272 #define LDAP_CONTROL_ASSERT				"1.3.6.1.1.12"			/* RFC 4528 */
273 #define LDAP_CONTROL_PRE_READ			"1.3.6.1.1.13.1"		/* RFC 4527 */
274 #define LDAP_CONTROL_POST_READ			"1.3.6.1.1.13.2"		/* RFC 4527 */
275 
276 #define LDAP_CONTROL_SORTREQUEST    "1.2.840.113556.1.4.473" /* RFC 2891 */
277 #define LDAP_CONTROL_SORTRESPONSE	"1.2.840.113556.1.4.474" /* RFC 2891 */
278 
279 /*	non-standard track controls */
280 #define LDAP_CONTROL_PAGEDRESULTS	"1.2.840.113556.1.4.319"   /* RFC 2696 */
281 
282 #define LDAP_CONTROL_AUTHZID_REQUEST	"2.16.840.1.113730.3.4.16"   /* RFC 3829 */
283 #define LDAP_CONTROL_AUTHZID_RESPONSE   "2.16.840.1.113730.3.4.15"   /* RFC 3829 */
284 
285 /* LDAP Content Synchronization Operation -- RFC 4533 */
286 #define LDAP_SYNC_OID			"1.3.6.1.4.1.4203.1.9.1"
287 #define LDAP_CONTROL_SYNC		LDAP_SYNC_OID ".1"
288 #define LDAP_CONTROL_SYNC_STATE	LDAP_SYNC_OID ".2"
289 #define LDAP_CONTROL_SYNC_DONE	LDAP_SYNC_OID ".3"
290 #define LDAP_SYNC_INFO			LDAP_SYNC_OID ".4"
291 
292 #define LDAP_SYNC_NONE					0x00
293 #define LDAP_SYNC_REFRESH_ONLY			0x01
294 #define LDAP_SYNC_RESERVED				0x02
295 #define LDAP_SYNC_REFRESH_AND_PERSIST	0x03
296 
297 #define LDAP_SYNC_REFRESH_PRESENTS		0
298 #define LDAP_SYNC_REFRESH_DELETES		1
299 
300 #define LDAP_TAG_SYNC_NEW_COOKIE		((ber_tag_t) 0x80U)
301 #define LDAP_TAG_SYNC_REFRESH_DELETE	((ber_tag_t) 0xa1U)
302 #define LDAP_TAG_SYNC_REFRESH_PRESENT	((ber_tag_t) 0xa2U)
303 #define	LDAP_TAG_SYNC_ID_SET			((ber_tag_t) 0xa3U)
304 
305 #define LDAP_TAG_SYNC_COOKIE			((ber_tag_t) 0x04U)
306 #define LDAP_TAG_REFRESHDELETES			((ber_tag_t) 0x01U)
307 #define LDAP_TAG_REFRESHDONE			((ber_tag_t) 0x01U)
308 #define LDAP_TAG_RELOAD_HINT			((ber_tag_t) 0x01U)
309 
310 #define LDAP_SYNC_PRESENT				0
311 #define LDAP_SYNC_ADD					1
312 #define LDAP_SYNC_MODIFY				2
313 #define LDAP_SYNC_DELETE				3
314 #define LDAP_SYNC_NEW_COOKIE			4
315 
316 /* LDAP Don't Use Copy Control (RFC 6171) */
317 #define LDAP_CONTROL_DONTUSECOPY		"1.3.6.1.1.22"
318 
319 /* Password policy Controls *//* work in progress */
320 /* ITS#3458: released; disabled by default */
321 #define LDAP_CONTROL_PASSWORDPOLICYREQUEST	"1.3.6.1.4.1.42.2.27.8.5.1"
322 #define LDAP_CONTROL_PASSWORDPOLICYRESPONSE	"1.3.6.1.4.1.42.2.27.8.5.1"
323 
324 /* various works in progress */
325 #define LDAP_CONTROL_NOOP				"1.3.6.1.4.1.4203.666.5.2"
326 #define LDAP_CONTROL_NO_SUBORDINATES	"1.3.6.1.4.1.4203.666.5.11"
327 #define LDAP_CONTROL_RELAX				"1.3.6.1.4.1.4203.666.5.12"
328 #define LDAP_CONTROL_MANAGEDIT			LDAP_CONTROL_RELAX
329 #define LDAP_CONTROL_SLURP				"1.3.6.1.4.1.4203.666.5.13"
330 #define LDAP_CONTROL_VALSORT			"1.3.6.1.4.1.4203.666.5.14"
331 #define	LDAP_CONTROL_X_DEREF			"1.3.6.1.4.1.4203.666.5.16"
332 #define	LDAP_CONTROL_X_WHATFAILED		"1.3.6.1.4.1.4203.666.5.17"
333 
334 /* LDAP Chaining Behavior Control *//* work in progress */
335 /* <draft-sermersheim-ldap-chaining>;
336  * see also LDAP_NO_REFERRALS_FOUND, LDAP_CANNOT_CHAIN */
337 #define LDAP_CONTROL_X_CHAINING_BEHAVIOR	"1.3.6.1.4.1.4203.666.11.3"
338 
339 #define	LDAP_CHAINING_PREFERRED				0
340 #define	LDAP_CHAINING_REQUIRED				1
341 #define LDAP_REFERRALS_PREFERRED			2
342 #define LDAP_REFERRALS_REQUIRED				3
343 
344 /* MS Active Directory controls (for compatibility) */
345 #define LDAP_CONTROL_X_LAZY_COMMIT			"1.2.840.113556.1.4.619"
346 #define LDAP_CONTROL_X_INCREMENTAL_VALUES	"1.2.840.113556.1.4.802"
347 #define LDAP_CONTROL_X_DOMAIN_SCOPE			"1.2.840.113556.1.4.1339"
348 #define LDAP_CONTROL_X_PERMISSIVE_MODIFY	"1.2.840.113556.1.4.1413"
349 #define LDAP_CONTROL_X_SEARCH_OPTIONS		"1.2.840.113556.1.4.1340"
350 #define LDAP_SEARCH_FLAG_DOMAIN_SCOPE 1 /* do not generate referrals */
351 #define LDAP_SEARCH_FLAG_PHANTOM_ROOT 2 /* search all subordinate NCs */
352 #define LDAP_CONTROL_X_TREE_DELETE		"1.2.840.113556.1.4.805"
353 
354 /* MS Active Directory controls - not implemented in slapd(8) */
355 #define LDAP_CONTROL_X_SERVER_NOTIFICATION	"1.2.840.113556.1.4.528"
356 #define LDAP_CONTROL_X_EXTENDED_DN		"1.2.840.113556.1.4.529"
357 #define LDAP_CONTROL_X_SHOW_DELETED		"1.2.840.113556.1.4.417"
358 #define LDAP_CONTROL_X_DIRSYNC			"1.2.840.113556.1.4.841"
359 
360 #define LDAP_CONTROL_X_DIRSYNC_OBJECT_SECURITY		0x00000001
361 #define LDAP_CONTROL_X_DIRSYNC_ANCESTORS_FIRST		0x00000800
362 #define LDAP_CONTROL_X_DIRSYNC_PUBLIC_DATA_ONLY		0x00002000
363 #define LDAP_CONTROL_X_DIRSYNC_INCREMENTAL_VALUES	0x80000000
364 
365 
366 /* <draft-wahl-ldap-session> */
367 #define LDAP_CONTROL_X_SESSION_TRACKING		"1.3.6.1.4.1.21008.108.63.1"
368 #define LDAP_CONTROL_X_SESSION_TRACKING_RADIUS_ACCT_SESSION_ID \
369 						LDAP_CONTROL_X_SESSION_TRACKING ".1"
370 #define LDAP_CONTROL_X_SESSION_TRACKING_RADIUS_ACCT_MULTI_SESSION_ID \
371 						LDAP_CONTROL_X_SESSION_TRACKING ".2"
372 #define LDAP_CONTROL_X_SESSION_TRACKING_USERNAME \
373 						LDAP_CONTROL_X_SESSION_TRACKING ".3"
374 /* various expired works */
375 
376 /* LDAP Duplicated Entry Control Extension *//* not implemented in slapd(8) */
377 #define LDAP_CONTROL_DUPENT_REQUEST		"2.16.840.1.113719.1.27.101.1"
378 #define LDAP_CONTROL_DUPENT_RESPONSE	"2.16.840.1.113719.1.27.101.2"
379 #define LDAP_CONTROL_DUPENT_ENTRY		"2.16.840.1.113719.1.27.101.3"
380 #define LDAP_CONTROL_DUPENT	LDAP_CONTROL_DUPENT_REQUEST
381 
382 /* LDAP Persistent Search Control *//* not implemented in slapd(8) */
383 #define LDAP_CONTROL_PERSIST_REQUEST				"2.16.840.1.113730.3.4.3"
384 #define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_NOTICE	"2.16.840.1.113730.3.4.7"
385 #define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_ADD		0x1
386 #define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_DELETE	0x2
387 #define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_MODIFY	0x4
388 #define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_RENAME	0x8
389 
390 /* LDAP VLV */
391 #define LDAP_CONTROL_VLVREQUEST    	"2.16.840.1.113730.3.4.9"
392 #define LDAP_CONTROL_VLVRESPONSE    "2.16.840.1.113730.3.4.10"
393 
394 /* Sun's analogue to ppolicy */
395 #define LDAP_CONTROL_X_ACCOUNT_USABILITY "1.3.6.1.4.1.42.2.27.9.5.8"
396 
397 #define LDAP_TAG_X_ACCOUNT_USABILITY_AVAILABLE	((ber_tag_t) 0x80U)	/* primitive + 0 */
398 #define LDAP_TAG_X_ACCOUNT_USABILITY_NOT_AVAILABLE	((ber_tag_t) 0xA1U)	/* constructed + 1 */
399 
400 #define LDAP_TAG_X_ACCOUNT_USABILITY_INACTIVE	((ber_tag_t) 0x80U)	/* primitive + 0 */
401 #define LDAP_TAG_X_ACCOUNT_USABILITY_RESET	((ber_tag_t) 0x81U)	/* primitive + 1 */
402 #define LDAP_TAG_X_ACCOUNT_USABILITY_EXPIRED	((ber_tag_t) 0x82U)	/* primitive + 2 */
403 #define LDAP_TAG_X_ACCOUNT_USABILITY_REMAINING_GRACE	((ber_tag_t) 0x83U)	/* primitive + 3 */
404 #define LDAP_TAG_X_ACCOUNT_USABILITY_UNTIL_UNLOCK	((ber_tag_t) 0x84U)	/* primitive + 4 */
405 
406 /* Netscape Password policy response controls */
407 /* <draft-vchu-ldap-pwd-policy> */
408 #define LDAP_CONTROL_X_PASSWORD_EXPIRED		"2.16.840.1.113730.3.4.4"
409 #define LDAP_CONTROL_X_PASSWORD_EXPIRING	"2.16.840.1.113730.3.4.5"
410 
411 /* LDAP Unsolicited Notifications */
412 #define	LDAP_NOTICE_OF_DISCONNECTION	"1.3.6.1.4.1.1466.20036" /* RFC 4511 */
413 #define LDAP_NOTICE_DISCONNECT LDAP_NOTICE_OF_DISCONNECTION
414 
415 /* LDAP Extended Operations */
416 #define LDAP_EXOP_START_TLS		"1.3.6.1.4.1.1466.20037"	/* RFC 4511 */
417 
418 #define LDAP_EXOP_MODIFY_PASSWD	"1.3.6.1.4.1.4203.1.11.1"	/* RFC 3062 */
419 #define LDAP_TAG_EXOP_MODIFY_PASSWD_ID	((ber_tag_t) 0x80U)
420 #define LDAP_TAG_EXOP_MODIFY_PASSWD_OLD	((ber_tag_t) 0x81U)
421 #define LDAP_TAG_EXOP_MODIFY_PASSWD_NEW	((ber_tag_t) 0x82U)
422 #define LDAP_TAG_EXOP_MODIFY_PASSWD_GEN	((ber_tag_t) 0x80U)
423 
424 #define LDAP_EXOP_CANCEL		"1.3.6.1.1.8"					/* RFC 3909 */
425 #define LDAP_EXOP_X_CANCEL		LDAP_EXOP_CANCEL
426 
427 #define	LDAP_EXOP_REFRESH		"1.3.6.1.4.1.1466.101.119.1"	/* RFC 2589 */
428 #define	LDAP_TAG_EXOP_REFRESH_REQ_DN	((ber_tag_t) 0x80U)
429 #define	LDAP_TAG_EXOP_REFRESH_REQ_TTL	((ber_tag_t) 0x81U)
430 #define	LDAP_TAG_EXOP_REFRESH_RES_TTL	((ber_tag_t) 0x81U)
431 
432 #define LDAP_EXOP_VERIFY_CREDENTIALS	"1.3.6.1.4.1.4203.666.6.5"
433 #define LDAP_EXOP_X_VERIFY_CREDENTIALS	LDAP_EXOP_VERIFY_CREDENTIALS
434 
435 #define LDAP_TAG_EXOP_VERIFY_CREDENTIALS_COOKIE	 ((ber_tag_t) 0x80U)
436 #define LDAP_TAG_EXOP_VERIFY_CREDENTIALS_SCREDS	 ((ber_tag_t) 0x81U)
437 #define LDAP_TAG_EXOP_VERIFY_CREDENTIALS_CONTROLS ((ber_tag_t) 0xa2U) /* context specific + constructed + 2 */
438 
439 #define LDAP_EXOP_WHO_AM_I		"1.3.6.1.4.1.4203.1.11.3"		/* RFC 4532 */
440 #define LDAP_EXOP_X_WHO_AM_I	LDAP_EXOP_WHO_AM_I
441 
442 /* various works in progress */
443 #define LDAP_EXOP_TURN		"1.3.6.1.1.19"				/* RFC 4531 */
444 #define LDAP_EXOP_X_TURN	LDAP_EXOP_TURN
445 
446 /* LDAP Distributed Procedures <draft-sermersheim-ldap-distproc> */
447 /* a work in progress */
448 #define LDAP_X_DISTPROC_BASE		"1.3.6.1.4.1.4203.666.11.6"
449 #define LDAP_EXOP_X_CHAINEDREQUEST	LDAP_X_DISTPROC_BASE ".1"
450 #define LDAP_FEATURE_X_CANCHAINOPS	LDAP_X_DISTPROC_BASE ".2"
451 #define LDAP_CONTROL_X_RETURNCONTREF	LDAP_X_DISTPROC_BASE ".3"
452 #define LDAP_URLEXT_X_LOCALREFOID	LDAP_X_DISTPROC_BASE ".4"
453 #define LDAP_URLEXT_X_REFTYPEOID	LDAP_X_DISTPROC_BASE ".5"
454 #define LDAP_URLEXT_X_SEARCHEDSUBTREEOID \
455 					LDAP_X_DISTPROC_BASE ".6"
456 #define LDAP_URLEXT_X_FAILEDNAMEOID	LDAP_X_DISTPROC_BASE ".7"
457 #define LDAP_URLEXT_X_LOCALREF		"x-localReference"
458 #define LDAP_URLEXT_X_REFTYPE		"x-referenceType"
459 #define LDAP_URLEXT_X_SEARCHEDSUBTREE	"x-searchedSubtree"
460 #define LDAP_URLEXT_X_FAILEDNAME	"x-failedName"
461 
462 #define LDAP_TXN						"1.3.6.1.1.21" /* RFC 5805 */
463 #define LDAP_EXOP_TXN_START				LDAP_TXN ".1"
464 #define LDAP_CONTROL_TXN_SPEC			LDAP_TXN ".2"
465 #define LDAP_EXOP_TXN_END				LDAP_TXN ".3"
466 #define LDAP_EXOP_TXN_ABORTED_NOTICE	LDAP_TXN ".4"
467 
468 /* LDAP Features */
469 #define LDAP_FEATURE_ALL_OP_ATTRS	"1.3.6.1.4.1.4203.1.5.1"	/* RFC 3673 */
470 #define LDAP_FEATURE_OBJECTCLASS_ATTRS \
471 	"1.3.6.1.4.1.4203.1.5.2" /*  @objectClass - new number to be assigned */
472 #define LDAP_FEATURE_ABSOLUTE_FILTERS "1.3.6.1.4.1.4203.1.5.3"  /* (&) (|) */
473 #define LDAP_FEATURE_LANGUAGE_TAG_OPTIONS "1.3.6.1.4.1.4203.1.5.4"
474 #define LDAP_FEATURE_LANGUAGE_RANGE_OPTIONS "1.3.6.1.4.1.4203.1.5.5"
475 #define LDAP_FEATURE_MODIFY_INCREMENT "1.3.6.1.1.14"
476 
477 /* LDAP Experimental (works in progress) Features */
478 #define LDAP_FEATURE_SUBORDINATE_SCOPE \
479 	"1.3.6.1.4.1.4203.666.8.1" /* "children" */
480 #define LDAP_FEATURE_CHILDREN_SCOPE LDAP_FEATURE_SUBORDINATE_SCOPE
481 
482 /*
483  * specific LDAP instantiations of BER types we know about
484  */
485 
486 /* Overview of LBER tag construction
487  *
488  *	Bits
489  *	______
490  *	8 7 | CLASS
491  *	0 0 = UNIVERSAL
492  *	0 1 = APPLICATION
493  *	1 0 = CONTEXT-SPECIFIC
494  *	1 1 = PRIVATE
495  *		_____
496  *		| 6 | DATA-TYPE
497  *		  0 = PRIMITIVE
498  *		  1 = CONSTRUCTED
499  *			___________
500  *			| 5 ... 1 | TAG-NUMBER
501  */
502 
503 /* general stuff */
504 #define LDAP_TAG_MESSAGE	((ber_tag_t) 0x30U)	/* constructed + 16 */
505 #define LDAP_TAG_MSGID		((ber_tag_t) 0x02U)	/* integer */
506 
507 #define LDAP_TAG_LDAPDN		((ber_tag_t) 0x04U)	/* octet string */
508 #define LDAP_TAG_LDAPCRED	((ber_tag_t) 0x04U)	/* octet string */
509 
510 #define LDAP_TAG_CONTROLS	((ber_tag_t) 0xa0U)	/* context specific + constructed + 0 */
511 #define LDAP_TAG_REFERRAL	((ber_tag_t) 0xa3U)	/* context specific + constructed + 3 */
512 
513 #define LDAP_TAG_NEWSUPERIOR	((ber_tag_t) 0x80U)	/* context-specific + primitive + 0 */
514 
515 #define LDAP_TAG_EXOP_REQ_OID   ((ber_tag_t) 0x80U)	/* context specific + primitive */
516 #define LDAP_TAG_EXOP_REQ_VALUE ((ber_tag_t) 0x81U)	/* context specific + primitive */
517 #define LDAP_TAG_EXOP_RES_OID   ((ber_tag_t) 0x8aU)	/* context specific + primitive */
518 #define LDAP_TAG_EXOP_RES_VALUE ((ber_tag_t) 0x8bU)	/* context specific + primitive */
519 
520 #define LDAP_TAG_IM_RES_OID   ((ber_tag_t) 0x80U)	/* context specific + primitive */
521 #define LDAP_TAG_IM_RES_VALUE ((ber_tag_t) 0x81U)	/* context specific + primitive */
522 
523 #define LDAP_TAG_SASL_RES_CREDS	((ber_tag_t) 0x87U)	/* context specific + primitive */
524 
525 /* LDAP Request Messages */
526 #define LDAP_REQ_BIND		((ber_tag_t) 0x60U)	/* application + constructed */
527 #define LDAP_REQ_UNBIND		((ber_tag_t) 0x42U)	/* application + primitive   */
528 #define LDAP_REQ_SEARCH		((ber_tag_t) 0x63U)	/* application + constructed */
529 #define LDAP_REQ_MODIFY		((ber_tag_t) 0x66U)	/* application + constructed */
530 #define LDAP_REQ_ADD		((ber_tag_t) 0x68U)	/* application + constructed */
531 #define LDAP_REQ_DELETE		((ber_tag_t) 0x4aU)	/* application + primitive   */
532 #define LDAP_REQ_MODDN		((ber_tag_t) 0x6cU)	/* application + constructed */
533 #define LDAP_REQ_MODRDN		LDAP_REQ_MODDN
534 #define LDAP_REQ_RENAME		LDAP_REQ_MODDN
535 #define LDAP_REQ_COMPARE	((ber_tag_t) 0x6eU)	/* application + constructed */
536 #define LDAP_REQ_ABANDON	((ber_tag_t) 0x50U)	/* application + primitive   */
537 #define LDAP_REQ_EXTENDED	((ber_tag_t) 0x77U)	/* application + constructed */
538 
539 /* LDAP Response Messages */
540 #define LDAP_RES_BIND		((ber_tag_t) 0x61U)	/* application + constructed */
541 #define LDAP_RES_SEARCH_ENTRY	((ber_tag_t) 0x64U)	/* application + constructed */
542 #define LDAP_RES_SEARCH_REFERENCE	((ber_tag_t) 0x73U)	/* V3: application + constructed */
543 #define LDAP_RES_SEARCH_RESULT	((ber_tag_t) 0x65U)	/* application + constructed */
544 #define LDAP_RES_MODIFY		((ber_tag_t) 0x67U)	/* application + constructed */
545 #define LDAP_RES_ADD		((ber_tag_t) 0x69U)	/* application + constructed */
546 #define LDAP_RES_DELETE		((ber_tag_t) 0x6bU)	/* application + constructed */
547 #define LDAP_RES_MODDN		((ber_tag_t) 0x6dU)	/* application + constructed */
548 #define LDAP_RES_MODRDN		LDAP_RES_MODDN	/* application + constructed */
549 #define LDAP_RES_RENAME		LDAP_RES_MODDN	/* application + constructed */
550 #define LDAP_RES_COMPARE	((ber_tag_t) 0x6fU)	/* application + constructed */
551 #define LDAP_RES_EXTENDED	((ber_tag_t) 0x78U)	/* V3: application + constructed */
552 #define LDAP_RES_INTERMEDIATE	((ber_tag_t) 0x79U) /* V3+: application + constructed */
553 
554 #define LDAP_RES_ANY			(-1)
555 #define LDAP_RES_UNSOLICITED	(0)
556 
557 
558 /* sasl methods */
559 #define LDAP_SASL_SIMPLE	((char*)0)
560 #define LDAP_SASL_NULL		("")
561 
562 
563 /* authentication methods available */
564 #define LDAP_AUTH_NONE   ((ber_tag_t) 0x00U) /* no authentication */
565 #define LDAP_AUTH_SIMPLE ((ber_tag_t) 0x80U) /* context specific + primitive */
566 #define LDAP_AUTH_SASL   ((ber_tag_t) 0xa3U) /* context specific + constructed */
567 #define LDAP_AUTH_KRBV4  ((ber_tag_t) 0xffU) /* means do both of the following */
568 #define LDAP_AUTH_KRBV41 ((ber_tag_t) 0x81U) /* context specific + primitive */
569 #define LDAP_AUTH_KRBV42 ((ber_tag_t) 0x82U) /* context specific + primitive */
570 
571 /* used by the Windows API but not used on the wire */
572 #define LDAP_AUTH_NEGOTIATE ((ber_tag_t) 0x04FFU)
573 
574 /* filter types */
575 #define LDAP_FILTER_AND	((ber_tag_t) 0xa0U)	/* context specific + constructed */
576 #define LDAP_FILTER_OR	((ber_tag_t) 0xa1U)	/* context specific + constructed */
577 #define LDAP_FILTER_NOT	((ber_tag_t) 0xa2U)	/* context specific + constructed */
578 #define LDAP_FILTER_EQUALITY ((ber_tag_t) 0xa3U) /* context specific + constructed */
579 #define LDAP_FILTER_SUBSTRINGS ((ber_tag_t) 0xa4U) /* context specific + constructed */
580 #define LDAP_FILTER_GE ((ber_tag_t) 0xa5U) /* context specific + constructed */
581 #define LDAP_FILTER_LE ((ber_tag_t) 0xa6U) /* context specific + constructed */
582 #define LDAP_FILTER_PRESENT ((ber_tag_t) 0x87U) /* context specific + primitive   */
583 #define LDAP_FILTER_APPROX ((ber_tag_t) 0xa8U)	/* context specific + constructed */
584 #define LDAP_FILTER_EXT	((ber_tag_t) 0xa9U)	/* context specific + constructed */
585 
586 /* extended filter component types */
587 #define LDAP_FILTER_EXT_OID		((ber_tag_t) 0x81U)	/* context specific */
588 #define LDAP_FILTER_EXT_TYPE	((ber_tag_t) 0x82U)	/* context specific */
589 #define LDAP_FILTER_EXT_VALUE	((ber_tag_t) 0x83U)	/* context specific */
590 #define LDAP_FILTER_EXT_DNATTRS	((ber_tag_t) 0x84U)	/* context specific */
591 
592 /* substring filter component types */
593 #define LDAP_SUBSTRING_INITIAL	((ber_tag_t) 0x80U)	/* context specific */
594 #define LDAP_SUBSTRING_ANY		((ber_tag_t) 0x81U)	/* context specific */
595 #define LDAP_SUBSTRING_FINAL	((ber_tag_t) 0x82U)	/* context specific */
596 
597 /* search scopes */
598 #define LDAP_SCOPE_BASE			((ber_int_t) 0x0000)
599 #define LDAP_SCOPE_BASEOBJECT	LDAP_SCOPE_BASE
600 #define LDAP_SCOPE_ONELEVEL		((ber_int_t) 0x0001)
601 #define LDAP_SCOPE_ONE			LDAP_SCOPE_ONELEVEL
602 #define LDAP_SCOPE_SUBTREE		((ber_int_t) 0x0002)
603 #define LDAP_SCOPE_SUB			LDAP_SCOPE_SUBTREE
604 #define LDAP_SCOPE_SUBORDINATE	((ber_int_t) 0x0003) /* OpenLDAP extension */
605 #define LDAP_SCOPE_CHILDREN		LDAP_SCOPE_SUBORDINATE
606 #define LDAP_SCOPE_DEFAULT		((ber_int_t) -1)	 /* OpenLDAP extension */
607 
608 /* substring filter component types */
609 #define LDAP_SUBSTRING_INITIAL	((ber_tag_t) 0x80U)	/* context specific */
610 #define LDAP_SUBSTRING_ANY		((ber_tag_t) 0x81U)	/* context specific */
611 #define LDAP_SUBSTRING_FINAL	((ber_tag_t) 0x82U)	/* context specific */
612 
613 /*
614  * LDAP Result Codes
615  */
616 #define LDAP_SUCCESS				0x00
617 
618 #define LDAP_RANGE(n,x,y)	(((x) <= (n)) && ((n) <= (y)))
619 
620 #define LDAP_OPERATIONS_ERROR		0x01
621 #define LDAP_PROTOCOL_ERROR			0x02
622 #define LDAP_TIMELIMIT_EXCEEDED		0x03
623 #define LDAP_SIZELIMIT_EXCEEDED		0x04
624 #define LDAP_COMPARE_FALSE			0x05
625 #define LDAP_COMPARE_TRUE			0x06
626 #define LDAP_AUTH_METHOD_NOT_SUPPORTED	0x07
627 #define LDAP_STRONG_AUTH_NOT_SUPPORTED	LDAP_AUTH_METHOD_NOT_SUPPORTED
628 #define LDAP_STRONG_AUTH_REQUIRED	0x08
629 #define LDAP_STRONGER_AUTH_REQUIRED	LDAP_STRONG_AUTH_REQUIRED
630 #define LDAP_PARTIAL_RESULTS		0x09	/* LDAPv2+ (not LDAPv3) */
631 
632 #define	LDAP_REFERRAL				0x0a /* LDAPv3 */
633 #define LDAP_ADMINLIMIT_EXCEEDED	0x0b /* LDAPv3 */
634 #define	LDAP_UNAVAILABLE_CRITICAL_EXTENSION	0x0c /* LDAPv3 */
635 #define LDAP_CONFIDENTIALITY_REQUIRED	0x0d /* LDAPv3 */
636 #define	LDAP_SASL_BIND_IN_PROGRESS	0x0e /* LDAPv3 */
637 
638 #define LDAP_ATTR_ERROR(n)	LDAP_RANGE((n),0x10,0x15) /* 16-21 */
639 
640 #define LDAP_NO_SUCH_ATTRIBUTE		0x10
641 #define LDAP_UNDEFINED_TYPE			0x11
642 #define LDAP_INAPPROPRIATE_MATCHING	0x12
643 #define LDAP_CONSTRAINT_VIOLATION	0x13
644 #define LDAP_TYPE_OR_VALUE_EXISTS	0x14
645 #define LDAP_INVALID_SYNTAX			0x15
646 
647 #define LDAP_NAME_ERROR(n)	LDAP_RANGE((n),0x20,0x24) /* 32-34,36 */
648 
649 #define LDAP_NO_SUCH_OBJECT			0x20
650 #define LDAP_ALIAS_PROBLEM			0x21
651 #define LDAP_INVALID_DN_SYNTAX		0x22
652 #define LDAP_IS_LEAF				0x23 /* not LDAPv3 */
653 #define LDAP_ALIAS_DEREF_PROBLEM	0x24
654 
655 #define LDAP_SECURITY_ERROR(n)	LDAP_RANGE((n),0x2F,0x32) /* 47-50 */
656 
657 #define LDAP_X_PROXY_AUTHZ_FAILURE	0x2F /* LDAPv3 proxy authorization */
658 #define LDAP_INAPPROPRIATE_AUTH		0x30
659 #define LDAP_INVALID_CREDENTIALS	0x31
660 #define LDAP_INSUFFICIENT_ACCESS	0x32
661 
662 #define LDAP_SERVICE_ERROR(n)	LDAP_RANGE((n),0x33,0x36) /* 51-54 */
663 
664 #define LDAP_BUSY					0x33
665 #define LDAP_UNAVAILABLE			0x34
666 #define LDAP_UNWILLING_TO_PERFORM	0x35
667 #define LDAP_LOOP_DETECT			0x36
668 
669 #define LDAP_UPDATE_ERROR(n)	LDAP_RANGE((n),0x40,0x47) /* 64-69,71 */
670 
671 #define LDAP_NAMING_VIOLATION		0x40
672 #define LDAP_OBJECT_CLASS_VIOLATION	0x41
673 #define LDAP_NOT_ALLOWED_ON_NONLEAF	0x42
674 #define LDAP_NOT_ALLOWED_ON_RDN		0x43
675 #define LDAP_ALREADY_EXISTS			0x44
676 #define LDAP_NO_OBJECT_CLASS_MODS	0x45
677 #define LDAP_RESULTS_TOO_LARGE		0x46 /* CLDAP */
678 #define LDAP_AFFECTS_MULTIPLE_DSAS	0x47
679 
680 #define LDAP_VLV_ERROR				0x4C
681 
682 #define LDAP_OTHER					0x50
683 
684 /* LCUP operation codes (113-117) - not implemented */
685 #define LDAP_CUP_RESOURCES_EXHAUSTED	0x71
686 #define LDAP_CUP_SECURITY_VIOLATION		0x72
687 #define LDAP_CUP_INVALID_DATA			0x73
688 #define LDAP_CUP_UNSUPPORTED_SCHEME		0x74
689 #define LDAP_CUP_RELOAD_REQUIRED		0x75
690 
691 /* Cancel operation codes (118-121) */
692 #define LDAP_CANCELLED				0x76
693 #define LDAP_NO_SUCH_OPERATION		0x77
694 #define LDAP_TOO_LATE				0x78
695 #define LDAP_CANNOT_CANCEL			0x79
696 
697 /* Assertion control (122) */
698 #define LDAP_ASSERTION_FAILED		0x7A
699 
700 /* Proxied Authorization Denied (123) */
701 #define LDAP_PROXIED_AUTHORIZATION_DENIED		0x7B
702 
703 /* Experimental result codes */
704 #define LDAP_E_ERROR(n)	LDAP_RANGE((n),0x1000,0x3FFF)
705 
706 /* LDAP Sync (4096) */
707 #define LDAP_SYNC_REFRESH_REQUIRED		0x1000
708 
709 
710 /* Private Use result codes */
711 #define LDAP_X_ERROR(n)	LDAP_RANGE((n),0x4000,0xFFFF)
712 
713 #define LDAP_X_SYNC_REFRESH_REQUIRED	0x4100 /* defunct */
714 #define LDAP_X_ASSERTION_FAILED			0x410f /* defunct */
715 
716 /* for the LDAP No-Op control */
717 #define LDAP_X_NO_OPERATION				0x410e
718 
719 /* for the Chaining Behavior control (consecutive result codes requested;
720  * see <draft-sermersheim-ldap-chaining> ) */
721 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
722 #define	LDAP_X_NO_REFERRALS_FOUND		0x4110
723 #define LDAP_X_CANNOT_CHAIN			0x4111
724 #endif
725 
726 /* for Distributed Procedures (see <draft-sermersheim-ldap-distproc>) */
727 #ifdef LDAP_X_DISTPROC_BASE
728 #define LDAP_X_INVALIDREFERENCE			0x4112
729 #endif
730 
731 #define LDAP_TXN_SPECIFY_OKAY		0x4120
732 #define LDAP_TXN_ID_INVALID			0x4121
733 
734 /* API Error Codes
735  *
736  * Based on draft-ietf-ldap-c-api-xx
737  * but with new negative code values
738  */
739 #define LDAP_API_ERROR(n)		((n)<0)
740 #define LDAP_API_RESULT(n)		((n)<=0)
741 
742 #define LDAP_SERVER_DOWN				(-1)
743 #define LDAP_LOCAL_ERROR				(-2)
744 #define LDAP_ENCODING_ERROR				(-3)
745 #define LDAP_DECODING_ERROR				(-4)
746 #define LDAP_TIMEOUT					(-5)
747 #define LDAP_AUTH_UNKNOWN				(-6)
748 #define LDAP_FILTER_ERROR				(-7)
749 #define LDAP_USER_CANCELLED				(-8)
750 #define LDAP_PARAM_ERROR				(-9)
751 #define LDAP_NO_MEMORY					(-10)
752 #define LDAP_CONNECT_ERROR				(-11)
753 #define LDAP_NOT_SUPPORTED				(-12)
754 #define LDAP_CONTROL_NOT_FOUND			(-13)
755 #define LDAP_NO_RESULTS_RETURNED		(-14)
756 #define LDAP_MORE_RESULTS_TO_RETURN		(-15)	/* Obsolete */
757 #define LDAP_CLIENT_LOOP				(-16)
758 #define LDAP_REFERRAL_LIMIT_EXCEEDED	(-17)
759 #define	LDAP_X_CONNECTING			(-18)
760 
761 
762 /*
763  * This structure represents both ldap messages and ldap responses.
764  * These are really the same, except in the case of search responses,
765  * where a response has multiple messages.
766  */
767 
768 typedef struct ldapmsg LDAPMessage;
769 
770 /* for modifications */
771 typedef struct ldapmod {
772 	int		mod_op;
773 
774 #define LDAP_MOD_OP			(0x0007)
775 #define LDAP_MOD_ADD		(0x0000)
776 #define LDAP_MOD_DELETE		(0x0001)
777 #define LDAP_MOD_REPLACE	(0x0002)
778 #define LDAP_MOD_INCREMENT	(0x0003) /* OpenLDAP extension */
779 #define LDAP_MOD_BVALUES	(0x0080)
780 /* IMPORTANT: do not use code 0x1000 (or above),
781  * it is used internally by the backends!
782  * (see ldap/servers/slapd/slap.h)
783  */
784 
785 	char		*mod_type;
786 	union mod_vals_u {
787 		char		**modv_strvals;
788 		struct berval	**modv_bvals;
789 	} mod_vals;
790 #define mod_values	mod_vals.modv_strvals
791 #define mod_bvalues	mod_vals.modv_bvals
792 } LDAPMod;
793 
794 /*
795  * structure representing an ldap session which can
796  * encompass connections to multiple servers (in the
797  * face of referrals).
798  */
799 typedef struct ldap LDAP;
800 
801 #define LDAP_DEREF_NEVER		0x00
802 #define LDAP_DEREF_SEARCHING	0x01
803 #define LDAP_DEREF_FINDING		0x02
804 #define LDAP_DEREF_ALWAYS		0x03
805 
806 #define LDAP_NO_LIMIT			0
807 
808 /* how many messages to retrieve results for */
809 #define LDAP_MSG_ONE			0x00
810 #define LDAP_MSG_ALL			0x01
811 #define LDAP_MSG_RECEIVED		0x02
812 
813 /*
814  * types for ldap URL handling
815  */
816 typedef struct ldap_url_desc {
817 	struct ldap_url_desc *lud_next;
818 	char	*lud_scheme;
819 	char	*lud_host;
820 	int		lud_port;
821 	char	*lud_dn;
822 	char	**lud_attrs;
823 	int		lud_scope;
824 	char	*lud_filter;
825 	char	**lud_exts;
826 	int		lud_crit_exts;
827 } LDAPURLDesc;
828 
829 #define LDAP_URL_SUCCESS		0x00	/* Success */
830 #define LDAP_URL_ERR_MEM		0x01	/* can't allocate memory space */
831 #define LDAP_URL_ERR_PARAM		0x02	/* parameter is bad */
832 
833 #define LDAP_URL_ERR_BADSCHEME	0x03	/* URL doesn't begin with "ldap[si]://" */
834 #define LDAP_URL_ERR_BADENCLOSURE 0x04	/* URL is missing trailing ">" */
835 #define LDAP_URL_ERR_BADURL		0x05	/* URL is bad */
836 #define LDAP_URL_ERR_BADHOST	0x06	/* host port is bad */
837 #define LDAP_URL_ERR_BADATTRS	0x07	/* bad (or missing) attributes */
838 #define LDAP_URL_ERR_BADSCOPE	0x08	/* scope string is invalid (or missing) */
839 #define LDAP_URL_ERR_BADFILTER	0x09	/* bad or missing filter */
840 #define LDAP_URL_ERR_BADEXTS	0x0a	/* bad or missing extensions */
841 
842 /*
843  * LDAP sync (RFC4533) API
844  */
845 
846 typedef struct ldap_sync_t ldap_sync_t;
847 
848 typedef enum {
849 	/* these are private - the client should never see them */
850 	LDAP_SYNC_CAPI_NONE		= -1,
851 
852 	LDAP_SYNC_CAPI_PHASE_FLAG	= 0x10U,
853 	LDAP_SYNC_CAPI_IDSET_FLAG	= 0x20U,
854 	LDAP_SYNC_CAPI_DONE_FLAG	= 0x40U,
855 
856 	/* these are passed to ls_search_entry() */
857 	LDAP_SYNC_CAPI_PRESENT		= LDAP_SYNC_PRESENT,
858 	LDAP_SYNC_CAPI_ADD		= LDAP_SYNC_ADD,
859 	LDAP_SYNC_CAPI_MODIFY		= LDAP_SYNC_MODIFY,
860 	LDAP_SYNC_CAPI_DELETE		= LDAP_SYNC_DELETE,
861 
862 	/* these are passed to ls_intermediate() */
863 	LDAP_SYNC_CAPI_PRESENTS		= ( LDAP_SYNC_CAPI_PHASE_FLAG | LDAP_SYNC_CAPI_PRESENT ),
864 	LDAP_SYNC_CAPI_DELETES		= ( LDAP_SYNC_CAPI_PHASE_FLAG | LDAP_SYNC_CAPI_DELETE ),
865 
866 	LDAP_SYNC_CAPI_PRESENTS_IDSET	= ( LDAP_SYNC_CAPI_PRESENTS | LDAP_SYNC_CAPI_IDSET_FLAG ),
867 	LDAP_SYNC_CAPI_DELETES_IDSET	= ( LDAP_SYNC_CAPI_DELETES | LDAP_SYNC_CAPI_IDSET_FLAG ),
868 
869 	LDAP_SYNC_CAPI_DONE		= ( LDAP_SYNC_CAPI_DONE_FLAG | LDAP_SYNC_CAPI_PRESENTS )
870 } ldap_sync_refresh_t;
871 
872 /*
873  * Called when an entry is returned by ldap_result().
874  * If phase is LDAP_SYNC_CAPI_ADD or LDAP_SYNC_CAPI_MODIFY,
875  * the entry has been either added or modified, and thus
876  * the complete view of the entry should be in the LDAPMessage.
877  * If phase is LDAP_SYNC_CAPI_PRESENT or LDAP_SYNC_CAPI_DELETE,
878  * only the DN should be in the LDAPMessage.
879  */
880 typedef int (*ldap_sync_search_entry_f) LDAP_P((
881 	ldap_sync_t			*ls,
882 	LDAPMessage			*msg,
883 	struct berval			*entryUUID,
884 	ldap_sync_refresh_t		phase ));
885 
886 /*
887  * Called when a reference is returned; the client should know
888  * what to do with it.
889  */
890 typedef int (*ldap_sync_search_reference_f) LDAP_P((
891 	ldap_sync_t			*ls,
892 	LDAPMessage			*msg ));
893 
894 /*
895  * Called when specific intermediate/final messages are returned.
896  * If phase is LDAP_SYNC_CAPI_PRESENTS or LDAP_SYNC_CAPI_DELETES,
897  * a "presents" or "deletes" phase begins.
898  * If phase is LDAP_SYNC_CAPI_DONE, a special "presents" phase
899  * with refreshDone set to "TRUE" has been returned, to indicate
900  * that the refresh phase of a refreshAndPersist is complete.
901  * In the above cases, syncUUIDs is NULL.
902  *
903  * If phase is LDAP_SYNC_CAPI_PRESENTS_IDSET or
904  * LDAP_SYNC_CAPI_DELETES_IDSET, syncUUIDs is an array of UUIDs
905  * that are either present or have been deleted.
906  */
907 typedef int (*ldap_sync_intermediate_f) LDAP_P((
908 	ldap_sync_t			*ls,
909 	LDAPMessage			*msg,
910 	BerVarray			syncUUIDs,
911 	ldap_sync_refresh_t		phase ));
912 
913 /*
914  * Called when a searchResultDone is returned.  In refreshAndPersist,
915  * this can only occur if the search for any reason is being terminated
916  * by the server.
917  */
918 typedef int (*ldap_sync_search_result_f) LDAP_P((
919 	ldap_sync_t			*ls,
920 	LDAPMessage			*msg,
921 	int				refreshDeletes ));
922 
923 /*
924  * This structure contains all information about the persistent search;
925  * the caller is responsible for connecting, setting version, binding, tls...
926  */
927 struct ldap_sync_t {
928 	/* conf search params */
929 	char				*ls_base;
930 	int				ls_scope;
931 	char				*ls_filter;
932 	char				**ls_attrs;
933 	int				ls_timelimit;
934 	int				ls_sizelimit;
935 
936 	/* poll timeout */
937 	int				ls_timeout;
938 
939 	/* helpers - add as appropriate */
940 	ldap_sync_search_entry_f	ls_search_entry;
941 	ldap_sync_search_reference_f	ls_search_reference;
942 	ldap_sync_intermediate_f	ls_intermediate;
943 	ldap_sync_search_result_f	ls_search_result;
944 
945 	/* set by the caller as appropriate */
946 	void				*ls_private;
947 
948 	/* conn stuff */
949 	LDAP				*ls_ld;
950 
951 	/* --- the parameters below are private - do not modify --- */
952 
953 	/* FIXME: make the structure opaque, and provide an interface
954 	 * to modify the public values? */
955 
956 	/* result stuff */
957 	int				ls_msgid;
958 
959 	/* sync stuff */
960 	/* needed by refreshOnly */
961 	int				ls_reloadHint;
962 
963 	/* opaque - need to pass between sessions, updated by the API */
964 	struct berval			ls_cookie;
965 
966 	/* state variable - do not modify */
967 	ldap_sync_refresh_t		ls_refreshPhase;
968 };
969 
970 /*
971  * End of LDAP sync (RFC4533) API
972  */
973 
974 /*
975  * Connection callbacks...
976  */
977 struct ldap_conncb;
978 struct sockaddr;
979 
980 /* Called after a connection is established */
981 typedef int (ldap_conn_add_f) LDAP_P(( LDAP *ld, Sockbuf *sb, LDAPURLDesc *srv, struct sockaddr *addr,
982 	struct ldap_conncb *ctx ));
983 /* Called before a connection is closed */
984 typedef void (ldap_conn_del_f) LDAP_P(( LDAP *ld, Sockbuf *sb, struct ldap_conncb *ctx ));
985 
986 /* Callbacks are pushed on a stack. Last one pushed is first one executed. The
987  * delete callback is called with a NULL Sockbuf just before freeing the LDAP handle.
988  */
989 typedef struct ldap_conncb {
990 	ldap_conn_add_f *lc_add;
991 	ldap_conn_del_f *lc_del;
992 	void *lc_arg;
993 } ldap_conncb;
994 
995 /*
996  * The API draft spec says we should declare (or cause to be declared)
997  * 'struct timeval'.   We don't.  See IETF LDAPext discussions.
998  */
999 struct timeval;
1000 
1001 /*
1002  * in options.c:
1003  */
1004 LDAP_F( int )
1005 ldap_get_option LDAP_P((
1006 	LDAP *ld,
1007 	int option,
1008 	void *outvalue));
1009 
1010 LDAP_F( int )
1011 ldap_set_option LDAP_P((
1012 	LDAP *ld,
1013 	int option,
1014 	LDAP_CONST void *invalue));
1015 
1016 /* V3 REBIND Function Callback Prototype */
1017 typedef int (LDAP_REBIND_PROC) LDAP_P((
1018 	LDAP *ld, LDAP_CONST char *url,
1019 	ber_tag_t request, ber_int_t msgid,
1020 	void *params ));
1021 
1022 LDAP_F( int )
1023 ldap_set_rebind_proc LDAP_P((
1024 	LDAP *ld,
1025 	LDAP_REBIND_PROC *rebind_proc,
1026 	void *params ));
1027 
1028 /* V3 referral selection Function Callback Prototype */
1029 typedef int (LDAP_NEXTREF_PROC) LDAP_P((
1030 	LDAP *ld, char ***refsp, int *cntp,
1031 	void *params ));
1032 
1033 LDAP_F( int )
1034 ldap_set_nextref_proc LDAP_P((
1035 	LDAP *ld,
1036 	LDAP_NEXTREF_PROC *nextref_proc,
1037 	void *params ));
1038 
1039 /* V3 URLLIST Function Callback Prototype */
1040 typedef int (LDAP_URLLIST_PROC) LDAP_P((
1041 	LDAP *ld,
1042 	LDAPURLDesc **urllist,
1043 	LDAPURLDesc **url,
1044 	void *params ));
1045 
1046 LDAP_F( int )
1047 ldap_set_urllist_proc LDAP_P((
1048 	LDAP *ld,
1049 	LDAP_URLLIST_PROC *urllist_proc,
1050 	void *params ));
1051 
1052 /*
1053  * in controls.c:
1054  */
1055 #if LDAP_DEPRECATED
1056 LDAP_F( int )
1057 ldap_create_control LDAP_P((	/* deprecated, use ldap_control_create */
1058 	LDAP_CONST char *requestOID,
1059 	BerElement *ber,
1060 	int iscritical,
1061 	LDAPControl **ctrlp ));
1062 
1063 LDAP_F( LDAPControl * )
1064 ldap_find_control LDAP_P((	/* deprecated, use ldap_control_find */
1065 	LDAP_CONST char *oid,
1066 	LDAPControl **ctrls ));
1067 #endif
1068 
1069 LDAP_F( int )
1070 ldap_control_create LDAP_P((
1071 	LDAP_CONST char *requestOID,
1072 	int iscritical,
1073 	struct berval *value,
1074 	int dupval,
1075 	LDAPControl **ctrlp ));
1076 
1077 LDAP_F( LDAPControl * )
1078 ldap_control_find LDAP_P((
1079 	LDAP_CONST char *oid,
1080 	LDAPControl **ctrls,
1081 	LDAPControl ***nextctrlp ));
1082 
1083 LDAP_F( void )
1084 ldap_control_free LDAP_P((
1085 	LDAPControl *ctrl ));
1086 
1087 LDAP_F( void )
1088 ldap_controls_free LDAP_P((
1089 	LDAPControl **ctrls ));
1090 
1091 LDAP_F( LDAPControl ** )
1092 ldap_controls_dup LDAP_P((
1093 	LDAPControl *LDAP_CONST *controls ));
1094 
1095 LDAP_F( LDAPControl * )
1096 ldap_control_dup LDAP_P((
1097 	LDAP_CONST LDAPControl *c ));
1098 
1099 /*
1100  * in dnssrv.c:
1101  */
1102 LDAP_F( int )
1103 ldap_domain2dn LDAP_P((
1104 	LDAP_CONST char* domain,
1105 	char** dn ));
1106 
1107 LDAP_F( int )
1108 ldap_dn2domain LDAP_P((
1109 	LDAP_CONST char* dn,
1110 	char** domain ));
1111 
1112 LDAP_F( int )
1113 ldap_domain2hostlist LDAP_P((
1114 	LDAP_CONST char *domain,
1115 	char** hostlist ));
1116 
1117 /*
1118  * in extended.c:
1119  */
1120 LDAP_F( int )
1121 ldap_extended_operation LDAP_P((
1122 	LDAP			*ld,
1123 	LDAP_CONST char	*reqoid,
1124 	struct berval	*reqdata,
1125 	LDAPControl		**serverctrls,
1126 	LDAPControl		**clientctrls,
1127 	int				*msgidp ));
1128 
1129 LDAP_F( int )
1130 ldap_extended_operation_s LDAP_P((
1131 	LDAP			*ld,
1132 	LDAP_CONST char	*reqoid,
1133 	struct berval	*reqdata,
1134 	LDAPControl		**serverctrls,
1135 	LDAPControl		**clientctrls,
1136 	char			**retoidp,
1137 	struct berval	**retdatap ));
1138 
1139 LDAP_F( int )
1140 ldap_parse_extended_result LDAP_P((
1141 	LDAP			*ld,
1142 	LDAPMessage		*res,
1143 	char			**retoidp,
1144 	struct berval	**retdatap,
1145 	int				freeit ));
1146 
1147 LDAP_F( int )
1148 ldap_parse_intermediate LDAP_P((
1149 	LDAP			*ld,
1150 	LDAPMessage		*res,
1151 	char			**retoidp,
1152 	struct berval	**retdatap,
1153 	LDAPControl		***serverctrls,
1154 	int				freeit ));
1155 
1156 
1157 /*
1158  * in abandon.c:
1159  */
1160 LDAP_F( int )
1161 ldap_abandon_ext LDAP_P((
1162 	LDAP			*ld,
1163 	int				msgid,
1164 	LDAPControl		**serverctrls,
1165 	LDAPControl		**clientctrls ));
1166 
1167 #if LDAP_DEPRECATED
1168 LDAP_F( int )
1169 ldap_abandon LDAP_P((	/* deprecated, use ldap_abandon_ext */
1170 	LDAP *ld,
1171 	int msgid ));
1172 #endif
1173 
1174 /*
1175  * in add.c:
1176  */
1177 LDAP_F( int )
1178 ldap_add_ext LDAP_P((
1179 	LDAP			*ld,
1180 	LDAP_CONST char	*dn,
1181 	LDAPMod			**attrs,
1182 	LDAPControl		**serverctrls,
1183 	LDAPControl		**clientctrls,
1184 	int 			*msgidp ));
1185 
1186 LDAP_F( int )
1187 ldap_add_ext_s LDAP_P((
1188 	LDAP			*ld,
1189 	LDAP_CONST char	*dn,
1190 	LDAPMod			**attrs,
1191 	LDAPControl		**serverctrls,
1192 	LDAPControl		**clientctrls ));
1193 
1194 #if LDAP_DEPRECATED
1195 LDAP_F( int )
1196 ldap_add LDAP_P((	/* deprecated, use ldap_add_ext */
1197 	LDAP *ld,
1198 	LDAP_CONST char *dn,
1199 	LDAPMod **attrs ));
1200 
1201 LDAP_F( int )
1202 ldap_add_s LDAP_P((	/* deprecated, use ldap_add_ext_s */
1203 	LDAP *ld,
1204 	LDAP_CONST char *dn,
1205 	LDAPMod **attrs ));
1206 #endif
1207 
1208 
1209 /*
1210  * in sasl.c:
1211  */
1212 LDAP_F( int )
1213 ldap_sasl_bind LDAP_P((
1214 	LDAP			*ld,
1215 	LDAP_CONST char	*dn,
1216 	LDAP_CONST char	*mechanism,
1217 	struct berval	*cred,
1218 	LDAPControl		**serverctrls,
1219 	LDAPControl		**clientctrls,
1220 	int				*msgidp ));
1221 
1222 /* Interaction flags (should be passed about in a control)
1223  *  Automatic (default): use defaults, prompt otherwise
1224  *  Interactive: prompt always
1225  *  Quiet: never prompt
1226  */
1227 #define LDAP_SASL_AUTOMATIC		0U
1228 #define LDAP_SASL_INTERACTIVE	1U
1229 #define LDAP_SASL_QUIET			2U
1230 
1231 /*
1232  * V3 SASL Interaction Function Callback Prototype
1233  *	when using Cyrus SASL, interact is pointer to sasl_interact_t
1234  *  should likely passed in a control (and provided controls)
1235  */
1236 typedef int (LDAP_SASL_INTERACT_PROC) LDAP_P((
1237 	LDAP *ld, unsigned flags, void* defaults, void *interact ));
1238 
1239 LDAP_F( int )
1240 ldap_sasl_interactive_bind LDAP_P((
1241 	LDAP *ld,
1242 	LDAP_CONST char *dn, /* usually NULL */
1243 	LDAP_CONST char *saslMechanism,
1244 	LDAPControl **serverControls,
1245 	LDAPControl **clientControls,
1246 
1247 	/* should be client controls */
1248 	unsigned flags,
1249 	LDAP_SASL_INTERACT_PROC *proc,
1250 	void *defaults,
1251 
1252 	/* as obtained from ldap_result() */
1253 	LDAPMessage *result,
1254 
1255 	/* returned during bind processing */
1256 	const char **rmech,
1257 	int *msgid ));
1258 
1259 LDAP_F( int )
1260 ldap_sasl_interactive_bind_s LDAP_P((
1261 	LDAP *ld,
1262 	LDAP_CONST char *dn, /* usually NULL */
1263 	LDAP_CONST char *saslMechanism,
1264 	LDAPControl **serverControls,
1265 	LDAPControl **clientControls,
1266 
1267 	/* should be client controls */
1268 	unsigned flags,
1269 	LDAP_SASL_INTERACT_PROC *proc,
1270 	void *defaults ));
1271 
1272 LDAP_F( int )
1273 ldap_sasl_bind_s LDAP_P((
1274 	LDAP			*ld,
1275 	LDAP_CONST char	*dn,
1276 	LDAP_CONST char	*mechanism,
1277 	struct berval	*cred,
1278 	LDAPControl		**serverctrls,
1279 	LDAPControl		**clientctrls,
1280 	struct berval	**servercredp ));
1281 
1282 LDAP_F( int )
1283 ldap_parse_sasl_bind_result LDAP_P((
1284 	LDAP			*ld,
1285 	LDAPMessage		*res,
1286 	struct berval	**servercredp,
1287 	int				freeit ));
1288 
1289 #if LDAP_DEPRECATED
1290 /*
1291  * in bind.c:
1292  *	(deprecated)
1293  */
1294 LDAP_F( int )
1295 ldap_bind LDAP_P((	/* deprecated, use ldap_sasl_bind */
1296 	LDAP *ld,
1297 	LDAP_CONST char *who,
1298 	LDAP_CONST char *passwd,
1299 	int authmethod ));
1300 
1301 LDAP_F( int )
1302 ldap_bind_s LDAP_P((	/* deprecated, use ldap_sasl_bind_s */
1303 	LDAP *ld,
1304 	LDAP_CONST char *who,
1305 	LDAP_CONST char *cred,
1306 	int authmethod ));
1307 
1308 /*
1309  * in sbind.c:
1310  */
1311 LDAP_F( int )
1312 ldap_simple_bind LDAP_P(( /* deprecated, use ldap_sasl_bind */
1313 	LDAP *ld,
1314 	LDAP_CONST char *who,
1315 	LDAP_CONST char *passwd ));
1316 
1317 LDAP_F( int )
1318 ldap_simple_bind_s LDAP_P(( /* deprecated, use ldap_sasl_bind_s */
1319 	LDAP *ld,
1320 	LDAP_CONST char *who,
1321 	LDAP_CONST char *passwd ));
1322 
1323 #endif
1324 
1325 
1326 /*
1327  * in compare.c:
1328  */
1329 LDAP_F( int )
1330 ldap_compare_ext LDAP_P((
1331 	LDAP			*ld,
1332 	LDAP_CONST char	*dn,
1333 	LDAP_CONST char	*attr,
1334 	struct berval	*bvalue,
1335 	LDAPControl		**serverctrls,
1336 	LDAPControl		**clientctrls,
1337 	int 			*msgidp ));
1338 
1339 LDAP_F( int )
1340 ldap_compare_ext_s LDAP_P((
1341 	LDAP			*ld,
1342 	LDAP_CONST char	*dn,
1343 	LDAP_CONST char	*attr,
1344 	struct berval	*bvalue,
1345 	LDAPControl		**serverctrls,
1346 	LDAPControl		**clientctrls ));
1347 
1348 #if LDAP_DEPRECATED
1349 LDAP_F( int )
1350 ldap_compare LDAP_P((	/* deprecated, use ldap_compare_ext */
1351 	LDAP *ld,
1352 	LDAP_CONST char *dn,
1353 	LDAP_CONST char *attr,
1354 	LDAP_CONST char *value ));
1355 
1356 LDAP_F( int )
1357 ldap_compare_s LDAP_P((	/* deprecated, use ldap_compare_ext_s */
1358 	LDAP *ld,
1359 	LDAP_CONST char *dn,
1360 	LDAP_CONST char *attr,
1361 	LDAP_CONST char *value ));
1362 #endif
1363 
1364 
1365 /*
1366  * in delete.c:
1367  */
1368 LDAP_F( int )
1369 ldap_delete_ext LDAP_P((
1370 	LDAP			*ld,
1371 	LDAP_CONST char	*dn,
1372 	LDAPControl		**serverctrls,
1373 	LDAPControl		**clientctrls,
1374 	int 			*msgidp ));
1375 
1376 LDAP_F( int )
1377 ldap_delete_ext_s LDAP_P((
1378 	LDAP			*ld,
1379 	LDAP_CONST char	*dn,
1380 	LDAPControl		**serverctrls,
1381 	LDAPControl		**clientctrls ));
1382 
1383 #if LDAP_DEPRECATED
1384 LDAP_F( int )
1385 ldap_delete LDAP_P((	/* deprecated, use ldap_delete_ext */
1386 	LDAP *ld,
1387 	LDAP_CONST char *dn ));
1388 
1389 LDAP_F( int )
1390 ldap_delete_s LDAP_P((	/* deprecated, use ldap_delete_ext_s */
1391 	LDAP *ld,
1392 	LDAP_CONST char *dn ));
1393 #endif
1394 
1395 
1396 /*
1397  * in error.c:
1398  */
1399 LDAP_F( int )
1400 ldap_parse_result LDAP_P((
1401 	LDAP			*ld,
1402 	LDAPMessage		*res,
1403 	int				*errcodep,
1404 	char			**matcheddnp,
1405 	char			**diagmsgp,
1406 	char			***referralsp,
1407 	LDAPControl		***serverctrls,
1408 	int				freeit ));
1409 
1410 LDAP_F( char * )
1411 ldap_err2string LDAP_P((
1412 	int err ));
1413 
1414 #if LDAP_DEPRECATED
1415 LDAP_F( int )
1416 ldap_result2error LDAP_P((	/* deprecated, use ldap_parse_result */
1417 	LDAP *ld,
1418 	LDAPMessage *r,
1419 	int freeit ));
1420 
1421 LDAP_F( void )
1422 ldap_perror LDAP_P((	/* deprecated, use ldap_err2string */
1423 	LDAP *ld,
1424 	LDAP_CONST char *s ));
1425 #endif
1426 
1427 /*
1428  * gssapi.c:
1429  */
1430 LDAP_F( int )
1431 ldap_gssapi_bind LDAP_P((
1432 	LDAP *ld,
1433 	LDAP_CONST char *dn,
1434 	LDAP_CONST char *creds ));
1435 
1436 LDAP_F( int )
1437 ldap_gssapi_bind_s LDAP_P((
1438 	LDAP *ld,
1439 	LDAP_CONST char *dn,
1440 	LDAP_CONST char *creds ));
1441 
1442 
1443 /*
1444  * in modify.c:
1445  */
1446 LDAP_F( int )
1447 ldap_modify_ext LDAP_P((
1448 	LDAP			*ld,
1449 	LDAP_CONST char	*dn,
1450 	LDAPMod			**mods,
1451 	LDAPControl		**serverctrls,
1452 	LDAPControl		**clientctrls,
1453 	int 			*msgidp ));
1454 
1455 LDAP_F( int )
1456 ldap_modify_ext_s LDAP_P((
1457 	LDAP			*ld,
1458 	LDAP_CONST char	*dn,
1459 	LDAPMod			**mods,
1460 	LDAPControl		**serverctrls,
1461 	LDAPControl		**clientctrls ));
1462 
1463 #if LDAP_DEPRECATED
1464 LDAP_F( int )
1465 ldap_modify LDAP_P((	/* deprecated, use ldap_modify_ext */
1466 	LDAP *ld,
1467 	LDAP_CONST char *dn,
1468 	LDAPMod **mods ));
1469 
1470 LDAP_F( int )
1471 ldap_modify_s LDAP_P((	/* deprecated, use ldap_modify_ext_s */
1472 	LDAP *ld,
1473 	LDAP_CONST char *dn,
1474 	LDAPMod **mods ));
1475 #endif
1476 
1477 
1478 /*
1479  * in modrdn.c:
1480  */
1481 LDAP_F( int )
1482 ldap_rename LDAP_P((
1483 	LDAP *ld,
1484 	LDAP_CONST char *dn,
1485 	LDAP_CONST char *newrdn,
1486 	LDAP_CONST char *newSuperior,
1487 	int deleteoldrdn,
1488 	LDAPControl **sctrls,
1489 	LDAPControl **cctrls,
1490 	int *msgidp ));
1491 
1492 LDAP_F( int )
1493 ldap_rename_s LDAP_P((
1494 	LDAP *ld,
1495 	LDAP_CONST char *dn,
1496 	LDAP_CONST char *newrdn,
1497 	LDAP_CONST char *newSuperior,
1498 	int deleteoldrdn,
1499 	LDAPControl **sctrls,
1500 	LDAPControl **cctrls ));
1501 
1502 #if LDAP_DEPRECATED
1503 LDAP_F( int )
1504 ldap_rename2 LDAP_P((	/* deprecated, use ldap_rename */
1505 	LDAP *ld,
1506 	LDAP_CONST char *dn,
1507 	LDAP_CONST char *newrdn,
1508 	LDAP_CONST char *newSuperior,
1509 	int deleteoldrdn ));
1510 
1511 LDAP_F( int )
1512 ldap_rename2_s LDAP_P((	/* deprecated, use ldap_rename_s */
1513 	LDAP *ld,
1514 	LDAP_CONST char *dn,
1515 	LDAP_CONST char *newrdn,
1516 	LDAP_CONST char *newSuperior,
1517 	int deleteoldrdn ));
1518 
1519 LDAP_F( int )
1520 ldap_modrdn LDAP_P((	/* deprecated, use ldap_rename */
1521 	LDAP *ld,
1522 	LDAP_CONST char *dn,
1523 	LDAP_CONST char *newrdn ));
1524 
1525 LDAP_F( int )
1526 ldap_modrdn_s LDAP_P((	/* deprecated, use ldap_rename_s */
1527 	LDAP *ld,
1528 	LDAP_CONST char *dn,
1529 	LDAP_CONST char *newrdn ));
1530 
1531 LDAP_F( int )
1532 ldap_modrdn2 LDAP_P((	/* deprecated, use ldap_rename */
1533 	LDAP *ld,
1534 	LDAP_CONST char *dn,
1535 	LDAP_CONST char *newrdn,
1536 	int deleteoldrdn ));
1537 
1538 LDAP_F( int )
1539 ldap_modrdn2_s LDAP_P((	/* deprecated, use ldap_rename_s */
1540 	LDAP *ld,
1541 	LDAP_CONST char *dn,
1542 	LDAP_CONST char *newrdn,
1543 	int deleteoldrdn));
1544 #endif
1545 
1546 
1547 /*
1548  * in open.c:
1549  */
1550 #if LDAP_DEPRECATED
1551 LDAP_F( LDAP * )
1552 ldap_init LDAP_P(( /* deprecated, use ldap_create or ldap_initialize */
1553 	LDAP_CONST char *host,
1554 	int port ));
1555 
1556 LDAP_F( LDAP * )
1557 ldap_open LDAP_P((	/* deprecated, use ldap_create or ldap_initialize */
1558 	LDAP_CONST char *host,
1559 	int port ));
1560 #endif
1561 
1562 LDAP_F( int )
1563 ldap_create LDAP_P((
1564 	LDAP **ldp ));
1565 
1566 LDAP_F( int )
1567 ldap_initialize LDAP_P((
1568 	LDAP **ldp,
1569 	LDAP_CONST char *url ));
1570 
1571 LDAP_F( LDAP * )
1572 ldap_dup LDAP_P((
1573 	LDAP *old ));
1574 
1575 LDAP_F( int )
1576 ldap_connect( LDAP *ld );
1577 
1578 /*
1579  * in tls.c
1580  */
1581 
1582 LDAP_F( int )
1583 ldap_tls_inplace LDAP_P((
1584 	LDAP *ld ));
1585 
1586 LDAP_F( int )
1587 ldap_start_tls LDAP_P((
1588 	LDAP *ld,
1589 	LDAPControl **serverctrls,
1590 	LDAPControl **clientctrls,
1591 	int *msgidp ));
1592 
1593 LDAP_F( int )
1594 ldap_install_tls LDAP_P((
1595 	LDAP *ld ));
1596 
1597 LDAP_F( int )
1598 ldap_start_tls_s LDAP_P((
1599 	LDAP *ld,
1600 	LDAPControl **serverctrls,
1601 	LDAPControl **clientctrls ));
1602 
1603 /*
1604  * in messages.c:
1605  */
1606 LDAP_F( LDAPMessage * )
1607 ldap_first_message LDAP_P((
1608 	LDAP *ld,
1609 	LDAPMessage *chain ));
1610 
1611 LDAP_F( LDAPMessage * )
1612 ldap_next_message LDAP_P((
1613 	LDAP *ld,
1614 	LDAPMessage *msg ));
1615 
1616 LDAP_F( int )
1617 ldap_count_messages LDAP_P((
1618 	LDAP *ld,
1619 	LDAPMessage *chain ));
1620 
1621 /*
1622  * in references.c:
1623  */
1624 LDAP_F( LDAPMessage * )
1625 ldap_first_reference LDAP_P((
1626 	LDAP *ld,
1627 	LDAPMessage *chain ));
1628 
1629 LDAP_F( LDAPMessage * )
1630 ldap_next_reference LDAP_P((
1631 	LDAP *ld,
1632 	LDAPMessage *ref ));
1633 
1634 LDAP_F( int )
1635 ldap_count_references LDAP_P((
1636 	LDAP *ld,
1637 	LDAPMessage *chain ));
1638 
1639 LDAP_F( int )
1640 ldap_parse_reference LDAP_P((
1641 	LDAP			*ld,
1642 	LDAPMessage		*ref,
1643 	char			***referralsp,
1644 	LDAPControl		***serverctrls,
1645 	int				freeit));
1646 
1647 
1648 /*
1649  * in getentry.c:
1650  */
1651 LDAP_F( LDAPMessage * )
1652 ldap_first_entry LDAP_P((
1653 	LDAP *ld,
1654 	LDAPMessage *chain ));
1655 
1656 LDAP_F( LDAPMessage * )
1657 ldap_next_entry LDAP_P((
1658 	LDAP *ld,
1659 	LDAPMessage *entry ));
1660 
1661 LDAP_F( int )
1662 ldap_count_entries LDAP_P((
1663 	LDAP *ld,
1664 	LDAPMessage *chain ));
1665 
1666 LDAP_F( int )
1667 ldap_get_entry_controls LDAP_P((
1668 	LDAP			*ld,
1669 	LDAPMessage		*entry,
1670 	LDAPControl		***serverctrls));
1671 
1672 
1673 /*
1674  * in addentry.c
1675  */
1676 LDAP_F( LDAPMessage * )
1677 ldap_delete_result_entry LDAP_P((
1678 	LDAPMessage **list,
1679 	LDAPMessage *e ));
1680 
1681 LDAP_F( void )
1682 ldap_add_result_entry LDAP_P((
1683 	LDAPMessage **list,
1684 	LDAPMessage *e ));
1685 
1686 
1687 /*
1688  * in getdn.c
1689  */
1690 LDAP_F( char * )
1691 ldap_get_dn LDAP_P((
1692 	LDAP *ld,
1693 	LDAPMessage *entry ));
1694 
1695 typedef struct ldap_ava {
1696 	struct berval la_attr;
1697 	struct berval la_value;
1698 	unsigned la_flags;
1699 #define LDAP_AVA_NULL				0x0000U
1700 #define LDAP_AVA_STRING				0x0001U
1701 #define LDAP_AVA_BINARY				0x0002U
1702 #define LDAP_AVA_NONPRINTABLE		0x0004U
1703 #define LDAP_AVA_FREE_ATTR			0x0010U
1704 #define LDAP_AVA_FREE_VALUE			0x0020U
1705 
1706 	void *la_private;
1707 } LDAPAVA;
1708 
1709 typedef LDAPAVA** LDAPRDN;
1710 typedef LDAPRDN* LDAPDN;
1711 
1712 /* DN formats */
1713 #define LDAP_DN_FORMAT_LDAP			0x0000U
1714 #define LDAP_DN_FORMAT_LDAPV3		0x0010U
1715 #define LDAP_DN_FORMAT_LDAPV2		0x0020U
1716 #define LDAP_DN_FORMAT_DCE			0x0030U
1717 #define LDAP_DN_FORMAT_UFN			0x0040U	/* dn2str only */
1718 #define LDAP_DN_FORMAT_AD_CANONICAL	0x0050U	/* dn2str only */
1719 #define LDAP_DN_FORMAT_LBER			0x00F0U /* for testing only */
1720 #define LDAP_DN_FORMAT_MASK			0x00F0U
1721 
1722 /* DN flags */
1723 #define LDAP_DN_PRETTY				0x0100U
1724 #define LDAP_DN_SKIP				0x0200U
1725 #define LDAP_DN_P_NOLEADTRAILSPACES	0x1000U
1726 #define LDAP_DN_P_NOSPACEAFTERRDN	0x2000U
1727 #define LDAP_DN_PEDANTIC			0xF000U
1728 
1729 LDAP_F( void ) ldap_rdnfree LDAP_P(( LDAPRDN rdn ));
1730 LDAP_F( void ) ldap_dnfree LDAP_P(( LDAPDN dn ));
1731 
1732 LDAP_F( int )
1733 ldap_bv2dn LDAP_P((
1734 	struct berval *bv,
1735 	LDAPDN *dn,
1736 	unsigned flags ));
1737 
1738 LDAP_F( int )
1739 ldap_str2dn LDAP_P((
1740 	LDAP_CONST char *str,
1741 	LDAPDN *dn,
1742 	unsigned flags ));
1743 
1744 LDAP_F( int )
1745 ldap_dn2bv LDAP_P((
1746 	LDAPDN dn,
1747 	struct berval *bv,
1748 	unsigned flags ));
1749 
1750 LDAP_F( int )
1751 ldap_dn2str LDAP_P((
1752 	LDAPDN dn,
1753 	char **str,
1754 	unsigned flags ));
1755 
1756 LDAP_F( int )
1757 ldap_bv2rdn LDAP_P((
1758 	struct berval *bv,
1759 	LDAPRDN *rdn,
1760 	char **next,
1761 	unsigned flags ));
1762 
1763 LDAP_F( int )
1764 ldap_str2rdn LDAP_P((
1765 	LDAP_CONST char *str,
1766 	LDAPRDN *rdn,
1767 	char **next,
1768 	unsigned flags ));
1769 
1770 LDAP_F( int )
1771 ldap_rdn2bv LDAP_P((
1772 	LDAPRDN rdn,
1773 	struct berval *bv,
1774 	unsigned flags ));
1775 
1776 LDAP_F( int )
1777 ldap_rdn2str LDAP_P((
1778 	LDAPRDN rdn,
1779 	char **str,
1780 	unsigned flags ));
1781 
1782 LDAP_F( int )
1783 ldap_dn_normalize LDAP_P((
1784 	LDAP_CONST char *in, unsigned iflags,
1785 	char **out, unsigned oflags ));
1786 
1787 LDAP_F( char * )
1788 ldap_dn2ufn LDAP_P(( /* deprecated, use ldap_str2dn/dn2str */
1789 	LDAP_CONST char *dn ));
1790 
1791 LDAP_F( char ** )
1792 ldap_explode_dn LDAP_P(( /* deprecated, ldap_str2dn */
1793 	LDAP_CONST char *dn,
1794 	int notypes ));
1795 
1796 LDAP_F( char ** )
1797 ldap_explode_rdn LDAP_P(( /* deprecated, ldap_str2rdn */
1798 	LDAP_CONST char *rdn,
1799 	int notypes ));
1800 
1801 typedef int LDAPDN_rewrite_func
1802 	LDAP_P(( LDAPDN dn, unsigned flags, void *ctx ));
1803 
1804 LDAP_F( int )
1805 ldap_X509dn2bv LDAP_P(( void *x509_name, struct berval *dn,
1806 	LDAPDN_rewrite_func *func, unsigned flags ));
1807 
1808 LDAP_F( char * )
1809 ldap_dn2dcedn LDAP_P(( /* deprecated, ldap_str2dn/dn2str */
1810 	LDAP_CONST char *dn ));
1811 
1812 LDAP_F( char * )
1813 ldap_dcedn2dn LDAP_P(( /* deprecated, ldap_str2dn/dn2str */
1814 	LDAP_CONST char *dce ));
1815 
1816 LDAP_F( char * )
1817 ldap_dn2ad_canonical LDAP_P(( /* deprecated, ldap_str2dn/dn2str */
1818 	LDAP_CONST char *dn ));
1819 
1820 LDAP_F( int )
1821 ldap_get_dn_ber LDAP_P((
1822 	LDAP *ld, LDAPMessage *e, BerElement **berout, struct berval *dn ));
1823 
1824 LDAP_F( int )
1825 ldap_get_attribute_ber LDAP_P((
1826 	LDAP *ld, LDAPMessage *e, BerElement *ber, struct berval *attr,
1827 	struct berval **vals ));
1828 
1829 /*
1830  * in getattr.c
1831  */
1832 LDAP_F( char * )
1833 ldap_first_attribute LDAP_P((
1834 	LDAP *ld,
1835 	LDAPMessage *entry,
1836 	BerElement **ber ));
1837 
1838 LDAP_F( char * )
1839 ldap_next_attribute LDAP_P((
1840 	LDAP *ld,
1841 	LDAPMessage *entry,
1842 	BerElement *ber ));
1843 
1844 
1845 /*
1846  * in getvalues.c
1847  */
1848 LDAP_F( struct berval ** )
1849 ldap_get_values_len LDAP_P((
1850 	LDAP *ld,
1851 	LDAPMessage *entry,
1852 	LDAP_CONST char *target ));
1853 
1854 LDAP_F( int )
1855 ldap_count_values_len LDAP_P((
1856 	struct berval **vals ));
1857 
1858 LDAP_F( void )
1859 ldap_value_free_len LDAP_P((
1860 	struct berval **vals ));
1861 
1862 #if LDAP_DEPRECATED
1863 LDAP_F( char ** )
1864 ldap_get_values LDAP_P((	/* deprecated, use ldap_get_values_len */
1865 	LDAP *ld,
1866 	LDAPMessage *entry,
1867 	LDAP_CONST char *target ));
1868 
1869 LDAP_F( int )
1870 ldap_count_values LDAP_P((	/* deprecated, use ldap_count_values_len */
1871 	char **vals ));
1872 
1873 LDAP_F( void )
1874 ldap_value_free LDAP_P((	/* deprecated, use ldap_value_free_len */
1875 	char **vals ));
1876 #endif
1877 
1878 /*
1879  * in result.c:
1880  */
1881 LDAP_F( int )
1882 ldap_result LDAP_P((
1883 	LDAP *ld,
1884 	int msgid,
1885 	int all,
1886 	struct timeval *timeout,
1887 	LDAPMessage **result ));
1888 
1889 LDAP_F( int )
1890 ldap_msgtype LDAP_P((
1891 	LDAPMessage *lm ));
1892 
1893 LDAP_F( int )
1894 ldap_msgid   LDAP_P((
1895 	LDAPMessage *lm ));
1896 
1897 LDAP_F( int )
1898 ldap_msgfree LDAP_P((
1899 	LDAPMessage *lm ));
1900 
1901 LDAP_F( int )
1902 ldap_msgdelete LDAP_P((
1903 	LDAP *ld,
1904 	int msgid ));
1905 
1906 
1907 /*
1908  * in search.c:
1909  */
1910 LDAP_F( int )
1911 ldap_bv2escaped_filter_value LDAP_P((
1912 	struct berval *in,
1913 	struct berval *out ));
1914 
1915 LDAP_F( int )
1916 ldap_search_ext LDAP_P((
1917 	LDAP			*ld,
1918 	LDAP_CONST char	*base,
1919 	int				scope,
1920 	LDAP_CONST char	*filter,
1921 	char			**attrs,
1922 	int				attrsonly,
1923 	LDAPControl		**serverctrls,
1924 	LDAPControl		**clientctrls,
1925 	struct timeval	*timeout,
1926 	int				sizelimit,
1927 	int				*msgidp ));
1928 
1929 LDAP_F( int )
1930 ldap_search_ext_s LDAP_P((
1931 	LDAP			*ld,
1932 	LDAP_CONST char	*base,
1933 	int				scope,
1934 	LDAP_CONST char	*filter,
1935 	char			**attrs,
1936 	int				attrsonly,
1937 	LDAPControl		**serverctrls,
1938 	LDAPControl		**clientctrls,
1939 	struct timeval	*timeout,
1940 	int				sizelimit,
1941 	LDAPMessage		**res ));
1942 
1943 #if LDAP_DEPRECATED
1944 LDAP_F( int )
1945 ldap_search LDAP_P((	/* deprecated, use ldap_search_ext */
1946 	LDAP *ld,
1947 	LDAP_CONST char *base,
1948 	int scope,
1949 	LDAP_CONST char *filter,
1950 	char **attrs,
1951 	int attrsonly ));
1952 
1953 LDAP_F( int )
1954 ldap_search_s LDAP_P((	/* deprecated, use ldap_search_ext_s */
1955 	LDAP *ld,
1956 	LDAP_CONST char *base,
1957 	int scope,
1958 	LDAP_CONST char *filter,
1959 	char **attrs,
1960 	int attrsonly,
1961 	LDAPMessage **res ));
1962 
1963 LDAP_F( int )
1964 ldap_search_st LDAP_P((	/* deprecated, use ldap_search_ext_s */
1965 	LDAP *ld,
1966 	LDAP_CONST char *base,
1967 	int scope,
1968 	LDAP_CONST char *filter,
1969     char **attrs,
1970 	int attrsonly,
1971 	struct timeval *timeout,
1972 	LDAPMessage **res ));
1973 #endif
1974 
1975 /*
1976  * in unbind.c
1977  */
1978 LDAP_F( int )
1979 ldap_unbind_ext LDAP_P((
1980 	LDAP			*ld,
1981 	LDAPControl		**serverctrls,
1982 	LDAPControl		**clientctrls));
1983 
1984 LDAP_F( int )
1985 ldap_unbind_ext_s LDAP_P((
1986 	LDAP			*ld,
1987 	LDAPControl		**serverctrls,
1988 	LDAPControl		**clientctrls));
1989 
1990 LDAP_F( int )
1991 ldap_destroy LDAP_P((
1992 	LDAP			*ld));
1993 
1994 #if LDAP_DEPRECATED
1995 LDAP_F( int )
1996 ldap_unbind LDAP_P(( /* deprecated, use ldap_unbind_ext */
1997 	LDAP *ld ));
1998 
1999 LDAP_F( int )
2000 ldap_unbind_s LDAP_P(( /* deprecated, use ldap_unbind_ext_s */
2001 	LDAP *ld ));
2002 #endif
2003 
2004 /*
2005  * in filter.c
2006  */
2007 LDAP_F( int )
2008 ldap_put_vrFilter LDAP_P((
2009 	BerElement *ber,
2010 	const char *vrf ));
2011 
2012 /*
2013  * in free.c
2014  */
2015 
2016 LDAP_F( void * )
2017 ldap_memalloc LDAP_P((
2018 	ber_len_t s ));
2019 
2020 LDAP_F( void * )
2021 ldap_memrealloc LDAP_P((
2022 	void* p,
2023 	ber_len_t s ));
2024 
2025 LDAP_F( void * )
2026 ldap_memcalloc LDAP_P((
2027 	ber_len_t n,
2028 	ber_len_t s ));
2029 
2030 LDAP_F( void )
2031 ldap_memfree LDAP_P((
2032 	void* p ));
2033 
2034 LDAP_F( void )
2035 ldap_memvfree LDAP_P((
2036 	void** v ));
2037 
2038 LDAP_F( char * )
2039 ldap_strdup LDAP_P((
2040 	LDAP_CONST char * ));
2041 
2042 LDAP_F( void )
2043 ldap_mods_free LDAP_P((
2044 	LDAPMod **mods,
2045 	int freemods ));
2046 
2047 
2048 #if LDAP_DEPRECATED
2049 /*
2050  * in sort.c (deprecated, use custom code instead)
2051  */
2052 typedef int (LDAP_SORT_AD_CMP_PROC) LDAP_P(( /* deprecated */
2053 	LDAP_CONST char *left,
2054 	LDAP_CONST char *right ));
2055 
2056 typedef int (LDAP_SORT_AV_CMP_PROC) LDAP_P(( /* deprecated */
2057 	LDAP_CONST void *left,
2058 	LDAP_CONST void *right ));
2059 
2060 LDAP_F( int )	/* deprecated */
2061 ldap_sort_entries LDAP_P(( LDAP *ld,
2062 	LDAPMessage **chain,
2063 	LDAP_CONST char *attr,
2064 	LDAP_SORT_AD_CMP_PROC *cmp ));
2065 
2066 LDAP_F( int )	/* deprecated */
2067 ldap_sort_values LDAP_P((
2068 	LDAP *ld,
2069 	char **vals,
2070 	LDAP_SORT_AV_CMP_PROC *cmp ));
2071 
2072 LDAP_F( int ) /* deprecated */
2073 ldap_sort_strcasecmp LDAP_P((
2074 	LDAP_CONST void *a,
2075 	LDAP_CONST void *b ));
2076 #endif
2077 
2078 /*
2079  * in url.c
2080  */
2081 LDAP_F( int )
2082 ldap_is_ldap_url LDAP_P((
2083 	LDAP_CONST char *url ));
2084 
2085 LDAP_F( int )
2086 ldap_is_ldaps_url LDAP_P((
2087 	LDAP_CONST char *url ));
2088 
2089 LDAP_F( int )
2090 ldap_is_ldapi_url LDAP_P((
2091 	LDAP_CONST char *url ));
2092 
2093 #ifdef LDAP_CONNECTIONLESS
2094 LDAP_F( int )
2095 ldap_is_ldapc_url LDAP_P((
2096 	LDAP_CONST char *url ));
2097 #endif
2098 
2099 LDAP_F( int )
2100 ldap_url_parse LDAP_P((
2101 	LDAP_CONST char *url,
2102 	LDAPURLDesc **ludpp ));
2103 
2104 LDAP_F( char * )
2105 ldap_url_desc2str LDAP_P((
2106 	LDAPURLDesc *ludp ));
2107 
2108 LDAP_F( void )
2109 ldap_free_urldesc LDAP_P((
2110 	LDAPURLDesc *ludp ));
2111 
2112 
2113 /*
2114  * LDAP Cancel Extended Operation <draft-zeilenga-ldap-cancel-xx.txt>
2115  *  in cancel.c
2116  */
2117 #define LDAP_API_FEATURE_CANCEL 1000
2118 
2119 LDAP_F( int )
2120 ldap_cancel LDAP_P(( LDAP *ld,
2121 	int cancelid,
2122 	LDAPControl		**sctrls,
2123 	LDAPControl		**cctrls,
2124 	int				*msgidp ));
2125 
2126 LDAP_F( int )
2127 ldap_cancel_s LDAP_P(( LDAP *ld,
2128 	int cancelid,
2129 	LDAPControl **sctrl,
2130 	LDAPControl **cctrl ));
2131 
2132 /*
2133  * LDAP Turn Extended Operation <draft-zeilenga-ldap-turn-xx.txt>
2134  *  in turn.c
2135  */
2136 #define LDAP_API_FEATURE_TURN 1000
2137 
2138 LDAP_F( int )
2139 ldap_turn LDAP_P(( LDAP *ld,
2140 	int mutual,
2141 	LDAP_CONST char* identifier,
2142 	LDAPControl		**sctrls,
2143 	LDAPControl		**cctrls,
2144 	int				*msgidp ));
2145 
2146 LDAP_F( int )
2147 ldap_turn_s LDAP_P(( LDAP *ld,
2148 	int mutual,
2149 	LDAP_CONST char* identifier,
2150 	LDAPControl **sctrl,
2151 	LDAPControl **cctrl ));
2152 
2153 /*
2154  * LDAP Paged Results
2155  *	in pagectrl.c
2156  */
2157 #define LDAP_API_FEATURE_PAGED_RESULTS 2000
2158 
2159 LDAP_F( int )
2160 ldap_create_page_control_value LDAP_P((
2161 	LDAP *ld,
2162 	ber_int_t pagesize,
2163 	struct berval *cookie,
2164 	struct berval *value ));
2165 
2166 LDAP_F( int )
2167 ldap_create_page_control LDAP_P((
2168 	LDAP *ld,
2169 	ber_int_t pagesize,
2170 	struct berval *cookie,
2171 	int iscritical,
2172 	LDAPControl **ctrlp ));
2173 
2174 #if LDAP_DEPRECATED
2175 LDAP_F( int )
2176 ldap_parse_page_control LDAP_P((
2177 	/* deprecated, use ldap_parse_pageresponse_control */
2178 	LDAP *ld,
2179 	LDAPControl **ctrls,
2180 	ber_int_t *count,
2181 	struct berval **cookie ));
2182 #endif
2183 
2184 LDAP_F( int )
2185 ldap_parse_pageresponse_control LDAP_P((
2186 	LDAP *ld,
2187 	LDAPControl *ctrl,
2188 	ber_int_t *count,
2189 	struct berval *cookie ));
2190 
2191 /*
2192  * LDAP Server Side Sort
2193  *	in sortctrl.c
2194  */
2195 #define LDAP_API_FEATURE_SERVER_SIDE_SORT 2000
2196 
2197 /* structure for a sort-key */
2198 typedef struct ldapsortkey {
2199 	char *attributeType;
2200 	char *orderingRule;
2201 	int reverseOrder;
2202 } LDAPSortKey;
2203 
2204 LDAP_F( int )
2205 ldap_create_sort_keylist LDAP_P((
2206 	LDAPSortKey ***sortKeyList,
2207 	char *keyString ));
2208 
2209 LDAP_F( void )
2210 ldap_free_sort_keylist LDAP_P((
2211 	LDAPSortKey **sortkeylist ));
2212 
2213 LDAP_F( int )
2214 ldap_create_sort_control_value LDAP_P((
2215 	LDAP *ld,
2216 	LDAPSortKey **keyList,
2217 	struct berval *value ));
2218 
2219 LDAP_F( int )
2220 ldap_create_sort_control LDAP_P((
2221 	LDAP *ld,
2222 	LDAPSortKey **keyList,
2223 	int iscritical,
2224 	LDAPControl **ctrlp ));
2225 
2226 LDAP_F( int )
2227 ldap_parse_sortresponse_control LDAP_P((
2228 	LDAP *ld,
2229 	LDAPControl *ctrl,
2230 	ber_int_t *result,
2231 	char **attribute ));
2232 
2233 /*
2234  * LDAP Virtual List View
2235  *	in vlvctrl.c
2236  */
2237 #define LDAP_API_FEATURE_VIRTUAL_LIST_VIEW 2000
2238 
2239 /* structure for virtual list */
2240 typedef struct ldapvlvinfo {
2241 	ber_int_t ldvlv_version;
2242     ber_int_t ldvlv_before_count;
2243     ber_int_t ldvlv_after_count;
2244     ber_int_t ldvlv_offset;
2245     ber_int_t ldvlv_count;
2246     struct berval *	ldvlv_attrvalue;
2247     struct berval *	ldvlv_context;
2248     void *			ldvlv_extradata;
2249 } LDAPVLVInfo;
2250 
2251 LDAP_F( int )
2252 ldap_create_vlv_control_value LDAP_P((
2253 	LDAP *ld,
2254 	LDAPVLVInfo *ldvlistp,
2255 	struct berval *value));
2256 
2257 LDAP_F( int )
2258 ldap_create_vlv_control LDAP_P((
2259 	LDAP *ld,
2260 	LDAPVLVInfo *ldvlistp,
2261 	LDAPControl **ctrlp ));
2262 
2263 LDAP_F( int )
2264 ldap_parse_vlvresponse_control LDAP_P((
2265 	LDAP          *ld,
2266 	LDAPControl   *ctrls,
2267 	ber_int_t *target_posp,
2268 	ber_int_t *list_countp,
2269 	struct berval **contextp,
2270 	int           *errcodep ));
2271 
2272 /*
2273  * LDAP Verify Credentials
2274  */
2275 #define LDAP_API_FEATURE_VERIFY_CREDENTIALS 1000
2276 
2277 LDAP_F( int )
2278 ldap_verify_credentials LDAP_P((
2279 	LDAP		*ld,
2280 	struct berval	*cookie,
2281 	LDAP_CONST char	*dn,
2282 	LDAP_CONST char	*mechanism,
2283 	struct berval	*cred,
2284 	LDAPControl	**ctrls,
2285 	LDAPControl	**serverctrls,
2286 	LDAPControl	**clientctrls,
2287 	int		*msgidp ));
2288 
2289 LDAP_F( int )
2290 ldap_verify_credentials_s LDAP_P((
2291 	LDAP		*ld,
2292 	struct berval	*cookie,
2293 	LDAP_CONST char	*dn,
2294 	LDAP_CONST char	*mechanism,
2295 	struct berval	*cred,
2296 	LDAPControl	**vcictrls,
2297 	LDAPControl	**serverctrls,
2298 	LDAPControl	**clientctrls,
2299 	int				*code,
2300 	char			**diagmsgp,
2301 	struct berval	**scookie,
2302 	struct berval	**servercredp,
2303 	LDAPControl	***vcoctrls));
2304 
2305 
2306 LDAP_F( int )
2307 ldap_parse_verify_credentials LDAP_P((
2308 	LDAP		*ld,
2309 	LDAPMessage	*res,
2310 	int			*code,
2311 	char			**diagmsgp,
2312 	struct berval	**cookie,
2313 	struct berval	**servercredp,
2314 	LDAPControl	***vcctrls));
2315 
2316 /* not yet implemented */
2317 /* #define LDAP_API_FEATURE_VERIFY_CREDENTIALS_INTERACTIVE 1000 */
2318 #ifdef LDAP_API_FEATURE_VERIFY_CREDENTIALS_INTERACTIVE
2319 LDAP_F( int )
2320 ldap_verify_credentials_interactive LDAP_P((
2321 	LDAP *ld,
2322 	LDAP_CONST char *dn, /* usually NULL */
2323 	LDAP_CONST char *saslMechanism,
2324 	LDAPControl **vcControls,
2325 	LDAPControl **serverControls,
2326 	LDAPControl **clientControls,
2327 
2328 	/* should be client controls */
2329 	unsigned flags,
2330 	LDAP_SASL_INTERACT_PROC *proc,
2331 	void *defaults,
2332 	void *context,
2333 
2334 	/* as obtained from ldap_result() */
2335 	LDAPMessage *result,
2336 
2337 	/* returned during bind processing */
2338 	const char **rmech,
2339 	int *msgid ));
2340 #endif
2341 
2342 /*
2343  * LDAP Who Am I?
2344  *	in whoami.c
2345  */
2346 #define LDAP_API_FEATURE_WHOAMI 1000
2347 
2348 LDAP_F( int )
2349 ldap_parse_whoami LDAP_P((
2350 	LDAP *ld,
2351 	LDAPMessage *res,
2352 	struct berval **authzid ));
2353 
2354 LDAP_F( int )
2355 ldap_whoami LDAP_P(( LDAP *ld,
2356 	LDAPControl		**sctrls,
2357 	LDAPControl		**cctrls,
2358 	int				*msgidp ));
2359 
2360 LDAP_F( int )
2361 ldap_whoami_s LDAP_P((
2362 	LDAP *ld,
2363 	struct berval **authzid,
2364 	LDAPControl **sctrls,
2365 	LDAPControl **cctrls ));
2366 
2367 /*
2368  * LDAP Password Modify
2369  *	in passwd.c
2370  */
2371 #define LDAP_API_FEATURE_PASSWD_MODIFY 1000
2372 
2373 LDAP_F( int )
2374 ldap_parse_passwd LDAP_P((
2375 	LDAP *ld,
2376 	LDAPMessage *res,
2377 	struct berval *newpasswd ));
2378 
2379 LDAP_F( int )
2380 ldap_passwd LDAP_P(( LDAP *ld,
2381 	struct berval	*user,
2382 	struct berval	*oldpw,
2383 	struct berval	*newpw,
2384 	LDAPControl		**sctrls,
2385 	LDAPControl		**cctrls,
2386 	int				*msgidp ));
2387 
2388 LDAP_F( int )
2389 ldap_passwd_s LDAP_P((
2390 	LDAP *ld,
2391 	struct berval	*user,
2392 	struct berval	*oldpw,
2393 	struct berval	*newpw,
2394 	struct berval *newpasswd,
2395 	LDAPControl **sctrls,
2396 	LDAPControl **cctrls ));
2397 
2398 #ifdef LDAP_CONTROL_PASSWORDPOLICYREQUEST
2399 /*
2400  * LDAP Password Policy controls
2401  *	in ppolicy.c
2402  */
2403 #define LDAP_API_FEATURE_PASSWORD_POLICY 1000
2404 
2405 typedef enum passpolicyerror_enum {
2406        PP_passwordExpired = 0,
2407        PP_accountLocked = 1,
2408        PP_changeAfterReset = 2,
2409        PP_passwordModNotAllowed = 3,
2410        PP_mustSupplyOldPassword = 4,
2411        PP_insufficientPasswordQuality = 5,
2412        PP_passwordTooShort = 6,
2413        PP_passwordTooYoung = 7,
2414        PP_passwordInHistory = 8,
2415        PP_passwordTooLong = 9,
2416        PP_noError = 65535
2417 } LDAPPasswordPolicyError;
2418 
2419 LDAP_F( int )
2420 ldap_create_passwordpolicy_control LDAP_P((
2421         LDAP *ld,
2422         LDAPControl **ctrlp ));
2423 
2424 LDAP_F( int )
2425 ldap_parse_passwordpolicy_control LDAP_P((
2426         LDAP *ld,
2427         LDAPControl *ctrl,
2428         ber_int_t *expirep,
2429         ber_int_t *gracep,
2430         LDAPPasswordPolicyError *errorp ));
2431 
2432 LDAP_F( const char * )
2433 ldap_passwordpolicy_err2txt LDAP_P(( LDAPPasswordPolicyError ));
2434 #endif /* LDAP_CONTROL_PASSWORDPOLICYREQUEST */
2435 
2436 LDAP_F( int )
2437 ldap_parse_password_expiring_control LDAP_P((
2438 	LDAP           *ld,
2439 	LDAPControl    *ctrl,
2440 	long           *secondsp ));
2441 
2442 /*
2443  * LDAP Dynamic Directory Services Refresh -- RFC 2589
2444  *	in dds.c
2445  */
2446 #define LDAP_API_FEATURE_REFRESH 1000
2447 
2448 LDAP_F( int )
2449 ldap_parse_refresh LDAP_P((
2450 	LDAP *ld,
2451 	LDAPMessage *res,
2452 	ber_int_t *newttl ));
2453 
2454 LDAP_F( int )
2455 ldap_refresh LDAP_P(( LDAP *ld,
2456 	struct berval	*dn,
2457 	ber_int_t ttl,
2458 	LDAPControl		**sctrls,
2459 	LDAPControl		**cctrls,
2460 	int				*msgidp ));
2461 
2462 LDAP_F( int )
2463 ldap_refresh_s LDAP_P((
2464 	LDAP *ld,
2465 	struct berval	*dn,
2466 	ber_int_t ttl,
2467 	ber_int_t *newttl,
2468 	LDAPControl **sctrls,
2469 	LDAPControl **cctrls ));
2470 
2471 /*
2472  * LDAP Transactions
2473  */
2474 LDAP_F( int )
2475 ldap_txn_start LDAP_P(( LDAP *ld,
2476 	LDAPControl		**sctrls,
2477 	LDAPControl		**cctrls,
2478 	int				*msgidp ));
2479 
2480 LDAP_F( int )
2481 ldap_txn_start_s LDAP_P(( LDAP *ld,
2482 	LDAPControl **sctrl,
2483 	LDAPControl **cctrl,
2484 	struct berval **rettxnid ));
2485 
2486 LDAP_F( int )
2487 ldap_txn_end LDAP_P(( LDAP *ld,
2488 	int	commit,
2489 	struct berval	*txnid,
2490 	LDAPControl		**sctrls,
2491 	LDAPControl		**cctrls,
2492 	int				*msgidp ));
2493 
2494 LDAP_F( int )
2495 ldap_txn_end_s LDAP_P(( LDAP *ld,
2496 	int	commit,
2497 	struct berval *txnid,
2498 	LDAPControl **sctrl,
2499 	LDAPControl **cctrl,
2500 	int *retidp ));
2501 
2502 /*
2503  * in ldap_sync.c
2504  */
2505 
2506 /*
2507  * initialize the persistent search structure
2508  */
2509 LDAP_F( ldap_sync_t * )
2510 ldap_sync_initialize LDAP_P((
2511 	ldap_sync_t	*ls ));
2512 
2513 /*
2514  * destroy the persistent search structure
2515  */
2516 LDAP_F( void )
2517 ldap_sync_destroy LDAP_P((
2518 	ldap_sync_t	*ls,
2519 	int		freeit ));
2520 
2521 /*
2522  * initialize a refreshOnly sync
2523  */
2524 LDAP_F( int )
2525 ldap_sync_init LDAP_P((
2526 	ldap_sync_t	*ls,
2527 	int		mode ));
2528 
2529 /*
2530  * initialize a refreshOnly sync
2531  */
2532 LDAP_F( int )
2533 ldap_sync_init_refresh_only LDAP_P((
2534 	ldap_sync_t	*ls ));
2535 
2536 /*
2537  * initialize a refreshAndPersist sync
2538  */
2539 LDAP_F( int )
2540 ldap_sync_init_refresh_and_persist LDAP_P((
2541 	ldap_sync_t	*ls ));
2542 
2543 /*
2544  * poll for new responses
2545  */
2546 LDAP_F( int )
2547 ldap_sync_poll LDAP_P((
2548 	ldap_sync_t	*ls ));
2549 
2550 #ifdef LDAP_CONTROL_X_SESSION_TRACKING
2551 
2552 /*
2553  * in stctrl.c
2554  */
2555 LDAP_F( int )
2556 ldap_create_session_tracking_value LDAP_P((
2557 	LDAP		*ld,
2558 	char		*sessionSourceIp,
2559 	char		*sessionSourceName,
2560 	char		*formatOID,
2561 	struct berval	*sessionTrackingIdentifier,
2562 	struct berval	*value ));
2563 
2564 LDAP_F( int )
2565 ldap_create_session_tracking_control LDAP_P((
2566 	LDAP		*ld,
2567 	char		*sessionSourceIp,
2568 	char		*sessionSourceName,
2569 	char		*formatOID,
2570 	struct berval	*sessionTrackingIdentifier,
2571 	LDAPControl	**ctrlp ));
2572 
2573 LDAP_F( int )
2574 ldap_parse_session_tracking_control LDAP_P((
2575 	LDAP *ld,
2576 	LDAPControl *ctrl,
2577 	struct berval *ip,
2578 	struct berval *name,
2579 	struct berval *oid,
2580 	struct berval *id ));
2581 
2582 #endif /* LDAP_CONTROL_X_SESSION_TRACKING */
2583 
2584 /*
2585  * in msctrl.c
2586  */
2587 #ifdef LDAP_CONTROL_X_DIRSYNC
2588 LDAP_F( int )
2589 ldap_create_dirsync_value LDAP_P((
2590 	LDAP		*ld,
2591 	int		flags,
2592 	int		maxAttrCount,
2593 	struct berval	*cookie,
2594 	struct berval	*value ));
2595 
2596 LDAP_F( int )
2597 ldap_create_dirsync_control LDAP_P((
2598 	LDAP		*ld,
2599 	int		flags,
2600 	int		maxAttrCount,
2601 	struct berval	*cookie,
2602 	LDAPControl	**ctrlp ));
2603 
2604 LDAP_F( int )
2605 ldap_parse_dirsync_control LDAP_P((
2606 	LDAP		*ld,
2607 	LDAPControl	*ctrl,
2608 	int		*continueFlag,
2609 	struct berval	*cookie ));
2610 #endif /* LDAP_CONTROL_X_DIRSYNC */
2611 
2612 #ifdef LDAP_CONTROL_X_EXTENDED_DN
2613 LDAP_F( int )
2614 ldap_create_extended_dn_value LDAP_P((
2615 	LDAP		*ld,
2616 	int		flag,
2617 	struct berval	*value ));
2618 
2619 LDAP_F( int )
2620 ldap_create_extended_dn_control LDAP_P((
2621 	LDAP		*ld,
2622 	int		flag,
2623 	LDAPControl	**ctrlp ));
2624 #endif /* LDAP_CONTROL_X_EXTENDED_DN */
2625 
2626 #ifdef LDAP_CONTROL_X_SHOW_DELETED
2627 LDAP_F( int )
2628 ldap_create_show_deleted_control LDAP_P((
2629 	LDAP		*ld,
2630 	LDAPControl	**ctrlp ));
2631 #endif /* LDAP_CONTROL_X_SHOW_DELETED */
2632 
2633 #ifdef LDAP_CONTROL_X_SERVER_NOTIFICATION
2634 LDAP_F( int )
2635 ldap_create_server_notification_control LDAP_P((
2636 	LDAP		*ld,
2637 	LDAPControl	**ctrlp ));
2638 #endif /* LDAP_CONTROL_X_SERVER_NOTIFICATION */
2639 
2640 /*
2641  * in assertion.c
2642  */
2643 LDAP_F (int)
2644 ldap_create_assertion_control_value LDAP_P((
2645 	LDAP		*ld,
2646 	char		*assertion,
2647 	struct berval	*value ));
2648 
2649 LDAP_F( int )
2650 ldap_create_assertion_control LDAP_P((
2651 	LDAP		*ld,
2652 	char		*filter,
2653 	int		iscritical,
2654 	LDAPControl	**ctrlp ));
2655 
2656 /*
2657  * in deref.c
2658  */
2659 
2660 typedef struct LDAPDerefSpec {
2661 	char *derefAttr;
2662 	char **attributes;
2663 } LDAPDerefSpec;
2664 
2665 typedef struct LDAPDerefVal {
2666 	char *type;
2667 	BerVarray vals;
2668 	struct LDAPDerefVal *next;
2669 } LDAPDerefVal;
2670 
2671 typedef struct LDAPDerefRes {
2672 	char *derefAttr;
2673 	struct berval derefVal;
2674 	LDAPDerefVal *attrVals;
2675 	struct LDAPDerefRes *next;
2676 } LDAPDerefRes;
2677 
2678 LDAP_F( int )
2679 ldap_create_deref_control_value LDAP_P((
2680 	LDAP *ld,
2681 	LDAPDerefSpec *ds,
2682 	struct berval *value ));
2683 
2684 LDAP_F( int )
2685 ldap_create_deref_control LDAP_P((
2686 	LDAP		*ld,
2687 	LDAPDerefSpec	*ds,
2688 	int		iscritical,
2689 	LDAPControl	**ctrlp ));
2690 
2691 LDAP_F( void )
2692 ldap_derefresponse_free LDAP_P((
2693 	LDAPDerefRes *dr ));
2694 
2695 LDAP_F( int )
2696 ldap_parse_derefresponse_control LDAP_P((
2697 	LDAP *ld,
2698 	LDAPControl *ctrl,
2699 	LDAPDerefRes **drp ));
2700 
2701 LDAP_F( int )
2702 ldap_parse_deref_control LDAP_P((
2703 	LDAP		*ld,
2704 	LDAPControl	**ctrls,
2705 	LDAPDerefRes	**drp ));
2706 
2707 /*
2708  * in psearch.c
2709  */
2710 
2711 LDAP_F( int )
2712 ldap_create_persistentsearch_control_value LDAP_P((
2713 	LDAP *ld,
2714 	int changetypes,
2715 	int changesonly,
2716 	int return_echg_ctls,
2717 	struct berval *value ));
2718 
2719 LDAP_F( int )
2720 ldap_create_persistentsearch_control LDAP_P((
2721 	LDAP *ld,
2722 	int changetypes,
2723 	int changesonly,
2724 	int return_echg_ctls,
2725 	int isCritical,
2726 	LDAPControl **ctrlp ));
2727 
2728 LDAP_F( int )
2729 ldap_parse_entrychange_control LDAP_P((
2730 	LDAP *ld,
2731 	LDAPControl *ctrl,
2732 	int *chgtypep,
2733 	struct berval *prevdnp,
2734 	int *chgnumpresentp,
2735 	long *chgnump ));
2736 
2737 /* in account_usability.c */
2738 
2739 LDAP_F( int )
2740 ldap_create_accountusability_control LDAP_P((
2741 	LDAP *ld,
2742 	LDAPControl **ctrlp ));
2743 
2744 typedef struct LDAPAccountUsabilityMoreInfo {
2745 	ber_int_t inactive;
2746 	ber_int_t reset;
2747 	ber_int_t expired;
2748 	ber_int_t remaining_grace;
2749 	ber_int_t seconds_before_unlock;
2750 } LDAPAccountUsabilityMoreInfo;
2751 
2752 typedef union LDAPAccountUsability {
2753 	ber_int_t seconds_remaining;
2754 	LDAPAccountUsabilityMoreInfo more_info;
2755 } LDAPAccountUsability;
2756 
2757 LDAP_F( int )
2758 ldap_parse_accountusability_control LDAP_P((
2759 	LDAP           *ld,
2760 	LDAPControl    *ctrl,
2761 	int            *availablep,
2762 	LDAPAccountUsability *usabilityp ));
2763 
2764 
2765 /*
2766  * high level LDIF to LDAP structure support
2767  */
2768 #define LDIF_DEFAULT_ADD  0x01 /* if changetype missing, assume LDAP_ADD */
2769 #define LDIF_ENTRIES_ONLY 0x02 /* ignore changetypes other than add */
2770 #define LDIF_NO_CONTROLS  0x04 /* ignore control specifications */
2771 #define LDIF_MODS_ONLY    0x08 /* no changetypes, assume LDAP_MODIFY */
2772 #define LDIF_NO_DN        0x10 /* dn is not present */
2773 
2774 typedef struct ldifrecord {
2775 	ber_tag_t lr_op; /* type of operation - LDAP_REQ_MODIFY, LDAP_REQ_ADD, etc. */
2776 	struct berval lr_dn; /* DN of operation */
2777 	LDAPControl **lr_ctrls; /* controls specified for operation */
2778 	/* some ops such as LDAP_REQ_DELETE require only a DN */
2779 	/* other ops require different data - the ldif_ops union
2780 	   is used to specify the data for each type of operation */
2781 	union ldif_ops_u {
2782 		LDAPMod **lr_mods; /* list of mods for LDAP_REQ_MODIFY, LDAP_REQ_ADD */
2783 #define lrop_mods ldif_ops.lr_mods
2784 		struct ldif_op_rename_s {
2785 			struct berval lr_newrdn; /* LDAP_REQ_MODDN, LDAP_REQ_MODRDN, LDAP_REQ_RENAME */
2786 #define lrop_newrdn ldif_ops.ldif_op_rename.lr_newrdn
2787 			struct berval lr_newsuperior; /* LDAP_REQ_MODDN, LDAP_REQ_MODRDN, LDAP_REQ_RENAME */
2788 #define lrop_newsup ldif_ops.ldif_op_rename.lr_newsuperior
2789 			int lr_deleteoldrdn; /* LDAP_REQ_MODDN, LDAP_REQ_MODRDN, LDAP_REQ_RENAME */
2790 #define lrop_delold ldif_ops.ldif_op_rename.lr_deleteoldrdn
2791 		} ldif_op_rename; /* rename/moddn/modrdn */
2792 		/* the following are for future support */
2793 		struct ldif_op_ext_s {
2794 			struct berval lr_extop_oid; /* LDAP_REQ_EXTENDED */
2795 #define lrop_extop_oid ldif_ops.ldif_op_ext.lr_extop_oid
2796 			struct berval lr_extop_data; /* LDAP_REQ_EXTENDED */
2797 #define lrop_extop_data ldif_ops.ldif_op_ext.lr_extop_data
2798 		} ldif_op_ext; /* extended operation */
2799 		struct ldif_op_cmp_s {
2800 			struct berval lr_cmp_attr; /* LDAP_REQ_COMPARE */
2801 #define lrop_cmp_attr ldif_ops.ldif_op_cmp.lr_cmp_attr
2802 			struct berval lr_cmp_bvalue; /* LDAP_REQ_COMPARE */
2803 #define lrop_cmp_bval ldif_ops.ldif_op_cmp.lr_cmp_bvalue
2804 		} ldif_op_cmp; /* compare operation */
2805 	} ldif_ops;
2806 	/* PRIVATE STUFF - DO NOT TOUCH */
2807 	/* for efficiency, the implementation allocates memory */
2808 	/* in large blobs, and makes the above fields point to */
2809 	/* locations inside those blobs - one consequence is that */
2810 	/* you cannot simply free the above allocated fields, nor */
2811 	/* assign them to be owned by another memory context which */
2812 	/* might free them (unless providing your own mem ctx) */
2813 	/* we use the fields below to keep track of those blobs */
2814 	/* so we that we can free them later */
2815 	void *lr_ctx; /* the memory context or NULL */
2816 	int lr_lines;
2817 	LDAPMod	*lr_lm;
2818 	unsigned char *lr_mops;
2819 	char *lr_freeval;
2820 	struct berval *lr_vals;
2821 	struct berval *lr_btype;
2822 } LDIFRecord;
2823 
2824 /* free internal fields - does not free the LDIFRecord */
2825 LDAP_F( void )
2826 ldap_ldif_record_done LDAP_P((
2827 	LDIFRecord *lr ));
2828 
2829 LDAP_F( int )
2830 ldap_parse_ldif_record LDAP_P((
2831 	struct berval *rbuf,
2832 	unsigned long linenum,
2833 	LDIFRecord *lr,
2834 	const char *errstr,
2835 	unsigned int flags ));
2836 
2837 LDAP_END_DECL
2838 #endif /* _LDAP_H */
2839