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_API_FEATURE_INFO: {
235 LDAPAPIFeatureInfo *info = (LDAPAPIFeatureInfo *) outvalue;
238 if(info == NULL) return -1;
240 if(info->ldapaif_info_version != LDAP_FEATURE_INFO_VERSION) {
241 /* api info version mismatch */
242 info->ldapaif_info_version = LDAP_FEATURE_INFO_VERSION;
246 if(info->ldapaif_name == NULL) return -1;
248 for(i=0; features[i].ldapaif_name != NULL; i++) {
249 if(!strcmp(info->ldapaif_name, features[i].ldapaif_name)) {
250 info->ldapaif_version =
251 features[i].ldapaif_version;
258 case LDAP_OPT_DEBUG_LEVEL:
259 * (int *) outvalue = lo->ldo_debug;
276 struct ldapoptions *lo;
278 if(!openldap_ldap_initialized) {
279 openldap_ldap_initialize();
283 lo = &openldap_ldap_global_options;
285 lo = &ld->ld_options;
289 case LDAP_OPT_REFERRALS:
290 if(invalue == LDAP_OPT_ON) {
291 LDAP_BOOL_SET(lo, LDAP_BOOL_REFERRALS);
293 LDAP_BOOL_CLR(lo, LDAP_BOOL_REFERRALS);
297 case LDAP_OPT_RESTART:
298 if(invalue == LDAP_OPT_ON) {
299 LDAP_BOOL_SET(lo, LDAP_BOOL_RESTART);
301 LDAP_BOOL_CLR(lo, LDAP_BOOL_RESTART);
306 if(invalue == NULL) {
307 /* no place to set from */
312 case LDAP_OPT_API_INFO:
318 lo->ldo_deref = * (int *) invalue;
321 case LDAP_OPT_SIZELIMIT:
322 lo->ldo_sizelimit = * (int *) invalue;
325 case LDAP_OPT_TIMELIMIT:
326 lo->ldo_timelimit = * (int *) invalue;
329 case LDAP_OPT_PROTOCOL_VERSION: {
330 int vers = * (int *) invalue;
331 if (vers < LDAP_VERSION_MIN || vers > LDAP_VERSION_MAX) {
335 ld->ld_version = vers;
338 case LDAP_OPT_SERVER_CONTROLS: {
339 LDAPControl **controls = (LDAPControl **) invalue;
341 ldap_controls_free( lo->ldo_sctrls );
343 if( controls == NULL || *controls == NULL ) {
344 lo->ldo_sctrls = NULL;
349 ldap_controls_dup( (LDAPControl **) invalue );
351 if(lo->ldo_sctrls == NULL) {
352 /* memory allocation error ? */
357 case LDAP_OPT_CLIENT_CONTROLS: {
358 LDAPControl **controls = (LDAPControl **) invalue;
360 ldap_controls_free( lo->ldo_cctrls );
362 if( controls == NULL || *controls == NULL ) {
363 lo->ldo_cctrls = NULL;
368 ldap_controls_dup( (LDAPControl **) invalue );
370 if(lo->ldo_cctrls == NULL) {
371 /* memory allocation error ? */
376 case LDAP_OPT_HOST_NAME: {
377 char* host = (char *) invalue;
379 if(lo->ldo_defhost != NULL) {
380 free(lo->ldo_defhost);
381 lo->ldo_defhost = NULL;
385 lo->ldo_defhost = strdup(host);
391 * must want global default returned
392 * to initial condition.
394 lo->ldo_defhost = strdup("localhost");
398 * must want the session default
399 * updated to the current global default
401 lo->ldo_defhost = strdup(
402 openldap_ldap_global_options.ldo_defhost);
406 case LDAP_OPT_ERROR_NUMBER: {
407 int err = * (int *) invalue;
410 /* need a struct ldap */
417 case LDAP_OPT_ERROR_STRING: {
418 char* err = (char *) invalue;
421 /* need a struct ldap */
429 ld->ld_error = strdup(err);
432 case LDAP_OPT_API_FEATURE_INFO:
436 case LDAP_OPT_DEBUG_LEVEL:
437 lo->ldo_debug = * (int *) invalue;