2 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
11 #include <ac/socket.h>
12 #include <ac/string.h>
16 static const LDAPAPIFeatureInfo features[] = {
17 #ifdef LDAP_API_FEATURE_X_OPENLDAP
18 { /* OpenLDAP Extensions API Feature */
19 LDAP_FEATURE_INFO_VERSION,
21 LDAP_API_FEATURE_X_OPENLDAP
25 #ifdef LDAP_API_FEATURE_THREAD_SAFE
26 { /* Basic Thread Safe */
27 LDAP_FEATURE_INFO_VERSION,
29 LDAP_API_FEATURE_THREAD_SAFE
32 #ifdef LDAP_API_FEATURE_SESSION_THREAD_SAFE
33 { /* Session Thread Safe */
34 LDAP_FEATURE_INFO_VERSION,
35 "SESSION_THREAD_SAFE",
36 LDAP_API_FEATURE_SESSION_THREAD_SAFE
39 #ifdef LDAP_API_FEATURE_OPERATION_THREAD_SAFE
40 { /* Operation Thread Safe */
41 LDAP_FEATURE_INFO_VERSION,
42 "OPERATION_THREAD_SAFE",
43 LDAP_API_FEATURE_OPERATION_THREAD_SAFE
46 #ifdef LDAP_API_FEATURE_X_OPENLDAP_REENTRANT
47 { /* OpenLDAP Reentrant */
48 LDAP_FEATURE_INFO_VERSION,
49 "X_OPENLDAP_REENTRANT",
50 LDAP_API_FEATURE_X_OPENLDAP_REENTRANT
53 #if defined( LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE ) && \
54 defined( LDAP_THREAD_SAFE )
55 { /* OpenLDAP Thread Safe */
56 LDAP_FEATURE_INFO_VERSION,
57 "X_OPENLDAP_THREAD_SAFE",
58 LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE
61 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
63 LDAP_FEATURE_INFO_VERSION,
65 LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
68 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
70 LDAP_FEATURE_INFO_VERSION,
71 "X_OPENLDAP_V2_REFERRALS",
72 LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
84 struct ldapoptions *lo;
86 if(!openldap_ldap_initialized) {
87 openldap_ldap_initialize();
90 if(outvalue == NULL) {
91 /* no place to get to */
96 lo = &openldap_ldap_global_options;
102 case LDAP_OPT_API_INFO: {
103 struct ldapapiinfo *info = (struct ldapapiinfo *) outvalue;
106 /* outvalue must point to an apiinfo structure */
110 if(info->ldapai_info_version != LDAP_API_INFO_VERSION) {
111 /* api info version mismatch */
112 info->ldapai_info_version = LDAP_API_INFO_VERSION;
116 info->ldapai_api_version = LDAP_API_VERSION;
117 info->ldapai_api_version = LDAP_API_VERSION;
118 info->ldapai_protocol_version = LDAP_VERSION_MAX;
120 if(features[0].ldapaif_name == NULL) {
121 info->ldapai_extensions = NULL;
124 info->ldapai_extensions = malloc(sizeof(char *) *
125 sizeof(features)/sizeof(LDAPAPIFeatureInfo));
127 for(i=0; features[i].ldapaif_name != NULL; i++) {
128 info->ldapai_extensions[i] =
129 strdup(features[i].ldapaif_name);
132 info->ldapai_extensions[i] = NULL;
135 info->ldapai_vendor_name = strdup(LDAP_VENDOR_NAME);
136 info->ldapai_vendor_version = LDAP_VENDOR_VERSION;
147 * (int *) outvalue = ber_pvt_sb_get_desc( &(ld->ld_sb) );
151 * (int *) outvalue = lo->ldo_deref;
154 case LDAP_OPT_SIZELIMIT:
155 * (int *) outvalue = lo->ldo_sizelimit;
158 case LDAP_OPT_TIMELIMIT:
159 * (int *) outvalue = lo->ldo_timelimit;
162 case LDAP_OPT_REFERRALS:
163 * (int *) outvalue = (LDAP_BOOL_GET(lo, LDAP_BOOL_REFERRALS) ==
167 case LDAP_OPT_RESTART:
168 * (int *) outvalue = (LDAP_BOOL_GET(lo, LDAP_BOOL_RESTART) ==
172 case LDAP_OPT_DNS: /* LDAPv2 */
173 * (int *) outvalue = (LDAP_BOOL_GET(lo, LDAP_BOOL_DNS) ==
177 case LDAP_OPT_PROTOCOL_VERSION:
178 if ((ld != NULL) && ld->ld_version) {
179 * (int *) outvalue = ld->ld_version;
181 * (int *) outvalue = lo->ldo_version;
185 case LDAP_OPT_SERVER_CONTROLS:
186 * (LDAPControl ***) outvalue =
187 ldap_controls_dup( lo->ldo_sctrls );
191 case LDAP_OPT_CLIENT_CONTROLS:
192 * (LDAPControl ***) outvalue =
193 ldap_controls_dup( lo->ldo_cctrls );
197 case LDAP_OPT_HOST_NAME:
199 * draft-ietf-ldapext-ldap-c-api-01 doesn't state
200 * whether caller has to free host names or not,
204 * (char **) outvalue = strdup(lo->ldo_defhost);
207 case LDAP_OPT_ERROR_NUMBER:
212 * (int *) outvalue = ld->ld_errno;
215 case LDAP_OPT_ERROR_STRING:
222 * draft-ietf-ldapext-ldap-c-api-01 doesn't require
223 * the client to have to free error strings, we do
226 if( ld->ld_error == NULL ) {
227 * (char **) outvalue = NULL;
229 * (char **) outvalue = strdup(ld->ld_error);
234 case LDAP_OPT_MATCH_STRING:
241 * draft-ietf-ldapext-ldap-c-api-01 doesn't require
242 * the client to have to free error strings, we do
245 if( ld->ld_matched == NULL ) {
246 * (char **) outvalue = NULL;
248 * (char **) outvalue = strdup(ld->ld_matched);
253 case LDAP_OPT_API_FEATURE_INFO: {
254 LDAPAPIFeatureInfo *info = (LDAPAPIFeatureInfo *) outvalue;
257 if(info == NULL) return -1;
259 if(info->ldapaif_info_version != LDAP_FEATURE_INFO_VERSION) {
260 /* api info version mismatch */
261 info->ldapaif_info_version = LDAP_FEATURE_INFO_VERSION;
265 if(info->ldapaif_name == NULL) return -1;
267 for(i=0; features[i].ldapaif_name != NULL; i++) {
268 if(!strcmp(info->ldapaif_name, features[i].ldapaif_name)) {
269 info->ldapaif_version =
270 features[i].ldapaif_version;
277 case LDAP_OPT_DEBUG_LEVEL:
278 * (int *) outvalue = lo->ldo_debug;
293 LDAP_CONST void *invalue)
295 struct ldapoptions *lo;
297 if(!openldap_ldap_initialized) {
298 openldap_ldap_initialize();
302 lo = &openldap_ldap_global_options;
304 lo = &ld->ld_options;
308 case LDAP_OPT_REFERRALS:
309 if(invalue == LDAP_OPT_ON) {
310 LDAP_BOOL_SET(lo, LDAP_BOOL_REFERRALS);
312 LDAP_BOOL_CLR(lo, LDAP_BOOL_REFERRALS);
316 case LDAP_OPT_RESTART:
317 if(invalue == LDAP_OPT_ON) {
318 LDAP_BOOL_SET(lo, LDAP_BOOL_RESTART);
320 LDAP_BOOL_CLR(lo, LDAP_BOOL_RESTART);
325 if(invalue == NULL) {
326 /* no place to set from */
331 case LDAP_OPT_API_INFO:
337 lo->ldo_deref = * (int *) invalue;
340 case LDAP_OPT_SIZELIMIT:
341 lo->ldo_sizelimit = * (int *) invalue;
344 case LDAP_OPT_TIMELIMIT:
345 lo->ldo_timelimit = * (int *) invalue;
348 case LDAP_OPT_PROTOCOL_VERSION: {
349 int vers = * (int *) invalue;
350 if (vers < LDAP_VERSION_MIN || vers > LDAP_VERSION_MAX) {
354 ld->ld_version = vers;
357 case LDAP_OPT_SERVER_CONTROLS: {
358 LDAPControl **controls = (LDAPControl **) invalue;
360 ldap_controls_free( lo->ldo_sctrls );
362 if( controls == NULL || *controls == NULL ) {
363 lo->ldo_sctrls = NULL;
368 ldap_controls_dup( (LDAPControl **) invalue );
370 if(lo->ldo_sctrls == NULL) {
371 /* memory allocation error ? */
376 case LDAP_OPT_CLIENT_CONTROLS: {
377 LDAPControl **controls = (LDAPControl **) invalue;
379 ldap_controls_free( lo->ldo_cctrls );
381 if( controls == NULL || *controls == NULL ) {
382 lo->ldo_cctrls = NULL;
387 ldap_controls_dup( (LDAPControl **) invalue );
389 if(lo->ldo_cctrls == NULL) {
390 /* memory allocation error ? */
395 case LDAP_OPT_HOST_NAME: {
396 char* host = (char *) invalue;
398 if(lo->ldo_defhost != NULL) {
399 free(lo->ldo_defhost);
400 lo->ldo_defhost = NULL;
404 lo->ldo_defhost = strdup(host);
410 * must want global default returned
411 * to initial condition.
413 lo->ldo_defhost = strdup("localhost");
417 * must want the session default
418 * updated to the current global default
420 lo->ldo_defhost = strdup(
421 openldap_ldap_global_options.ldo_defhost);
425 case LDAP_OPT_ERROR_NUMBER: {
426 int err = * (int *) invalue;
429 /* need a struct ldap */
436 case LDAP_OPT_ERROR_STRING: {
437 char* err = (char *) invalue;
440 /* need a struct ldap */
448 ld->ld_error = strdup(err);
451 case LDAP_OPT_API_FEATURE_INFO:
455 case LDAP_OPT_DEBUG_LEVEL:
456 lo->ldo_debug = * (int *) invalue;