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 * (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;
275 return LDAP_OPT_ERROR;
282 LDAP_CONST void *invalue)
284 struct ldapoptions *lo;
286 if( ldap_int_global_options.ldo_valid != LDAP_INITIALIZED ) {
287 ldap_int_initialize();
291 lo = &ldap_int_global_options;
294 assert( LDAP_VALID( ld ) );
296 if( !LDAP_VALID( ld ) ) {
297 return LDAP_OPT_ERROR;
300 lo = &ld->ld_options;
304 case LDAP_OPT_REFERRALS:
305 if(invalue == LDAP_OPT_OFF) {
306 LDAP_BOOL_CLR(lo, LDAP_BOOL_REFERRALS);
308 LDAP_BOOL_SET(lo, LDAP_BOOL_REFERRALS);
310 return LDAP_OPT_SUCCESS;
312 case LDAP_OPT_RESTART:
313 if(invalue == LDAP_OPT_OFF) {
314 LDAP_BOOL_CLR(lo, LDAP_BOOL_RESTART);
316 LDAP_BOOL_SET(lo, LDAP_BOOL_RESTART);
318 return LDAP_OPT_SUCCESS;
321 if(invalue == NULL) {
322 /* no place to set from */
323 return LDAP_OPT_ERROR;
327 case LDAP_OPT_API_INFO:
333 lo->ldo_deref = * (int *) invalue;
334 return LDAP_OPT_SUCCESS;
336 case LDAP_OPT_SIZELIMIT:
337 lo->ldo_sizelimit = * (int *) invalue;
338 return LDAP_OPT_SUCCESS;
340 case LDAP_OPT_TIMELIMIT:
341 lo->ldo_timelimit = * (int *) invalue;
342 return LDAP_OPT_SUCCESS;
344 case LDAP_OPT_PROTOCOL_VERSION: {
345 int vers = * (int *) invalue;
346 if (vers < LDAP_VERSION_MIN || vers > LDAP_VERSION_MAX) {
350 ld->ld_version = vers;
351 } return LDAP_OPT_SUCCESS;
353 case LDAP_OPT_SERVER_CONTROLS: {
354 LDAPControl **controls = (LDAPControl **) invalue;
356 ldap_controls_free( lo->ldo_sctrls );
358 if( controls == NULL || *controls == NULL ) {
359 lo->ldo_sctrls = NULL;
360 return LDAP_OPT_SUCCESS;
364 ldap_controls_dup( (LDAPControl **) invalue );
366 if(lo->ldo_sctrls == NULL) {
367 /* memory allocation error ? */
370 } return LDAP_OPT_SUCCESS;
372 case LDAP_OPT_CLIENT_CONTROLS: {
373 LDAPControl **controls = (LDAPControl **) invalue;
375 ldap_controls_free( lo->ldo_cctrls );
377 if( controls == NULL || *controls == NULL ) {
378 lo->ldo_cctrls = NULL;
379 return LDAP_OPT_SUCCESS;
383 ldap_controls_dup( (LDAPControl **) invalue );
385 if(lo->ldo_cctrls == NULL) {
386 /* memory allocation error ? */
389 } return LDAP_OPT_SUCCESS;
391 case LDAP_OPT_HOST_NAME: {
392 char* host = (char *) invalue;
394 if(lo->ldo_defhost != NULL) {
395 LDAP_FREE(lo->ldo_defhost);
396 lo->ldo_defhost = NULL;
400 lo->ldo_defhost = LDAP_STRDUP(host);
401 return LDAP_OPT_SUCCESS;
406 * must want global default returned
407 * to initial condition.
409 lo->ldo_defhost = LDAP_STRDUP("localhost");
413 * must want the session default
414 * updated to the current global default
416 lo->ldo_defhost = LDAP_STRDUP(
417 ldap_int_global_options.ldo_defhost);
419 } return LDAP_OPT_SUCCESS;
421 case LDAP_OPT_ERROR_NUMBER: {
422 int err = * (int *) invalue;
425 /* need a struct ldap */
430 } return LDAP_OPT_SUCCESS;
432 case LDAP_OPT_ERROR_STRING: {
433 char* err = (char *) invalue;
436 /* need a struct ldap */
441 LDAP_FREE(ld->ld_error);
444 ld->ld_error = LDAP_STRDUP(err);
445 } return LDAP_OPT_SUCCESS;
447 case LDAP_OPT_MATCHED_DN: {
448 char* err = (char *) invalue;
451 /* need a struct ldap */
455 if( ld->ld_matched ) {
456 LDAP_FREE(ld->ld_matched);
459 ld->ld_matched = LDAP_STRDUP(err);
460 } return LDAP_OPT_SUCCESS;
462 case LDAP_OPT_API_FEATURE_INFO:
466 case LDAP_OPT_DEBUG_LEVEL:
467 lo->ldo_debug = * (int *) invalue;
468 return LDAP_OPT_SUCCESS;
474 return LDAP_OPT_ERROR;