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_INFO
18 {"INFO", LDAP_API_FEATURE_INFO},
20 #ifdef LDAP_API_FEATURE_THREAD_SAFE
21 {"THREAD_SAFE", LDAP_API_FEATURE_THREAD_SAFE},
23 #ifdef LDAP_API_FEATURE_SESSION_THREAD_SAFE
24 {"SESSION_THREAD_SAFE", LDAP_API_FEATURE_SESSION_THREAD_SAFE},
26 #ifdef LDAP_API_FEATURE_OPERATION_THREAD_SAFE
27 {"OPERATION_THREAD_SAFE", LDAP_API_FEATURE_OPERATION_THREAD_SAFE},
29 #ifdef LDAP_API_FEATURE_X_OPENLDAP_REEENTRANT
30 {"X_OPENLDAP_REENTRANT", LDAP_API_FEATURE_X_OPENLDAP_REENTRANT},
32 #if defined( LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE ) && \
33 defined( LDAP_THREAD_SAFE )
34 {"X_OPENLDAP_THREAD_SAFE", LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE},
36 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
37 {"X_OPENLDAP_V2_DNS", LDAP_API_FEATURE_X_OPENLDAP_V2_DNS},
39 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
40 {"X_OPENLDAP_V2_REFERRALS", LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS},
51 struct ldapoptions *lo;
53 if(!openldap_ldap_initialized) {
54 openldap_ldap_initialize();
57 if(outvalue == NULL) {
58 /* no place to get to */
63 lo = &openldap_ldap_global_options;
69 case LDAP_OPT_API_INFO: {
70 struct ldapapiinfo *info = (struct ldapapiinfo *) outvalue;
73 /* outvalue must point to an apiinfo structure */
77 if(info->ldapai_info_version != LDAP_API_INFO_VERSION) {
78 /* api info version mismatch */
79 info->ldapai_info_version = LDAP_API_INFO_VERSION;
83 info->ldapai_api_version = LDAP_API_VERSION;
84 info->ldapai_api_version = LDAP_API_VERSION;
85 info->ldapai_protocol_version = LDAP_VERSION_MAX;
87 if(features[0].ldapaif_name == NULL) {
88 info->ldapai_extensions = NULL;
91 info->ldapai_extensions = malloc(sizeof(char *) *
92 sizeof(features)/sizeof(LDAPAPIFeatureInfo));
94 for(i=0; features[i].ldapaif_name != NULL; i++) {
95 info->ldapai_extensions[i] =
96 ldap_strdup(features[i].ldapaif_name);
99 info->ldapai_extensions[i] = NULL;
102 info->ldapai_vendor_name = ldap_strdup(LDAP_VENDOR_NAME);
103 info->ldapai_vendor_version = LDAP_VENDOR_VERSION;
114 * (int *) outvalue = ld->ld_sb.sb_sd;
118 * (int *) outvalue = lo->ldo_deref;
121 case LDAP_OPT_SIZELIMIT:
122 * (int *) outvalue = lo->ldo_sizelimit;
125 case LDAP_OPT_TIMELIMIT:
126 * (int *) outvalue = lo->ldo_timelimit;
129 case LDAP_OPT_REFERRALS:
130 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_REFERRALS);
133 case LDAP_OPT_RESTART:
134 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_RESTART);
137 case LDAP_OPT_DNS: /* LDAPv2 */
138 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_DNS);
141 case LDAP_OPT_PROTOCOL_VERSION:
142 if ((ld != NULL) && ld->ld_version) {
143 * (int *) outvalue = ld->ld_version;
145 * (int *) outvalue = lo->ldo_version;
149 case LDAP_OPT_SERVER_CONTROLS:
150 * (LDAPControl ***) outvalue =
151 ldap_controls_dup( lo->ldo_server_controls );
155 case LDAP_OPT_CLIENT_CONTROLS:
156 * (LDAPControl ***) outvalue =
157 ldap_controls_dup( lo->ldo_client_controls );
161 case LDAP_OPT_HOST_NAME:
163 * draft-ietf-ldapext-ldap-c-api-01 doesn't state
164 * whether caller has to free host names or not,
168 * (char **) outvalue = ldap_strdup(lo->ldo_defhost);
171 case LDAP_OPT_ERROR_NUMBER:
176 * (int *) outvalue = ld->ld_errno;
179 case LDAP_OPT_ERROR_STRING:
186 * draft-ietf-ldapext-ldap-c-api-01 doesn't require
187 * the client to have to free error strings, we do
190 if( ld->ld_error == NULL ) {
191 * (char **) outvalue = NULL;
193 * (char **) outvalue = ldap_strdup(ld->ld_error);
198 case LDAP_OPT_API_FEATURE_INFO: {
199 LDAPAPIFeatureInfo *info = (LDAPAPIFeatureInfo *) outvalue;
202 if(info == NULL) return -1;
203 if(info->ldapaif_name == NULL) return -1;
205 for(i=0; features[i].ldapaif_name != NULL; i++) {
206 if(!strcmp(info->ldapaif_name, features[i].ldapaif_name)) {
207 info->ldapaif_version =
208 features[i].ldapaif_version;
215 case LDAP_OPT_DEBUG_LEVEL:
216 * (int *) outvalue = lo->ldo_debug;
233 struct ldapoptions *lo;
235 if(!openldap_ldap_initialized) {
236 openldap_ldap_initialize();
239 if(invalue == NULL) {
240 /* no place to set from */
245 lo = &openldap_ldap_global_options;
247 lo = &ld->ld_options;
251 case LDAP_OPT_API_INFO:
257 lo->ldo_deref = * (int *) invalue;
260 case LDAP_OPT_SIZELIMIT:
261 lo->ldo_sizelimit = * (int *) invalue;
264 case LDAP_OPT_TIMELIMIT:
265 lo->ldo_timelimit = * (int *) invalue;
268 case LDAP_OPT_REFERRALS:
269 if((int) invalue == (int) LDAP_OPT_ON) {
270 LDAP_BOOL_SET(lo, LDAP_BOOL_REFERRALS);
272 LDAP_BOOL_CLR(lo, LDAP_BOOL_REFERRALS);
276 case LDAP_OPT_RESTART:
277 if((int) invalue == (int) LDAP_OPT_ON) {
278 LDAP_BOOL_SET(lo, LDAP_BOOL_RESTART);
280 LDAP_BOOL_CLR(lo, LDAP_BOOL_RESTART);
284 case LDAP_OPT_PROTOCOL_VERSION: {
285 int vers = * (int *) invalue;
286 if (vers < LDAP_VERSION_MIN || vers > LDAP_VERSION_MAX) {
290 ld->ld_version = vers;
293 case LDAP_OPT_SERVER_CONTROLS: {
294 LDAPControl **controls = (LDAPControl **) invalue;
296 ldap_controls_free( lo->ldo_server_controls );
298 if( controls == NULL || *controls == NULL ) {
299 lo->ldo_server_controls = NULL;
303 lo->ldo_server_controls =
304 ldap_controls_dup( (LDAPControl **) invalue );
306 if(lo->ldo_server_controls == NULL) {
307 /* memory allocation error ? */
312 case LDAP_OPT_CLIENT_CONTROLS: {
313 LDAPControl **controls = (LDAPControl **) invalue;
315 ldap_controls_free( lo->ldo_client_controls );
317 if( controls == NULL || *controls == NULL ) {
318 lo->ldo_client_controls = NULL;
322 lo->ldo_client_controls =
323 ldap_controls_dup( (LDAPControl **) invalue );
325 if(lo->ldo_client_controls == NULL) {
326 /* memory allocation error ? */
331 case LDAP_OPT_HOST_NAME: {
332 char* host = (char *) invalue;
334 if(lo->ldo_defhost != NULL) {
335 free(lo->ldo_defhost);
336 lo->ldo_defhost = NULL;
340 lo->ldo_defhost = ldap_strdup(host);
346 * must want global default returned
347 * to initial condition.
349 lo->ldo_defhost = ldap_strdup("localhost");
353 * must want the session default
354 * updated to the current global default
356 lo->ldo_defhost = ldap_strdup(
357 openldap_ldap_global_options.ldo_defhost);
361 case LDAP_OPT_ERROR_NUMBER: {
362 int err = * (int *) invalue;
365 /* need a struct ldap */
372 case LDAP_OPT_ERROR_STRING: {
373 char* err = (char *) invalue;
376 /* need a struct ldap */
384 ld->ld_error = ldap_strdup(err);
387 case LDAP_OPT_API_FEATURE_INFO:
391 case LDAP_OPT_DEBUG_LEVEL:
392 lo->ldo_debug = * (int *) invalue;