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( ldap_int_global_options.ldo_valid != LDAP_INITIALIZED ) {
87 ldap_int_initialize();
90 if(outvalue == NULL) {
91 /* no place to get to */
92 return LDAP_OPT_ERROR;
96 lo = &ldap_int_global_options;
99 assert( LDAP_VALID( ld ) );
101 if( !LDAP_VALID( ld ) ) {
102 return LDAP_OPT_ERROR;
105 lo = &ld->ld_options;
109 case LDAP_OPT_API_INFO: {
110 struct ldapapiinfo *info = (struct ldapapiinfo *) outvalue;
113 /* outvalue must point to an apiinfo structure */
114 return LDAP_OPT_ERROR;
117 if(info->ldapai_info_version != LDAP_API_INFO_VERSION) {
118 /* api info version mismatch */
119 info->ldapai_info_version = LDAP_API_INFO_VERSION;
120 return LDAP_OPT_ERROR;
123 info->ldapai_api_version = LDAP_API_VERSION;
124 info->ldapai_api_version = LDAP_API_VERSION;
125 info->ldapai_protocol_version = LDAP_VERSION_MAX;
127 if(features[0].ldapaif_name == NULL) {
128 info->ldapai_extensions = NULL;
131 info->ldapai_extensions = LDAP_MALLOC(sizeof(char *) *
132 sizeof(features)/sizeof(LDAPAPIFeatureInfo));
134 for(i=0; features[i].ldapaif_name != NULL; i++) {
135 info->ldapai_extensions[i] =
136 strdup(features[i].ldapaif_name);
139 info->ldapai_extensions[i] = NULL;
142 info->ldapai_vendor_name = strdup(LDAP_VENDOR_NAME);
143 info->ldapai_vendor_version = LDAP_VENDOR_VERSION;
145 return LDAP_OPT_SUCCESS;
154 * (int *) outvalue = ber_pvt_sb_get_desc( &(ld->ld_sb) );
155 return LDAP_OPT_SUCCESS;
158 * (int *) outvalue = lo->ldo_deref;
159 return LDAP_OPT_SUCCESS;
161 case LDAP_OPT_SIZELIMIT:
162 * (int *) outvalue = lo->ldo_sizelimit;
163 return LDAP_OPT_SUCCESS;
165 case LDAP_OPT_TIMELIMIT:
166 * (int *) outvalue = lo->ldo_timelimit;
167 return LDAP_OPT_SUCCESS;
169 case LDAP_OPT_REFERRALS:
170 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_REFERRALS);
171 return LDAP_OPT_SUCCESS;
173 case LDAP_OPT_RESTART:
174 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_RESTART);
175 return LDAP_OPT_SUCCESS;
177 case LDAP_OPT_DNS: /* LDAPv2 */
178 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_DNS);
179 return LDAP_OPT_SUCCESS;
181 case LDAP_OPT_PROTOCOL_VERSION:
182 if ((ld != NULL) && ld->ld_version) {
183 * (int *) outvalue = ld->ld_version;
185 * (int *) outvalue = lo->ldo_version;
187 return LDAP_OPT_SUCCESS;
189 case LDAP_OPT_SERVER_CONTROLS:
190 * (LDAPControl ***) outvalue =
191 ldap_controls_dup( lo->ldo_sctrls );
193 return LDAP_OPT_SUCCESS;
195 case LDAP_OPT_CLIENT_CONTROLS:
196 * (LDAPControl ***) outvalue =
197 ldap_controls_dup( lo->ldo_cctrls );
199 return LDAP_OPT_SUCCESS;
201 case LDAP_OPT_HOST_NAME:
203 * draft-ietf-ldapext-ldap-c-api-01 doesn't state
204 * whether caller has to free host names or not,
208 * (char **) outvalue = strdup(lo->ldo_defhost);
209 return LDAP_OPT_SUCCESS;
211 case LDAP_OPT_ERROR_NUMBER:
216 * (int *) outvalue = ld->ld_errno;
217 return LDAP_OPT_SUCCESS;
219 case LDAP_OPT_ERROR_STRING:
226 * draft-ietf-ldapext-ldap-c-api-01 doesn't require
227 * the client to have to free error strings, we do
230 if( ld->ld_error == NULL ) {
231 * (char **) outvalue = NULL;
233 * (char **) outvalue = strdup(ld->ld_error);
236 return LDAP_OPT_SUCCESS;
238 case LDAP_OPT_MATCH_STRING:
245 * draft-ietf-ldapext-ldap-c-api-01 doesn't require
246 * the client to have to free error strings, we do
249 if( ld->ld_matched == NULL ) {
250 * (char **) outvalue = NULL;
252 * (char **) outvalue = strdup(ld->ld_matched);
257 case LDAP_OPT_API_FEATURE_INFO: {
258 LDAPAPIFeatureInfo *info = (LDAPAPIFeatureInfo *) outvalue;
261 if(info == NULL) return LDAP_OPT_ERROR;
263 if(info->ldapaif_info_version != LDAP_FEATURE_INFO_VERSION) {
264 /* api info version mismatch */
265 info->ldapaif_info_version = LDAP_FEATURE_INFO_VERSION;
266 return LDAP_OPT_ERROR;
269 if(info->ldapaif_name == NULL) return LDAP_OPT_ERROR;
271 for(i=0; features[i].ldapaif_name != NULL; i++) {
272 if(!strcmp(info->ldapaif_name, features[i].ldapaif_name)) {
273 info->ldapaif_version =
274 features[i].ldapaif_version;
275 return LDAP_OPT_SUCCESS;
281 case LDAP_OPT_DEBUG_LEVEL:
282 * (int *) outvalue = lo->ldo_debug;
283 return LDAP_OPT_SUCCESS;
290 return LDAP_OPT_ERROR;
297 LDAP_CONST void *invalue)
299 struct ldapoptions *lo;
301 if( ldap_int_global_options.ldo_valid != LDAP_INITIALIZED ) {
302 ldap_int_initialize();
306 lo = &ldap_int_global_options;
309 assert( LDAP_VALID( ld ) );
311 if( !LDAP_VALID( ld ) ) {
312 return LDAP_OPT_ERROR;
315 lo = &ld->ld_options;
319 case LDAP_OPT_REFERRALS:
320 if(invalue == LDAP_OPT_OFF) {
321 LDAP_BOOL_CLR(lo, LDAP_BOOL_REFERRALS);
323 LDAP_BOOL_SET(lo, LDAP_BOOL_REFERRALS);
325 return LDAP_OPT_SUCCESS;
327 case LDAP_OPT_RESTART:
328 if(invalue == LDAP_OPT_OFF) {
329 LDAP_BOOL_CLR(lo, LDAP_BOOL_RESTART);
331 LDAP_BOOL_SET(lo, LDAP_BOOL_RESTART);
333 return LDAP_OPT_SUCCESS;
336 if(invalue == NULL) {
337 /* no place to set from */
338 return LDAP_OPT_ERROR;
342 case LDAP_OPT_API_INFO:
348 lo->ldo_deref = * (int *) invalue;
349 return LDAP_OPT_SUCCESS;
351 case LDAP_OPT_SIZELIMIT:
352 lo->ldo_sizelimit = * (int *) invalue;
353 return LDAP_OPT_SUCCESS;
355 case LDAP_OPT_TIMELIMIT:
356 lo->ldo_timelimit = * (int *) invalue;
357 return LDAP_OPT_SUCCESS;
359 case LDAP_OPT_PROTOCOL_VERSION: {
360 int vers = * (int *) invalue;
361 if (vers < LDAP_VERSION_MIN || vers > LDAP_VERSION_MAX) {
365 ld->ld_version = vers;
366 } return LDAP_OPT_SUCCESS;
368 case LDAP_OPT_SERVER_CONTROLS: {
369 LDAPControl **controls = (LDAPControl **) invalue;
371 ldap_controls_free( lo->ldo_sctrls );
373 if( controls == NULL || *controls == NULL ) {
374 lo->ldo_sctrls = NULL;
375 return LDAP_OPT_SUCCESS;
379 ldap_controls_dup( (LDAPControl **) invalue );
381 if(lo->ldo_sctrls == NULL) {
382 /* memory allocation error ? */
385 } return LDAP_OPT_SUCCESS;
387 case LDAP_OPT_CLIENT_CONTROLS: {
388 LDAPControl **controls = (LDAPControl **) invalue;
390 ldap_controls_free( lo->ldo_cctrls );
392 if( controls == NULL || *controls == NULL ) {
393 lo->ldo_cctrls = NULL;
394 return LDAP_OPT_SUCCESS;
398 ldap_controls_dup( (LDAPControl **) invalue );
400 if(lo->ldo_cctrls == NULL) {
401 /* memory allocation error ? */
404 } return LDAP_OPT_SUCCESS;
406 case LDAP_OPT_HOST_NAME: {
407 char* host = (char *) invalue;
409 if(lo->ldo_defhost != NULL) {
410 LDAP_FREE(lo->ldo_defhost);
411 lo->ldo_defhost = NULL;
415 lo->ldo_defhost = strdup(host);
416 return LDAP_OPT_SUCCESS;
421 * must want global default returned
422 * to initial condition.
424 lo->ldo_defhost = strdup("localhost");
428 * must want the session default
429 * updated to the current global default
431 lo->ldo_defhost = strdup(
432 ldap_int_global_options.ldo_defhost);
434 } return LDAP_OPT_SUCCESS;
436 case LDAP_OPT_ERROR_NUMBER: {
437 int err = * (int *) invalue;
440 /* need a struct ldap */
445 } return LDAP_OPT_SUCCESS;
447 case LDAP_OPT_ERROR_STRING: {
448 char* err = (char *) invalue;
451 /* need a struct ldap */
456 LDAP_FREE(ld->ld_error);
459 ld->ld_error = 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;