11 static const LDAPAPIFeatureInfo features[] = {
12 #ifdef LDAP_API_FEATURE_INFO
13 {"INFO", LDAP_API_FEATURE_INFO},
15 #ifdef LDAP_API_FEATURE_THREAD_SAFE
16 {"THREAD_SAFE", LDAP_API_FEATURE_THREAD_SAFE},
18 #ifdef LDAP_API_FEATURE_SESSION_THREAD_SAFE
19 {"SESSION_THREAD_SAFE", LDAP_API_FEATURE_SESSION_THREAD_SAFE},
21 #ifdef LDAP_API_FEATURE_OPERATION_THREAD_SAFE
22 {"OPERATION_THREAD_SAFE", LDAP_API_FEATURE_OPERATION_THREAD_SAFE},
24 #ifdef LDAP_API_FEATURE_X_OPENLDAP_REEENTRANT
25 {"X_OPENLDAP_REENTRANT", LDAP_API_FEATURE_X_OPENLDAP_REENTRANT},
27 #if defined( LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE ) && \
28 defined( LDAP_THREAD_SAFE )
29 {"X_OPENLDAP_THREAD_SAFE", LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE},
31 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
32 {"X_OPENLDAP_V2_DNS", LDAP_API_FEATURE_X_OPENLDAP_V2_DNS},
34 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
35 {"X_OPENLDAP_V2_REFERRALS", LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS},
46 struct ldapoptions *lo;
48 if(!openldap_ldap_initialized) {
49 openldap_ldap_initialize();
52 if(outvalue == NULL) {
53 /* no place to get to */
58 lo = &openldap_ldap_global_options;
64 case LDAP_OPT_API_INFO: {
65 struct ldapapiinfo *info = (struct ldapapiinfo *) outvalue;
68 /* outvalue must point to an apiinfo structure */
72 if(info->ldapai_info_version != LDAP_API_INFO_VERSION) {
73 /* api info version mismatch */
74 info->ldapai_info_version = LDAP_API_INFO_VERSION;
78 info->ldapai_api_version = LDAP_API_VERSION;
79 info->ldapai_api_version = LDAP_API_VERSION;
80 info->ldapai_protocol_version = LDAP_VERSION_MAX;
82 if(features[0].ldapaif_name == NULL) {
83 info->ldapai_extensions = NULL;
86 info->ldapai_extensions = malloc(sizeof(char *) *
87 sizeof(features)/sizeof(LDAPAPIFeatureInfo));
89 for(i=0; features[i].ldapaif_name != NULL; i++) {
90 info->ldapai_extensions[i] =
91 ldap_strdup(features[i].ldapaif_name);
94 info->ldapai_extensions[i] = NULL;
97 info->ldapai_vendor_name = ldap_strdup(LDAP_VENDOR_NAME);
98 info->ldapai_vendor_version = LDAP_VENDOR_VERSION;
109 * (int *) outvalue = ld->ld_sb.sb_sd;
113 * (int *) outvalue = lo->ldo_deref;
116 case LDAP_OPT_SIZELIMIT:
117 * (int *) outvalue = lo->ldo_sizelimit;
120 case LDAP_OPT_TIMELIMIT:
121 * (int *) outvalue = lo->ldo_timelimit;
124 case LDAP_OPT_REFERRALS:
125 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_REFERRALS);
128 case LDAP_OPT_RESTART:
129 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_RESTART);
132 case LDAP_OPT_DNS: /* LDAPv2 */
133 * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_DNS);
136 case LDAP_OPT_PROTOCOL_VERSION:
137 if ((ld != NULL) && ld->ld_version) {
138 * (int *) outvalue = ld->ld_version;
140 * (int *) outvalue = lo->ldo_version;
144 case LDAP_OPT_SERVER_CONTROLS:
145 * (LDAPControl ***) outvalue =
146 ldap_controls_dup( lo->ldo_server_controls );
150 case LDAP_OPT_CLIENT_CONTROLS:
151 * (LDAPControl ***) outvalue =
152 ldap_controls_dup( lo->ldo_client_controls );
156 case LDAP_OPT_HOST_NAME:
158 * draft-ietf-ldapext-ldap-c-api-01 doesn't state
159 * whether caller has to free host names or not,
163 * (char **) outvalue = ldap_strdup(lo->ldo_defhost);
166 case LDAP_OPT_ERROR_NUMBER:
171 * (int *) outvalue = ld->ld_errno;
174 case LDAP_OPT_ERROR_STRING:
181 * draft-ietf-ldapext-ldap-c-api-01 doesn't require
182 * the client to have to free error strings, we do
185 if( ld->ld_error == NULL ) {
186 * (char **) outvalue = NULL;
188 * (char **) outvalue = ldap_strdup(ld->ld_error);
193 case LDAP_OPT_API_FEATURE_INFO: {
194 LDAPAPIFeatureInfo *info = (LDAPAPIFeatureInfo *) outvalue;
197 if(info == NULL) return -1;
198 if(info->ldapaif_name == NULL) return -1;
200 for(i=0; features[i].ldapaif_name != NULL; i++) {
201 if(!strcmp(info->ldapaif_name, features[i].ldapaif_name)) {
202 info->ldapaif_version =
203 features[i].ldapaif_version;
210 case LDAP_OPT_DEBUG_LEVEL:
211 * (int *) outvalue = lo->ldo_debug;
228 struct ldapoptions *lo;
230 if(!openldap_ldap_initialized) {
231 openldap_ldap_initialize();
234 if(invalue == NULL) {
235 /* no place to set from */
240 lo = &openldap_ldap_global_options;
242 lo = &ld->ld_options;
246 case LDAP_OPT_API_INFO:
252 lo->ldo_deref = * (int *) invalue;
255 case LDAP_OPT_SIZELIMIT:
256 lo->ldo_sizelimit = * (int *) invalue;
259 case LDAP_OPT_TIMELIMIT:
260 lo->ldo_timelimit = * (int *) invalue;
263 case LDAP_OPT_REFERRALS:
264 if((int) invalue == (int) LDAP_OPT_ON) {
265 LDAP_BOOL_SET(lo, LDAP_BOOL_REFERRALS);
267 LDAP_BOOL_CLR(lo, LDAP_BOOL_REFERRALS);
271 case LDAP_OPT_RESTART:
272 if((int) invalue == (int) LDAP_OPT_ON) {
273 LDAP_BOOL_SET(lo, LDAP_BOOL_RESTART);
275 LDAP_BOOL_CLR(lo, LDAP_BOOL_RESTART);
279 case LDAP_OPT_PROTOCOL_VERSION: {
280 int vers = * (int *) invalue;
281 if (vers < LDAP_VERSION_MIN || vers > LDAP_VERSION_MAX) {
285 ld->ld_version = vers;
288 case LDAP_OPT_SERVER_CONTROLS: {
289 LDAPControl **controls = (LDAPControl **) invalue;
291 ldap_controls_free( lo->ldo_server_controls );
293 if( controls == NULL || *controls == NULL ) {
294 lo->ldo_server_controls = NULL;
298 lo->ldo_server_controls =
299 ldap_controls_dup( (LDAPControl **) invalue );
301 if(lo->ldo_server_controls == NULL) {
302 /* memory allocation error ? */
307 case LDAP_OPT_CLIENT_CONTROLS: {
308 LDAPControl **controls = (LDAPControl **) invalue;
310 ldap_controls_free( lo->ldo_client_controls );
312 if( controls == NULL || *controls == NULL ) {
313 lo->ldo_client_controls = NULL;
317 lo->ldo_client_controls =
318 ldap_controls_dup( (LDAPControl **) invalue );
320 if(lo->ldo_client_controls == NULL) {
321 /* memory allocation error ? */
326 case LDAP_OPT_HOST_NAME: {
327 char* host = (char *) invalue;
329 if(lo->ldo_defhost != NULL) {
330 free(lo->ldo_defhost);
331 lo->ldo_defhost = NULL;
335 lo->ldo_defhost = ldap_strdup(host);
341 * must want global default returned
342 * to initial condition.
344 lo->ldo_defhost = ldap_strdup("localhost");
348 * must want the session default
349 * updated to the current global default
351 lo->ldo_defhost = ldap_strdup(
352 openldap_ldap_global_options.ldo_defhost);
356 case LDAP_OPT_ERROR_NUMBER: {
357 int err = * (int *) invalue;
360 /* need a struct ldap */
367 case LDAP_OPT_ERROR_STRING: {
368 char* err = (char *) invalue;
371 /* need a struct ldap */
379 ld->ld_error = ldap_strdup(err);
382 case LDAP_OPT_API_FEATURE_INFO:
386 case LDAP_OPT_DEBUG_LEVEL:
387 lo->ldo_debug = * (int *) invalue;