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