2 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
10 #include <ac/stdlib.h>
12 #include <ac/socket.h>
13 #include <ac/string.h>
17 static const LDAPAPIFeatureInfo features[] = {
18 #ifdef LDAP_API_FEATURE_X_OPENLDAP
19 { /* OpenLDAP Extensions API Feature */
20 LDAP_FEATURE_INFO_VERSION,
22 LDAP_API_FEATURE_X_OPENLDAP
26 #ifdef LDAP_API_FEATURE_THREAD_SAFE
27 { /* Basic Thread Safe */
28 LDAP_FEATURE_INFO_VERSION,
30 LDAP_API_FEATURE_THREAD_SAFE
33 #ifdef LDAP_API_FEATURE_SESSION_THREAD_SAFE
34 { /* Session Thread Safe */
35 LDAP_FEATURE_INFO_VERSION,
36 "SESSION_THREAD_SAFE",
37 LDAP_API_FEATURE_SESSION_THREAD_SAFE
40 #ifdef LDAP_API_FEATURE_OPERATION_THREAD_SAFE
41 { /* Operation Thread Safe */
42 LDAP_FEATURE_INFO_VERSION,
43 "OPERATION_THREAD_SAFE",
44 LDAP_API_FEATURE_OPERATION_THREAD_SAFE
47 #ifdef LDAP_API_FEATURE_X_OPENLDAP_REENTRANT
48 { /* OpenLDAP Reentrant */
49 LDAP_FEATURE_INFO_VERSION,
50 "X_OPENLDAP_REENTRANT",
51 LDAP_API_FEATURE_X_OPENLDAP_REENTRANT
54 #if defined( LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE ) && \
55 defined( LDAP_THREAD_SAFE )
56 { /* OpenLDAP Thread Safe */
57 LDAP_FEATURE_INFO_VERSION,
58 "X_OPENLDAP_THREAD_SAFE",
59 LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE
62 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
64 LDAP_FEATURE_INFO_VERSION,
66 LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
69 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
71 LDAP_FEATURE_INFO_VERSION,
72 "X_OPENLDAP_V2_REFERRALS",
73 LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
85 LDAP_CONST struct ldapoptions *lo;
87 if( ldap_int_global_options.ldo_valid != LDAP_INITIALIZED ) {
88 ldap_int_initialize();
92 lo = &ldap_int_global_options;
95 assert( LDAP_VALID( ld ) );
97 if( !LDAP_VALID( ld ) ) {
98 return LDAP_OPT_ERROR;
101 lo = &ld->ld_options;
104 if(outvalue == NULL) {
105 /* no place to get to */
106 return LDAP_OPT_ERROR;
110 case LDAP_OPT_API_INFO: {
111 struct ldapapiinfo *info = (struct ldapapiinfo *) outvalue;
114 /* outvalue must point to an apiinfo structure */
115 return LDAP_OPT_ERROR;
118 if(info->ldapai_info_version != LDAP_API_INFO_VERSION) {
119 /* api info version mismatch */
120 info->ldapai_info_version = LDAP_API_INFO_VERSION;
121 return LDAP_OPT_ERROR;
124 info->ldapai_api_version = LDAP_API_VERSION;
125 info->ldapai_api_version = LDAP_API_VERSION;
126 info->ldapai_protocol_version = LDAP_VERSION_MAX;
128 if(features[0].ldapaif_name == NULL) {
129 info->ldapai_extensions = NULL;
132 info->ldapai_extensions = LDAP_MALLOC(sizeof(char *) *
133 sizeof(features)/sizeof(LDAPAPIFeatureInfo));
135 for(i=0; features[i].ldapaif_name != NULL; i++) {
136 info->ldapai_extensions[i] =
137 LDAP_STRDUP(features[i].ldapaif_name);
140 info->ldapai_extensions[i] = NULL;
143 info->ldapai_vendor_name = LDAP_STRDUP(LDAP_VENDOR_NAME);
144 info->ldapai_vendor_version = LDAP_VENDOR_VERSION;
146 return LDAP_OPT_SUCCESS;
155 * (ber_socket_t *) outvalue = ber_pvt_sb_get_desc( &(ld->ld_sb) );
156 return LDAP_OPT_SUCCESS;
159 * (int *) outvalue = lo->ldo_deref;
160 return LDAP_OPT_SUCCESS;
162 case LDAP_OPT_SIZELIMIT:
163 * (int *) outvalue = lo->ldo_sizelimit;
164 return LDAP_OPT_SUCCESS;
166 case LDAP_OPT_TIMELIMIT:
167 * (int *) outvalue = lo->ldo_timelimit;
168 return LDAP_OPT_SUCCESS;
170 case LDAP_OPT_REFERRALS:
171 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_REFERRALS);
172 return LDAP_OPT_SUCCESS;
174 case LDAP_OPT_RESTART:
175 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_RESTART);
176 return LDAP_OPT_SUCCESS;
178 case LDAP_OPT_DNS: /* LDAPv2 */
179 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_DNS);
180 return LDAP_OPT_SUCCESS;
182 case LDAP_OPT_PROTOCOL_VERSION:
183 if ((ld != NULL) && ld->ld_version) {
184 * (int *) outvalue = ld->ld_version;
186 * (int *) outvalue = lo->ldo_version;
188 return LDAP_OPT_SUCCESS;
190 case LDAP_OPT_SERVER_CONTROLS:
191 * (LDAPControl ***) outvalue =
192 ldap_controls_dup( lo->ldo_sctrls );
194 return LDAP_OPT_SUCCESS;
196 case LDAP_OPT_CLIENT_CONTROLS:
197 * (LDAPControl ***) outvalue =
198 ldap_controls_dup( lo->ldo_cctrls );
200 return LDAP_OPT_SUCCESS;
202 case LDAP_OPT_HOST_NAME:
203 * (char **) outvalue = LDAP_STRDUP(lo->ldo_defhost);
204 return LDAP_OPT_SUCCESS;
206 case LDAP_OPT_ERROR_NUMBER:
211 * (int *) outvalue = ld->ld_errno;
212 return LDAP_OPT_SUCCESS;
214 case LDAP_OPT_ERROR_STRING:
220 if( ld->ld_error == NULL ) {
221 * (char **) outvalue = NULL;
223 * (char **) outvalue = LDAP_STRDUP(ld->ld_error);
226 return LDAP_OPT_SUCCESS;
228 case LDAP_OPT_MATCHED_DN:
234 if( ld->ld_matched == NULL ) {
235 * (char **) outvalue = NULL;
237 * (char **) outvalue = LDAP_STRDUP(ld->ld_matched);
240 return LDAP_OPT_SUCCESS;
242 case LDAP_OPT_API_FEATURE_INFO: {
243 LDAPAPIFeatureInfo *info = (LDAPAPIFeatureInfo *) outvalue;
246 if(info == NULL) return LDAP_OPT_ERROR;
248 if(info->ldapaif_info_version != LDAP_FEATURE_INFO_VERSION) {
249 /* api info version mismatch */
250 info->ldapaif_info_version = LDAP_FEATURE_INFO_VERSION;
251 return LDAP_OPT_ERROR;
254 if(info->ldapaif_name == NULL) return LDAP_OPT_ERROR;
256 for(i=0; features[i].ldapaif_name != NULL; i++) {
257 if(!strcmp(info->ldapaif_name, features[i].ldapaif_name)) {
258 info->ldapaif_version =
259 features[i].ldapaif_version;
260 return LDAP_OPT_SUCCESS;
266 case LDAP_OPT_DEBUG_LEVEL:
267 * (int *) outvalue = lo->ldo_debug;
268 return LDAP_OPT_SUCCESS;
272 if ( ldap_pvt_tls_get_option(lo, option, outvalue ) == 0 )
273 return LDAP_OPT_SUCCESS;
279 return LDAP_OPT_ERROR;
286 LDAP_CONST void *invalue)
288 struct ldapoptions *lo;
290 if( ldap_int_global_options.ldo_valid != LDAP_INITIALIZED ) {
291 ldap_int_initialize();
295 lo = &ldap_int_global_options;
298 assert( LDAP_VALID( ld ) );
300 if( !LDAP_VALID( ld ) ) {
301 return LDAP_OPT_ERROR;
304 lo = &ld->ld_options;
308 case LDAP_OPT_REFERRALS:
309 if(invalue == LDAP_OPT_OFF) {
310 LDAP_BOOL_CLR(lo, LDAP_BOOL_REFERRALS);
312 LDAP_BOOL_SET(lo, LDAP_BOOL_REFERRALS);
314 return LDAP_OPT_SUCCESS;
316 case LDAP_OPT_RESTART:
317 if(invalue == LDAP_OPT_OFF) {
318 LDAP_BOOL_CLR(lo, LDAP_BOOL_RESTART);
320 LDAP_BOOL_SET(lo, LDAP_BOOL_RESTART);
322 return LDAP_OPT_SUCCESS;
325 if(invalue == NULL) {
326 /* no place to set from */
327 return LDAP_OPT_ERROR;
331 case LDAP_OPT_API_INFO:
337 lo->ldo_deref = * (const int *) invalue;
338 return LDAP_OPT_SUCCESS;
340 case LDAP_OPT_SIZELIMIT:
341 lo->ldo_sizelimit = * (const int *) invalue;
342 return LDAP_OPT_SUCCESS;
344 case LDAP_OPT_TIMELIMIT:
345 lo->ldo_timelimit = * (const int *) invalue;
346 return LDAP_OPT_SUCCESS;
348 case LDAP_OPT_PROTOCOL_VERSION: {
349 int vers = * (const int *) invalue;
350 if (vers < LDAP_VERSION_MIN || vers > LDAP_VERSION_MAX) {
354 ld->ld_version = vers;
355 } return LDAP_OPT_SUCCESS;
357 case LDAP_OPT_SERVER_CONTROLS: {
358 LDAPControl *const *controls =
359 (LDAPControl *const *) invalue;
361 ldap_controls_free( lo->ldo_sctrls );
363 if( controls == NULL || *controls == NULL ) {
364 lo->ldo_sctrls = NULL;
365 return LDAP_OPT_SUCCESS;
368 lo->ldo_sctrls = ldap_controls_dup( controls );
370 if(lo->ldo_sctrls == NULL) {
371 /* memory allocation error ? */
374 } return LDAP_OPT_SUCCESS;
376 case LDAP_OPT_CLIENT_CONTROLS: {
377 LDAPControl *const *controls =
378 (LDAPControl *const *) invalue;
380 ldap_controls_free( lo->ldo_cctrls );
382 if( controls == NULL || *controls == NULL ) {
383 lo->ldo_cctrls = NULL;
384 return LDAP_OPT_SUCCESS;
387 lo->ldo_cctrls = ldap_controls_dup( controls );
389 if(lo->ldo_cctrls == NULL) {
390 /* memory allocation error ? */
393 } return LDAP_OPT_SUCCESS;
395 case LDAP_OPT_HOST_NAME: {
396 const char *host = (const char *) invalue;
398 if(lo->ldo_defhost != NULL) {
399 LDAP_FREE(lo->ldo_defhost);
400 lo->ldo_defhost = NULL;
404 lo->ldo_defhost = LDAP_STRDUP(host);
405 return LDAP_OPT_SUCCESS;
410 * must want global default returned
411 * to initial condition.
413 lo->ldo_defhost = LDAP_STRDUP("localhost");
417 * must want the session default
418 * updated to the current global default
420 lo->ldo_defhost = LDAP_STRDUP(
421 ldap_int_global_options.ldo_defhost);
423 } return LDAP_OPT_SUCCESS;
425 case LDAP_OPT_ERROR_NUMBER: {
426 int err = * (const int *) invalue;
429 /* need a struct ldap */
434 } return LDAP_OPT_SUCCESS;
436 case LDAP_OPT_ERROR_STRING: {
437 const char *err = (const char *) invalue;
440 /* need a struct ldap */
445 LDAP_FREE(ld->ld_error);
448 ld->ld_error = LDAP_STRDUP(err);
449 } return LDAP_OPT_SUCCESS;
451 case LDAP_OPT_MATCHED_DN: {
452 const char *err = (const char *) invalue;
455 /* need a struct ldap */
459 if( ld->ld_matched ) {
460 LDAP_FREE(ld->ld_matched);
463 ld->ld_matched = LDAP_STRDUP(err);
464 } return LDAP_OPT_SUCCESS;
466 case LDAP_OPT_API_FEATURE_INFO:
470 case LDAP_OPT_DEBUG_LEVEL:
471 lo->ldo_debug = * (const int *) invalue;
472 return LDAP_OPT_SUCCESS;
476 if ( ldap_pvt_tls_set_option( lo, option, invalue ) == 0 )
477 return LDAP_OPT_SUCCESS;
482 return LDAP_OPT_ERROR;