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