1 /*  ldap-int.h - defines & prototypes internal to the LDAP library */
2 /* $OpenLDAP$ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4  *
5  * Copyright 1998-2021 The OpenLDAP Foundation.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted only as authorized by the OpenLDAP
10  * Public License.
11  *
12  * A copy of this license is available in the file LICENSE in the
13  * top-level directory of the distribution or, alternatively, at
14  * <http://www.OpenLDAP.org/license.html>.
15  */
16 /*  Portions Copyright (c) 1995 Regents of the University of Michigan.
17  *  All rights reserved.
18  */
19 
20 #ifndef	_LDAP_INT_H
21 #define	_LDAP_INT_H 1
22 
23 #ifdef LDAP_R_COMPILE
24 #define LDAP_THREAD_SAFE 1
25 #endif
26 
27 #include "../liblber/lber-int.h"
28 #include "lutil.h"
29 
30 #ifdef LDAP_R_COMPILE
31 #include <ldap_pvt_thread.h>
32 #endif
33 
34 #ifdef HAVE_CYRUS_SASL
35 	/* the need for this should be removed */
36 #ifdef HAVE_SASL_SASL_H
37 #include <sasl/sasl.h>
38 #else
39 #include <sasl.h>
40 #endif
41 
42 #define SASL_MAX_BUFF_SIZE	(0xffffff)
43 #define SASL_MIN_BUFF_SIZE	4096
44 #endif
45 
46 /* for struct timeval */
47 #include <ac/time.h>
48 #ifdef _WIN32
49 #include <ac/socket.h>
50 #endif
51 
52 #undef TV2MILLISEC
53 #define TV2MILLISEC(tv) (((tv)->tv_sec * 1000) + ((tv)->tv_usec/1000))
54 
55 /*
56  * Support needed if the library is running in the kernel
57  */
58 #if LDAP_INT_IN_KERNEL
59 	/*
60 	 * Platform specific function to return a pointer to the
61 	 * process-specific global options.
62 	 *
63 	 * This function should perform the following functions:
64 	 *  Allocate and initialize a global options struct on a per process basis
65 	 *  Use callers process identifier to return its global options struct
66 	 *  Note: Deallocate structure when the process exits
67 	 */
68 #	define LDAP_INT_GLOBAL_OPT() ldap_int_global_opt()
69 	struct ldapoptions *ldap_int_global_opt(void);
70 #else
71 #	define LDAP_INT_GLOBAL_OPT() (&ldap_int_global_options)
72 #endif
73 
74 #define ldap_debug	((LDAP_INT_GLOBAL_OPT())->ldo_debug)
75 
76 #include "ldap_log.h"
77 
78 #undef Debug
79 
80 #ifdef LDAP_DEBUG
81 
82 #define DebugTest( level ) \
83 	( ldap_debug & level )
84 
85 #define Debug( level, fmt, arg1, arg2, arg3 ) \
86 	do { if ( ldap_debug & level ) \
87 	ldap_log_printf( NULL, (level), (fmt), (arg1), (arg2), (arg3) ); \
88 	} while ( 0 )
89 
90 #define LDAP_Debug( subsystem, level, fmt, arg1, arg2, arg3 )\
91 	ldap_log_printf( NULL, (level), (fmt), (arg1), (arg2), (arg3) )
92 
93 #else
94 
95 #define DebugTest( level )                                    (0 == 1)
96 #define Debug( level, fmt, arg1, arg2, arg3 )                 ((void)0)
97 #define LDAP_Debug( subsystem, level, fmt, arg1, arg2, arg3 ) ((void)0)
98 
99 #endif /* LDAP_DEBUG */
100 
101 #define LDAP_DEPRECATED 1
102 #include "ldap.h"
103 
104 #include "ldap_pvt.h"
105 
106 LDAP_BEGIN_DECL
107 
108 #define LDAP_URL_PREFIX         "ldap://"
109 #define LDAP_URL_PREFIX_LEN     STRLENOF(LDAP_URL_PREFIX)
110 #define LDAPS_URL_PREFIX	"ldaps://"
111 #define LDAPS_URL_PREFIX_LEN	STRLENOF(LDAPS_URL_PREFIX)
112 #define LDAPI_URL_PREFIX	"ldapi://"
113 #define LDAPI_URL_PREFIX_LEN	STRLENOF(LDAPI_URL_PREFIX)
114 #ifdef LDAP_CONNECTIONLESS
115 #define LDAPC_URL_PREFIX	"cldap://"
116 #define LDAPC_URL_PREFIX_LEN	STRLENOF(LDAPC_URL_PREFIX)
117 #endif
118 #define LDAP_URL_URLCOLON	"URL:"
119 #define LDAP_URL_URLCOLON_LEN	STRLENOF(LDAP_URL_URLCOLON)
120 
121 #define LDAP_REF_STR		"Referral:\n"
122 #define LDAP_REF_STR_LEN	STRLENOF(LDAP_REF_STR)
123 #define LDAP_LDAP_REF_STR	LDAP_URL_PREFIX
124 #define LDAP_LDAP_REF_STR_LEN	LDAP_URL_PREFIX_LEN
125 
126 #define LDAP_DEFAULT_REFHOPLIMIT 5
127 
128 #define LDAP_BOOL_REFERRALS		0
129 #define LDAP_BOOL_RESTART		1
130 #define LDAP_BOOL_TLS			3
131 #define	LDAP_BOOL_CONNECT_ASYNC		4
132 #define	LDAP_BOOL_SASL_NOCANON		5
133 
134 #define LDAP_BOOLEANS	unsigned long
135 #define LDAP_BOOL(n)	((LDAP_BOOLEANS)1 << (n))
136 #define LDAP_BOOL_GET(lo, bool)	\
137 	((lo)->ldo_booleans & LDAP_BOOL(bool) ? -1 : 0)
138 #define LDAP_BOOL_SET(lo, bool) ((lo)->ldo_booleans |= LDAP_BOOL(bool))
139 #define LDAP_BOOL_CLR(lo, bool) ((lo)->ldo_booleans &= ~LDAP_BOOL(bool))
140 #define LDAP_BOOL_ZERO(lo) ((lo)->ldo_booleans = 0)
141 
142 /*
143  * This structure represents both ldap messages and ldap responses.
144  * These are really the same, except in the case of search responses,
145  * where a response has multiple messages.
146  */
147 
148 struct ldapmsg {
149 	ber_int_t		lm_msgid;	/* the message id */
150 	ber_tag_t		lm_msgtype;	/* the message type */
151 	BerElement	*lm_ber;	/* the ber encoded message contents */
152 	struct ldapmsg	*lm_chain;	/* for search - next msg in the resp */
153 	struct ldapmsg	*lm_chain_tail;
154 	struct ldapmsg	*lm_next;	/* next response */
155 	time_t	lm_time;	/* used to maintain cache */
156 };
157 
158 #ifdef HAVE_TLS
159 struct ldaptls {
160 	char		*lt_certfile;
161 	char		*lt_keyfile;
162 	char		*lt_dhfile;
163 	char		*lt_cacertfile;
164 	char		*lt_cacertdir;
165 	char		*lt_ciphersuite;
166 	char		*lt_crlfile;
167 	char		*lt_randfile;	/* OpenSSL only */
168 	char		*lt_ecname;		/* OpenSSL only */
169 	int		lt_protocol_min;
170 };
171 #endif
172 
173 typedef struct ldaplist {
174 	struct ldaplist *ll_next;
175 	void *ll_data;
176 } ldaplist;
177 
178 /*
179  * structure representing get/set'able options
180  * which have global defaults.
181  * Protect access to this struct with ldo_mutex
182  * ldap_log.h:ldapoptions_prefix must match the head of this struct.
183  */
184 struct ldapoptions {
185 	short ldo_valid;
186 #define LDAP_UNINITIALIZED	0x0
187 #define LDAP_INITIALIZED	0x1
188 #define LDAP_VALID_SESSION	0x2
189 #define LDAP_TRASHED_SESSION	0xFF
190 	int   ldo_debug;
191 
192 	ber_int_t		ldo_version;
193 	ber_int_t		ldo_deref;
194 	ber_int_t		ldo_timelimit;
195 	ber_int_t		ldo_sizelimit;
196 
197 	/* per API call timeout */
198 	struct timeval		ldo_tm_api;
199 	struct timeval		ldo_tm_net;
200 
201 	LDAPURLDesc *ldo_defludp;
202 	int		ldo_defport;
203 	char*	ldo_defbase;
204 	char*	ldo_defbinddn;	/* bind dn */
205 
206 	/*
207 	 * Per connection tcp-keepalive settings (Linux only,
208 	 * ignored where unsupported)
209 	 */
210 	ber_int_t ldo_keepalive_idle;
211 	ber_int_t ldo_keepalive_probes;
212 	ber_int_t ldo_keepalive_interval;
213 
214 	int		ldo_refhoplimit;	/* limit on referral nesting */
215 
216 	/* LDAPv3 server and client controls */
217 	LDAPControl	**ldo_sctrls;
218 	LDAPControl **ldo_cctrls;
219 
220 	/* LDAP rebind callback function */
221 	LDAP_REBIND_PROC *ldo_rebind_proc;
222 	void *ldo_rebind_params;
223 	LDAP_NEXTREF_PROC *ldo_nextref_proc;
224 	void *ldo_nextref_params;
225 	LDAP_URLLIST_PROC *ldo_urllist_proc;
226 	void *ldo_urllist_params;
227 
228 	/* LDAP connection callback stack */
229 	ldaplist *ldo_conn_cbs;
230 
231 	LDAP_BOOLEANS ldo_booleans;	/* boolean options */
232 
233 #define LDAP_LDO_NULLARG	,0,0,0,0 ,{0},{0} ,0,0,0,0, 0,0,0,0, 0,0, 0,0,0,0,0,0, 0, 0
234 
235 #ifdef LDAP_CONNECTIONLESS
236 #define	LDAP_IS_UDP(ld)		((ld)->ld_options.ldo_is_udp)
237 	void*			ldo_peer;	/* struct sockaddr* */
238 	char*			ldo_cldapdn;
239 	int			ldo_is_udp;
240 #define	LDAP_LDO_CONNECTIONLESS_NULLARG	,0,0,0
241 #else
242 #define	LDAP_LDO_CONNECTIONLESS_NULLARG
243 #endif
244 
245 #ifdef HAVE_TLS
246    	/* tls context */
247    	void		*ldo_tls_ctx;
248 	LDAP_TLS_CONNECT_CB	*ldo_tls_connect_cb;
249 	void*			ldo_tls_connect_arg;
250 	struct ldaptls ldo_tls_info;
251 #define ldo_tls_certfile	ldo_tls_info.lt_certfile
252 #define ldo_tls_keyfile	ldo_tls_info.lt_keyfile
253 #define ldo_tls_dhfile	ldo_tls_info.lt_dhfile
254 #define ldo_tls_ecname	ldo_tls_info.lt_ecname
255 #define ldo_tls_cacertfile	ldo_tls_info.lt_cacertfile
256 #define ldo_tls_cacertdir	ldo_tls_info.lt_cacertdir
257 #define ldo_tls_ciphersuite	ldo_tls_info.lt_ciphersuite
258 #define ldo_tls_protocol_min	ldo_tls_info.lt_protocol_min
259 #define ldo_tls_crlfile	ldo_tls_info.lt_crlfile
260 #define ldo_tls_randfile	ldo_tls_info.lt_randfile
261    	int			ldo_tls_mode;
262    	int			ldo_tls_require_cert;
263 	int			ldo_tls_impl;
264    	int			ldo_tls_crlcheck;
265 	int			ldo_tls_require_san;
266 #define LDAP_LDO_TLS_NULLARG ,0,0,0,{0,0,0,0,0,0,0,0,0},0,0,0,0,0
267 #else
268 #define LDAP_LDO_TLS_NULLARG
269 #endif
270 
271 #ifdef HAVE_CYRUS_SASL
272 	char*	ldo_def_sasl_mech;		/* SASL Mechanism(s) */
273 	char*	ldo_def_sasl_realm;		/* SASL realm */
274 	char*	ldo_def_sasl_authcid;	/* SASL authentication identity */
275 	char*	ldo_def_sasl_authzid;	/* SASL authorization identity */
276 
277 	/* SASL Security Properties */
278 	struct sasl_security_properties	ldo_sasl_secprops;
279 #define LDAP_LDO_SASL_NULLARG ,0,0,0,0,{0}
280 #else
281 #define LDAP_LDO_SASL_NULLARG
282 #endif
283 
284 #ifdef HAVE_GSSAPI
285 	unsigned ldo_gssapi_flags;
286 #define LDAP_GSSAPI_OPT_DO_NOT_FREE_GSS_CONTEXT	0x0001
287 #define LDAP_GSSAPI_OPT_ALLOW_REMOTE_PRINCIPAL	0x0002
288 	unsigned ldo_gssapi_options;
289 #define LDAP_LDO_GSSAPI_NULLARG ,0,0
290 #else
291 #define LDAP_LDO_GSSAPI_NULLARG
292 #endif
293 
294 #ifdef LDAP_R_COMPILE
295 	ldap_pvt_thread_mutex_t	ldo_mutex;
296 #define LDAP_LDO_MUTEX_NULLARG	, LDAP_PVT_MUTEX_NULL
297 #else
298 #define LDAP_LDO_MUTEX_NULLARG
299 #endif
300 };
301 
302 
303 /*
304  * structure for representing an LDAP server connection
305  */
306 typedef struct ldap_conn {
307 	Sockbuf		*lconn_sb;
308 #ifdef HAVE_CYRUS_SASL
309 	void		*lconn_sasl_authctx;	/* context for bind */
310 	void		*lconn_sasl_sockctx;	/* for security layer */
311 #endif
312 #ifdef HAVE_GSSAPI
313 	void		*lconn_gss_ctx;		/* gss_ctx_id_t */
314 #endif
315 	int			lconn_refcnt;
316 	time_t		lconn_created;	/* time */
317 	time_t		lconn_lastused;	/* time */
318 	int			lconn_rebind_inprogress;	/* set if rebind in progress */
319 	char		***lconn_rebind_queue;		/* used if rebind in progress */
320 	int			lconn_status;
321 #define LDAP_CONNST_NEEDSOCKET		1
322 #define LDAP_CONNST_CONNECTING		2
323 #define LDAP_CONNST_CONNECTED		3
324 	LDAPURLDesc		*lconn_server;
325 	BerElement		*lconn_ber;	/* ber receiving on this conn. */
326 
327 	struct ldap_conn *lconn_next;
328 } LDAPConn;
329 
330 
331 /*
332  * structure used to track outstanding requests
333  */
334 typedef struct ldapreq {
335 	ber_int_t	lr_msgid;	/* the message id */
336 	int		lr_status;	/* status of request */
337 #define LDAP_REQST_COMPLETED	0
338 #define LDAP_REQST_INPROGRESS	1
339 #define LDAP_REQST_CHASINGREFS	2
340 #define LDAP_REQST_NOTCONNECTED	3
341 #define LDAP_REQST_WRITING	4
342 	int		lr_refcnt;	/* count of references */
343 	int		lr_outrefcnt;	/* count of outstanding referrals */
344 	int		lr_abandoned;	/* the request has been abandoned */
345 	ber_int_t	lr_origid;	/* original request's message id */
346 	int		lr_parentcnt;	/* count of parent requests */
347 	ber_tag_t	lr_res_msgtype;	/* result message type */
348 	ber_int_t	lr_res_errno;	/* result LDAP errno */
349 	char		*lr_res_error;	/* result error string */
350 	char		*lr_res_matched;/* result matched DN string */
351 	BerElement	*lr_ber;	/* ber encoded request contents */
352 	LDAPConn	*lr_conn;	/* connection used to send request */
353 	struct berval	lr_dn;		/* DN of request, in lr_ber */
354 	struct ldapreq	*lr_parent;	/* request that spawned this referral */
355 	struct ldapreq	*lr_child;	/* first child request */
356 	struct ldapreq	*lr_refnext;	/* next referral spawned */
357 	struct ldapreq	*lr_prev;	/* previous request */
358 	struct ldapreq	*lr_next;	/* next request */
359 } LDAPRequest;
360 
361 /*
362  * structure for client cache
363  */
364 #define LDAP_CACHE_BUCKETS	31	/* cache hash table size */
365 typedef struct ldapcache {
366 	LDAPMessage	*lc_buckets[LDAP_CACHE_BUCKETS];/* hash table */
367 	LDAPMessage	*lc_requests;			/* unfulfilled reqs */
368 	long		lc_timeout;			/* request timeout */
369 	ber_len_t		lc_maxmem;			/* memory to use */
370 	ber_len_t		lc_memused;			/* memory in use */
371 	int		lc_enabled;			/* enabled? */
372 	unsigned long	lc_options;			/* options */
373 #define LDAP_CACHE_OPT_CACHENOERRS	0x00000001
374 #define LDAP_CACHE_OPT_CACHEALLERRS	0x00000002
375 }  LDAPCache;
376 
377 /*
378  * structure containing referral request info for rebind procedure
379  */
380 typedef struct ldapreqinfo {
381 	ber_len_t	ri_msgid;
382 	int			ri_request;
383 	char 		*ri_url;
384 } LDAPreqinfo;
385 
386 /*
387  * structure representing an ldap connection
388  */
389 
390 struct ldap_common {
391 	Sockbuf		*ldc_sb;	/* socket descriptor & buffer */
392 #define ld_sb			ldc->ldc_sb
393 
394 	unsigned short	ldc_lberoptions;
395 #define	ld_lberoptions		ldc->ldc_lberoptions
396 
397 	/* protected by msgid_mutex */
398 	ber_len_t		ldc_msgid;
399 #define	ld_msgid		ldc->ldc_msgid
400 
401 	/* do not mess with these */
402 	/* protected by req_mutex */
403 	LDAPRequest	*ldc_requests;	/* list of outstanding requests */
404 	/* protected by res_mutex */
405 	LDAPMessage	*ldc_responses;	/* list of outstanding responses */
406 #define	ld_requests		ldc->ldc_requests
407 #define	ld_responses		ldc->ldc_responses
408 
409 	/* protected by abandon_mutex */
410 	ber_len_t	ldc_nabandoned;
411 	ber_int_t	*ldc_abandoned;	/* array of abandoned requests */
412 #define	ld_nabandoned		ldc->ldc_nabandoned
413 #define	ld_abandoned		ldc->ldc_abandoned
414 
415 	/* unused by libldap */
416 	LDAPCache	*ldc_cache;	/* non-null if cache is initialized */
417 #define	ld_cache		ldc->ldc_cache
418 
419 	/* do not mess with the rest though */
420 
421 	/* protected by conn_mutex */
422 	LDAPConn	*ldc_defconn;	/* default connection */
423 #define	ld_defconn		ldc->ldc_defconn
424 	LDAPConn	*ldc_conns;	/* list of server connections */
425 #define	ld_conns		ldc->ldc_conns
426 	void		*ldc_selectinfo;/* platform specifics for select */
427 #define	ld_selectinfo		ldc->ldc_selectinfo
428 
429 	/* ldap_common refcnt - free only if 0 */
430 	/* protected by ldc_mutex */
431 	unsigned int		ldc_refcnt;
432 #define	ld_ldcrefcnt		ldc->ldc_refcnt
433 
434 	/* protected by ldo_mutex */
435 	struct ldapoptions ldc_options;
436 #define ld_options		ldc->ldc_options
437 
438 #define ld_valid		ld_options.ldo_valid
439 #define ld_debug		ld_options.ldo_debug
440 
441 #define ld_deref		ld_options.ldo_deref
442 #define ld_timelimit		ld_options.ldo_timelimit
443 #define ld_sizelimit		ld_options.ldo_sizelimit
444 
445 #define ld_defbinddn		ld_options.ldo_defbinddn
446 #define ld_defbase		ld_options.ldo_defbase
447 #define ld_defhost		ld_options.ldo_defhost
448 #define ld_defport		ld_options.ldo_defport
449 
450 #define ld_refhoplimit		ld_options.ldo_refhoplimit
451 
452 #define ld_sctrls		ld_options.ldo_sctrls
453 #define ld_cctrls		ld_options.ldo_cctrls
454 #define ld_rebind_proc		ld_options.ldo_rebind_proc
455 #define ld_rebind_params	ld_options.ldo_rebind_params
456 #define ld_nextref_proc		ld_options.ldo_nextref_proc
457 #define ld_nextref_params	ld_options.ldo_nextref_params
458 #define ld_urllist_proc		ld_options.ldo_urllist_proc
459 #define ld_urllist_params	ld_options.ldo_urllist_params
460 
461 #define ld_version		ld_options.ldo_version
462 
463 #ifdef LDAP_R_COMPILE
464 	ldap_pvt_thread_mutex_t	ldc_mutex;
465 	ldap_pvt_thread_mutex_t	ldc_msgid_mutex;
466 	ldap_pvt_thread_mutex_t	ldc_conn_mutex;
467 	ldap_pvt_thread_mutex_t	ldc_req_mutex;
468 	ldap_pvt_thread_mutex_t	ldc_res_mutex;
469 	ldap_pvt_thread_mutex_t	ldc_abandon_mutex;
470 #define	ld_ldopts_mutex		ld_options.ldo_mutex
471 #define	ld_ldcmutex		ldc->ldc_mutex
472 #define	ld_msgid_mutex		ldc->ldc_msgid_mutex
473 #define	ld_conn_mutex		ldc->ldc_conn_mutex
474 #define	ld_req_mutex		ldc->ldc_req_mutex
475 #define	ld_res_mutex		ldc->ldc_res_mutex
476 #define	ld_abandon_mutex	ldc->ldc_abandon_mutex
477 #endif
478 };
479 
480 struct ldap {
481 	/* thread shared */
482 	struct ldap_common	*ldc;
483 
484 	/* thread specific */
485 	ber_int_t		ld_errno;
486 	char			*ld_error;
487 	char			*ld_matched;
488 	char			**ld_referrals;
489 };
490 
491 #define LDAP_VALID(ld)		( (ld)->ld_valid == LDAP_VALID_SESSION )
492 #define LDAP_TRASHED(ld)	( (ld)->ld_valid == LDAP_TRASHED_SESSION )
493 #define LDAP_TRASH(ld)		( (ld)->ld_valid = LDAP_TRASHED_SESSION )
494 
495 #ifdef LDAP_R_COMPILE
496 LDAP_V ( ldap_pvt_thread_mutex_t ) ldap_int_resolv_mutex;
497 LDAP_V ( ldap_pvt_thread_mutex_t ) ldap_int_hostname_mutex;
498 
499 #ifdef HAVE_GSSAPI
500 LDAP_V( ldap_pvt_thread_mutex_t ) ldap_int_gssapi_mutex;
501 #endif
502 #endif
503 
504 #ifdef LDAP_R_COMPILE
505 #define LDAP_MUTEX_LOCK(mutex)    ldap_pvt_thread_mutex_lock( mutex )
506 #define LDAP_MUTEX_UNLOCK(mutex)  ldap_pvt_thread_mutex_unlock( mutex )
507 #define LDAP_ASSERT_MUTEX_OWNER(mutex) \
508 	LDAP_PVT_THREAD_ASSERT_MUTEX_OWNER(mutex)
509 #else
510 #define LDAP_MUTEX_LOCK(mutex)    ((void) 0)
511 #define LDAP_MUTEX_UNLOCK(mutex)  ((void) 0)
512 #define LDAP_ASSERT_MUTEX_OWNER(mutex) ((void) 0)
513 #endif
514 
515 #define	LDAP_NEXT_MSGID(ld, id) do { \
516 	LDAP_MUTEX_LOCK( &(ld)->ld_msgid_mutex ); \
517 	(id) = ++(ld)->ld_msgid; \
518 	LDAP_MUTEX_UNLOCK( &(ld)->ld_msgid_mutex ); \
519 } while (0)
520 
521 /*
522  * in abandon.c
523  */
524 
525 LDAP_F (int)
526 ldap_int_bisect_find( ber_int_t *v, ber_len_t n, ber_int_t id, int *idxp );
527 LDAP_F (int)
528 ldap_int_bisect_insert( ber_int_t **vp, ber_len_t *np, int id, int idx );
529 LDAP_F (int)
530 ldap_int_bisect_delete( ber_int_t **vp, ber_len_t *np, int id, int idx );
531 
532 /*
533  * in add.c
534  */
535 
536 LDAP_F (BerElement *) ldap_build_add_req LDAP_P((
537 	LDAP *ld,
538 	const char *dn,
539 	LDAPMod **attrs,
540 	LDAPControl **sctrls,
541 	LDAPControl **cctrls,
542 	ber_int_t *msgidp ));
543 
544 /*
545  * in compare.c
546  */
547 
548 LDAP_F (BerElement *) ldap_build_compare_req LDAP_P((
549 	LDAP *ld,
550 	const char *dn,
551 	const char *attr,
552 	struct berval *bvalue,
553 	LDAPControl **sctrls,
554 	LDAPControl **cctrls,
555 	ber_int_t *msgidp ));
556 
557 /*
558  * in delete.c
559  */
560 
561 LDAP_F (BerElement *) ldap_build_delete_req LDAP_P((
562 	LDAP *ld,
563 	const char *dn,
564 	LDAPControl **sctrls,
565 	LDAPControl **cctrls,
566 	ber_int_t *msgidp ));
567 
568 /*
569  * in extended.c
570  */
571 
572 LDAP_F (BerElement *) ldap_build_extended_req LDAP_P((
573 	LDAP *ld,
574 	const char *reqoid,
575 	struct berval *reqdata,
576 	LDAPControl **sctrls,
577 	LDAPControl **cctrls,
578 	ber_int_t *msgidp ));
579 
580 /*
581  * in init.c
582  */
583 
584 LDAP_V ( struct ldapoptions ) ldap_int_global_options;
585 
586 LDAP_F ( void ) ldap_int_initialize LDAP_P((struct ldapoptions *, int *));
587 LDAP_F ( void ) ldap_int_initialize_global_options LDAP_P((
588 	struct ldapoptions *, int *));
589 
590 /* memory.c */
591 	/* simple macros to realloc for now */
592 #define LDAP_MALLOC(s)		(ber_memalloc_x((s),NULL))
593 #define LDAP_CALLOC(n,s)	(ber_memcalloc_x((n),(s),NULL))
594 #define LDAP_REALLOC(p,s)	(ber_memrealloc_x((p),(s),NULL))
595 #define LDAP_FREE(p)		(ber_memfree_x((p),NULL))
596 #define LDAP_VFREE(v)		(ber_memvfree_x((void **)(v),NULL))
597 #define LDAP_STRDUP(s)		(ber_strdup_x((s),NULL))
598 #define LDAP_STRNDUP(s,l)	(ber_strndup_x((s),(l),NULL))
599 
600 #define LDAP_MALLOCX(s,x)	(ber_memalloc_x((s),(x)))
601 #define LDAP_CALLOCX(n,s,x)	(ber_memcalloc_x((n),(s),(x)))
602 #define LDAP_REALLOCX(p,s,x)	(ber_memrealloc_x((p),(s),(x)))
603 #define LDAP_FREEX(p,x)		(ber_memfree_x((p),(x)))
604 #define LDAP_VFREEX(v,x)	(ber_memvfree_x((void **)(v),(x)))
605 #define LDAP_STRDUPX(s,x)	(ber_strdup_x((s),(x)))
606 #define LDAP_STRNDUPX(s,l,x)	(ber_strndup_x((s),(l),(x)))
607 
608 /*
609  * in error.c
610  */
611 LDAP_F (void) ldap_int_error_init( void );
612 
613 /*
614  * in modify.c
615  */
616 
617 LDAP_F (BerElement *) ldap_build_modify_req LDAP_P((
618 	LDAP *ld,
619 	const char *dn,
620 	LDAPMod **mods,
621 	LDAPControl **sctrls,
622 	LDAPControl **cctrls,
623 	ber_int_t *msgidp ));
624 
625 /*
626  * in modrdn.c
627  */
628 
629 LDAP_F (BerElement *) ldap_build_moddn_req LDAP_P((
630 	LDAP *ld,
631 	const char *dn,
632 	const char *newrdn,
633 	const char *newSuperior,
634 	int deleteoldrdn,
635 	LDAPControl **sctrls,
636 	LDAPControl **cctrls,
637 	ber_int_t *msgidp ));
638 
639 /*
640  * in unit-int.c
641  */
642 LDAP_F (void) ldap_int_utils_init LDAP_P(( void ));
643 
644 
645 /*
646  * in print.c
647  */
648 LDAP_F (int) ldap_log_printf LDAP_P((LDAP *ld, int level, const char *fmt, ...)) LDAP_GCCATTR((format(printf, 3, 4)));
649 
650 /*
651  * in cache.c
652  */
653 LDAP_F (void) ldap_add_request_to_cache LDAP_P(( LDAP *ld, ber_tag_t msgtype,
654         BerElement *request ));
655 LDAP_F (void) ldap_add_result_to_cache LDAP_P(( LDAP *ld, LDAPMessage *result ));
656 LDAP_F (int) ldap_check_cache LDAP_P(( LDAP *ld, ber_tag_t msgtype, BerElement *request ));
657 
658 /*
659  * in controls.c
660  */
661 LDAP_F (int) ldap_int_put_controls LDAP_P((
662 	LDAP *ld,
663 	LDAPControl *const *ctrls,
664 	BerElement *ber ));
665 
666 LDAP_F (int) ldap_int_client_controls LDAP_P((
667 	LDAP *ld,
668 	LDAPControl **ctrlp ));
669 
670 /*
671  * in dsparse.c
672  */
673 LDAP_F (int) ldap_int_next_line_tokens LDAP_P(( char **bufp, ber_len_t *blenp, char ***toksp ));
674 
675 
676 /*
677  * in open.c
678  */
679 LDAP_F (int) ldap_open_defconn( LDAP *ld );
680 LDAP_F (int) ldap_int_open_connection( LDAP *ld,
681 	LDAPConn *conn, LDAPURLDesc *srvlist, int async );
682 LDAP_F (int) ldap_int_check_async_open( LDAP *ld, ber_socket_t sd );
683 
684 /*
685  * in os-ip.c
686  */
687 #ifndef HAVE_POLL
688 LDAP_V (int) ldap_int_tblsize;
689 LDAP_F (void) ldap_int_ip_init( void );
690 #endif
691 
692 LDAP_F (int) ldap_int_timeval_dup( struct timeval **dest,
693 	const struct timeval *tm );
694 LDAP_F (int) ldap_connect_to_host( LDAP *ld, Sockbuf *sb,
695 	int proto, LDAPURLDesc *srv, int async );
696 LDAP_F (int) ldap_int_poll( LDAP *ld, ber_socket_t s,
697 	struct timeval *tvp, int wr );
698 
699 #if defined(HAVE_TLS) || defined(HAVE_CYRUS_SASL)
700 LDAP_V (char *) ldap_int_hostname;
701 LDAP_F (char *) ldap_host_connected_to( Sockbuf *sb,
702 	const char *host );
703 #endif
704 
705 LDAP_F (int) ldap_int_select( LDAP *ld, struct timeval *timeout );
706 LDAP_F (void *) ldap_new_select_info( void );
707 LDAP_F (void) ldap_free_select_info( void *sip );
708 LDAP_F (void) ldap_mark_select_write( LDAP *ld, Sockbuf *sb );
709 LDAP_F (void) ldap_mark_select_read( LDAP *ld, Sockbuf *sb );
710 LDAP_F (void) ldap_mark_select_clear( LDAP *ld, Sockbuf *sb );
711 LDAP_F (void) ldap_clear_select_write( LDAP *ld, Sockbuf *sb );
712 LDAP_F (int) ldap_is_read_ready( LDAP *ld, Sockbuf *sb );
713 LDAP_F (int) ldap_is_write_ready( LDAP *ld, Sockbuf *sb );
714 
715 LDAP_F (int) ldap_int_connect_cbs( LDAP *ld, Sockbuf *sb,
716 	ber_socket_t *s, LDAPURLDesc *srv, struct sockaddr *addr );
717 
718 /*
719  * in os-local.c
720  */
721 #ifdef LDAP_PF_LOCAL
722 LDAP_F (int) ldap_connect_to_path( LDAP *ld, Sockbuf *sb,
723 	LDAPURLDesc *srv, int async );
724 #endif /* LDAP_PF_LOCAL */
725 
726 /*
727  * in request.c
728  */
729 LDAP_F (ber_int_t) ldap_send_initial_request( LDAP *ld, ber_tag_t msgtype,
730 	const char *dn, BerElement *ber, ber_int_t msgid );
731 LDAP_F (BerElement *) ldap_alloc_ber_with_options( LDAP *ld );
732 LDAP_F (void) ldap_set_ber_options( LDAP *ld, BerElement *ber );
733 
734 LDAP_F (int) ldap_send_server_request( LDAP *ld, BerElement *ber,
735 	ber_int_t msgid, LDAPRequest *parentreq, LDAPURLDesc **srvlist,
736 	LDAPConn *lc, LDAPreqinfo *bind, int noconn, int m_res );
737 LDAP_F (LDAPConn *) ldap_new_connection( LDAP *ld, LDAPURLDesc **srvlist,
738 	int use_ldsb, int connect, LDAPreqinfo *bind, int m_req, int m_res );
739 LDAP_F (LDAPRequest *) ldap_find_request_by_msgid( LDAP *ld, ber_int_t msgid );
740 LDAP_F (void) ldap_return_request( LDAP *ld, LDAPRequest *lr, int freeit );
741 LDAP_F (void) ldap_free_request( LDAP *ld, LDAPRequest *lr );
742 LDAP_F (void) ldap_free_connection( LDAP *ld, LDAPConn *lc, int force, int unbind );
743 LDAP_F (void) ldap_dump_connection( LDAP *ld, LDAPConn *lconns, int all );
744 LDAP_F (void) ldap_dump_requests_and_responses( LDAP *ld );
745 LDAP_F (int) ldap_chase_referrals( LDAP *ld, LDAPRequest *lr,
746 	char **errstrp, int sref, int *hadrefp );
747 LDAP_F (int) ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr,
748 	char **refs, int sref, char **referralsp, int *hadrefp );
749 LDAP_F (int) ldap_append_referral( LDAP *ld, char **referralsp, char *s );
750 LDAP_F (int) ldap_int_flush_request( LDAP *ld, LDAPRequest *lr );
751 
752 /*
753  * in result.c:
754  */
755 LDAP_F (const char *) ldap_int_msgtype2str( ber_tag_t tag );
756 
757 /*
758  * in search.c
759  */
760 LDAP_F (BerElement *) ldap_build_search_req LDAP_P((
761 	LDAP *ld,
762 	const char *base,
763 	ber_int_t scope,
764 	const char *filter,
765 	char **attrs,
766 	ber_int_t attrsonly,
767 	LDAPControl **sctrls,
768 	LDAPControl **cctrls,
769 	ber_int_t timelimit,
770 	ber_int_t sizelimit,
771 	ber_int_t deref,
772 	ber_int_t *msgidp));
773 
774 
775 /*
776  * in unbind.c
777  */
778 LDAP_F (int) ldap_ld_free LDAP_P((
779 	LDAP *ld,
780 	int close,
781 	LDAPControl **sctrls,
782 	LDAPControl **cctrls ));
783 
784 LDAP_F (int) ldap_send_unbind LDAP_P((
785 	LDAP *ld,
786 	Sockbuf *sb,
787 	LDAPControl **sctrls,
788 	LDAPControl **cctrls ));
789 
790 /*
791  * in url.c
792  */
793 LDAP_F (LDAPURLDesc *) ldap_url_dup LDAP_P((
794 	LDAPURLDesc *ludp ));
795 
796 LDAP_F (LDAPURLDesc *) ldap_url_duplist LDAP_P((
797 	LDAPURLDesc *ludlist ));
798 
799 LDAP_F (int) ldap_url_parsehosts LDAP_P((
800 	LDAPURLDesc **ludlist,
801 	const char *hosts,
802 	int port ));
803 
804 LDAP_F (char *) ldap_url_list2hosts LDAP_P((
805 	LDAPURLDesc *ludlist ));
806 
807 /*
808  * in cyrus.c
809  */
810 
811 LDAP_F (int) ldap_int_sasl_init LDAP_P(( void ));
812 
813 LDAP_F (int) ldap_int_sasl_open LDAP_P((
814 	LDAP *ld, LDAPConn *conn,
815 	const char* host ));
816 LDAP_F (int) ldap_int_sasl_close LDAP_P(( LDAP *ld, LDAPConn *conn ));
817 
818 LDAP_F (int) ldap_int_sasl_external LDAP_P((
819 	LDAP *ld, LDAPConn *conn,
820 	const char* authid, ber_len_t ssf ));
821 
822 LDAP_F (int) ldap_int_sasl_get_option LDAP_P(( LDAP *ld,
823 	int option, void *arg ));
824 LDAP_F (int) ldap_int_sasl_set_option LDAP_P(( LDAP *ld,
825 	int option, void *arg ));
826 LDAP_F (int) ldap_int_sasl_config LDAP_P(( struct ldapoptions *lo,
827 	int option, const char *arg ));
828 
829 LDAP_F (int) ldap_int_sasl_bind LDAP_P((
830 	LDAP *ld,
831 	const char *,
832 	const char *,
833 	LDAPControl **, LDAPControl **,
834 
835 	/* should be passed in client controls */
836 	unsigned flags,
837 	LDAP_SASL_INTERACT_PROC *interact,
838 	void *defaults,
839 	LDAPMessage *result,
840 	const char **rmech,
841 	int *msgid ));
842 
843 /* in sasl.c */
844 
845 LDAP_F (BerElement *) ldap_build_bind_req LDAP_P((
846 	LDAP *ld,
847 	const char *dn,
848 	const char *mech,
849 	struct berval *cred,
850 	LDAPControl **sctrls,
851 	LDAPControl **cctrls,
852 	ber_int_t *msgidp ));
853 
854 /* in schema.c */
855 LDAP_F (char *) ldap_int_parse_numericoid LDAP_P((
856 	const char **sp,
857 	int *code,
858 	const int flags ));
859 
860 /*
861  * in tls.c
862  */
863 LDAP_F (int) ldap_int_tls_config LDAP_P(( LDAP *ld,
864 	int option, const char *arg ));
865 
866 LDAP_F (int) ldap_int_tls_start LDAP_P(( LDAP *ld,
867 	LDAPConn *conn, LDAPURLDesc *srv ));
868 
869 LDAP_F (void) ldap_int_tls_destroy LDAP_P(( struct ldapoptions *lo ));
870 
871 /*
872  *	in getvalues.c
873  */
874 LDAP_F (char **) ldap_value_dup LDAP_P((
875 	char *const *vals ));
876 
877 /*
878  *	in gssapi.c
879  */
880 #ifdef HAVE_GSSAPI
881 LDAP_F(int) ldap_int_gssapi_get_option LDAP_P(( LDAP *ld, int option, void *arg ));
882 LDAP_F(int) ldap_int_gssapi_set_option LDAP_P(( LDAP *ld, int option, void *arg ));
883 LDAP_F(int) ldap_int_gssapi_config LDAP_P(( struct ldapoptions *lo, int option, const char *arg ));
884 LDAP_F(void) ldap_int_gssapi_close LDAP_P(( LDAP *ld, LDAPConn *lc ));
885 #endif
886 
887 LDAP_END_DECL
888 
889 #endif /* _LDAP_INT_H */
890