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();
91 if(outvalue == NULL) {
92 /* no place to get to */
93 return LDAP_OPT_ERROR;
97 lo = &ldap_int_global_options;
100 assert( LDAP_VALID( ld ) );
102 if( !LDAP_VALID( ld ) ) {
103 return LDAP_OPT_ERROR;
106 lo = &ld->ld_options;
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 * (int *) 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:
204 * draft-ietf-ldapext-ldap-c-api-01 doesn't state
205 * whether caller has to free host names or not,
209 * (char **) outvalue = LDAP_STRDUP(lo->ldo_defhost);
210 return LDAP_OPT_SUCCESS;
212 case LDAP_OPT_ERROR_NUMBER:
217 * (int *) outvalue = ld->ld_errno;
218 return LDAP_OPT_SUCCESS;
220 case LDAP_OPT_ERROR_STRING:
227 * draft-ietf-ldapext-ldap-c-api-01 doesn't require
228 * the client to have to free error strings, we do
231 if( ld->ld_error == NULL ) {
232 * (char **) outvalue = NULL;
234 * (char **) outvalue = LDAP_STRDUP(ld->ld_error);
237 return LDAP_OPT_SUCCESS;
239 case LDAP_OPT_MATCH_STRING:
246 * draft-ietf-ldapext-ldap-c-api-01 doesn't require
247 * the client to have to free error strings, we do
250 if( ld->ld_matched == NULL ) {
251 * (char **) outvalue = NULL;
253 * (char **) outvalue = LDAP_STRDUP(ld->ld_matched);
258 case LDAP_OPT_API_FEATURE_INFO: {
259 LDAPAPIFeatureInfo *info = (LDAPAPIFeatureInfo *) outvalue;
262 if(info == NULL) return LDAP_OPT_ERROR;
264 if(info->ldapaif_info_version != LDAP_FEATURE_INFO_VERSION) {
265 /* api info version mismatch */
266 info->ldapaif_info_version = LDAP_FEATURE_INFO_VERSION;
267 return LDAP_OPT_ERROR;
270 if(info->ldapaif_name == NULL) return LDAP_OPT_ERROR;
272 for(i=0; features[i].ldapaif_name != NULL; i++) {
273 if(!strcmp(info->ldapaif_name, features[i].ldapaif_name)) {
274 info->ldapaif_version =
275 features[i].ldapaif_version;
276 return LDAP_OPT_SUCCESS;
282 case LDAP_OPT_DEBUG_LEVEL:
283 * (int *) outvalue = lo->ldo_debug;
284 return LDAP_OPT_SUCCESS;
291 return LDAP_OPT_ERROR;
298 LDAP_CONST void *invalue)
300 struct ldapoptions *lo;
302 if( ldap_int_global_options.ldo_valid != LDAP_INITIALIZED ) {
303 ldap_int_initialize();
307 lo = &ldap_int_global_options;
310 assert( LDAP_VALID( ld ) );
312 if( !LDAP_VALID( ld ) ) {
313 return LDAP_OPT_ERROR;
316 lo = &ld->ld_options;
320 case LDAP_OPT_REFERRALS:
321 if(invalue == LDAP_OPT_OFF) {
322 LDAP_BOOL_CLR(lo, LDAP_BOOL_REFERRALS);
324 LDAP_BOOL_SET(lo, LDAP_BOOL_REFERRALS);
326 return LDAP_OPT_SUCCESS;
328 case LDAP_OPT_RESTART:
329 if(invalue == LDAP_OPT_OFF) {
330 LDAP_BOOL_CLR(lo, LDAP_BOOL_RESTART);
332 LDAP_BOOL_SET(lo, LDAP_BOOL_RESTART);
334 return LDAP_OPT_SUCCESS;
337 if(invalue == NULL) {
338 /* no place to set from */
339 return LDAP_OPT_ERROR;
343 case LDAP_OPT_API_INFO:
349 lo->ldo_deref = * (int *) invalue;
350 return LDAP_OPT_SUCCESS;
352 case LDAP_OPT_SIZELIMIT:
353 lo->ldo_sizelimit = * (int *) invalue;
354 return LDAP_OPT_SUCCESS;
356 case LDAP_OPT_TIMELIMIT:
357 lo->ldo_timelimit = * (int *) invalue;
358 return LDAP_OPT_SUCCESS;
360 case LDAP_OPT_PROTOCOL_VERSION: {
361 int vers = * (int *) invalue;
362 if (vers < LDAP_VERSION_MIN || vers > LDAP_VERSION_MAX) {
366 ld->ld_version = vers;
367 } return LDAP_OPT_SUCCESS;
369 case LDAP_OPT_SERVER_CONTROLS: {
370 LDAPControl **controls = (LDAPControl **) invalue;
372 ldap_controls_free( lo->ldo_sctrls );
374 if( controls == NULL || *controls == NULL ) {
375 lo->ldo_sctrls = NULL;
376 return LDAP_OPT_SUCCESS;
380 ldap_controls_dup( (LDAPControl **) invalue );
382 if(lo->ldo_sctrls == NULL) {
383 /* memory allocation error ? */
386 } return LDAP_OPT_SUCCESS;
388 case LDAP_OPT_CLIENT_CONTROLS: {
389 LDAPControl **controls = (LDAPControl **) invalue;
391 ldap_controls_free( lo->ldo_cctrls );
393 if( controls == NULL || *controls == NULL ) {
394 lo->ldo_cctrls = NULL;
395 return LDAP_OPT_SUCCESS;
399 ldap_controls_dup( (LDAPControl **) invalue );
401 if(lo->ldo_cctrls == NULL) {
402 /* memory allocation error ? */
405 } return LDAP_OPT_SUCCESS;
407 case LDAP_OPT_HOST_NAME: {
408 char* host = (char *) invalue;
410 if(lo->ldo_defhost != NULL) {
411 LDAP_FREE(lo->ldo_defhost);
412 lo->ldo_defhost = NULL;
416 lo->ldo_defhost = LDAP_STRDUP(host);
417 return LDAP_OPT_SUCCESS;
422 * must want global default returned
423 * to initial condition.
425 lo->ldo_defhost = LDAP_STRDUP("localhost");
429 * must want the session default
430 * updated to the current global default
432 lo->ldo_defhost = LDAP_STRDUP(
433 ldap_int_global_options.ldo_defhost);
435 } return LDAP_OPT_SUCCESS;
437 case LDAP_OPT_ERROR_NUMBER: {
438 int err = * (int *) invalue;
441 /* need a struct ldap */
446 } return LDAP_OPT_SUCCESS;
448 case LDAP_OPT_ERROR_STRING: {
449 char* err = (char *) invalue;
452 /* need a struct ldap */
457 LDAP_FREE(ld->ld_error);
460 ld->ld_error = LDAP_STRDUP(err);
461 } return LDAP_OPT_SUCCESS;
463 case LDAP_OPT_API_FEATURE_INFO:
467 case LDAP_OPT_DEBUG_LEVEL:
468 lo->ldo_debug = * (int *) invalue;
469 return LDAP_OPT_SUCCESS;
475 return LDAP_OPT_ERROR;