X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Foptions.c;h=9d608c9c2c759403de25839c466de90f44c3a4b2;hb=544d00f3e53f598e51d23c795f72e5ba3a2f8642;hp=7d099089cb714f32dd12feef2bea816d2c38daff;hpb=77f776dfd1b04b25606dcdc011c5396139f3530c;p=openldap diff --git a/libraries/libldap/options.c b/libraries/libldap/options.c index 7d099089cb..9d608c9c2c 100644 --- a/libraries/libldap/options.c +++ b/libraries/libldap/options.c @@ -1,7 +1,16 @@ /* $OpenLDAP$ */ -/* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2006 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -19,6 +28,9 @@ #define LDAP_OPT_REBIND_PROC 0x4e814d #define LDAP_OPT_REBIND_PARAMS 0x4e814e +#define LDAP_OPT_NEXTREF_PROC 0x4e815d +#define LDAP_OPT_NEXTREF_PARAMS 0x4e815e + static const LDAPAPIFeatureInfo features[] = { #ifdef LDAP_API_FEATURE_X_OPENLDAP { /* OpenLDAP Extensions API Feature */ @@ -122,7 +134,6 @@ ldap_get_option( return LDAP_OPT_ERROR; } - info->ldapai_api_version = LDAP_API_VERSION; info->ldapai_api_version = LDAP_API_VERSION; info->ldapai_protocol_version = LDAP_VERSION_MAX; @@ -156,18 +167,21 @@ ldap_get_option( ber_sockbuf_ctrl( ld->ld_sb, LBER_SB_OPT_GET_FD, outvalue ); return LDAP_OPT_SUCCESS; + case LDAP_OPT_SOCKBUF: + if( ld == NULL ) break; + *(Sockbuf **)outvalue = ld->ld_sb; + return LDAP_OPT_SUCCESS; + case LDAP_OPT_TIMEOUT: /* the caller has to free outvalue ! */ - if ( ldap_int_timeval_dup( outvalue, lo->ldo_tm_api) != 0 ) - { + if ( ldap_int_timeval_dup( outvalue, lo->ldo_tm_api) != 0 ) { return LDAP_OPT_ERROR; } return LDAP_OPT_SUCCESS; case LDAP_OPT_NETWORK_TIMEOUT: /* the caller has to free outvalue ! */ - if ( ldap_int_timeval_dup( outvalue, lo->ldo_tm_net ) != 0 ) - { + if ( ldap_int_timeval_dup( outvalue, lo->ldo_tm_net ) != 0 ) { return LDAP_OPT_ERROR; } return LDAP_OPT_SUCCESS; @@ -247,7 +261,21 @@ ldap_get_option( if( ld->ld_matched == NULL ) { * (char **) outvalue = NULL; } else { - * (char **) outvalue = LDAP_STRDUP(ld->ld_matched); + * (char **) outvalue = LDAP_STRDUP( ld->ld_matched ); + } + + return LDAP_OPT_SUCCESS; + + case LDAP_OPT_REFERRAL_URLS: + if(ld == NULL) { + /* bad param */ + break; + } + + if( ld->ld_referrals == NULL ) { + * (char ***) outvalue = NULL; + } else { + * (char ***) outvalue = ldap_value_dup(ld->ld_referrals); } return LDAP_OPT_SUCCESS; @@ -318,8 +346,9 @@ ldap_set_option( * problem. Thus, we introduce a fix here. */ - if (option == LDAP_OPT_DEBUG_LEVEL) - dbglvl = (int *) invalue; + if (option == LDAP_OPT_DEBUG_LEVEL) { + dbglvl = (int *) invalue; + } if( lo->ldo_valid != LDAP_INITIALIZED ) { ldap_int_initialize(lo, dbglvl); @@ -359,7 +388,8 @@ ldap_set_option( LDAPControl *const *controls = (LDAPControl *const *) invalue; - ldap_controls_free( lo->ldo_sctrls ); + if( lo->ldo_sctrls ) + ldap_controls_free( lo->ldo_sctrls ); if( controls == NULL || *controls == NULL ) { lo->ldo_sctrls = NULL; @@ -378,7 +408,8 @@ ldap_set_option( LDAPControl *const *controls = (LDAPControl *const *) invalue; - ldap_controls_free( lo->ldo_cctrls ); + if( lo->ldo_cctrls ) + ldap_controls_free( lo->ldo_cctrls ); if( controls == NULL || *controls == NULL ) { lo->ldo_cctrls = NULL; @@ -428,6 +459,14 @@ ldap_set_option( case LDAP_OPT_REBIND_PARAMS: { lo->ldo_rebind_params = (void *)invalue; } return LDAP_OPT_SUCCESS; + + /* Only accessed from inside this function by ldap_set_nextref_proc() */ + case LDAP_OPT_NEXTREF_PROC: { + lo->ldo_nextref_proc = (LDAP_NEXTREF_PROC *)invalue; + } return LDAP_OPT_SUCCESS; + case LDAP_OPT_NEXTREF_PARAMS: { + lo->ldo_nextref_params = (void *)invalue; + } return LDAP_OPT_SUCCESS; } if(invalue == NULL) { @@ -507,7 +546,6 @@ ldap_set_option( if(urls != NULL) { rc = ldap_url_parselist(&ludlist, urls); - } else if(ld == NULL) { /* * must want global default returned @@ -526,6 +564,28 @@ ldap_set_option( rc = LDAP_NO_MEMORY; } + switch (rc) { + case LDAP_URL_SUCCESS: /* Success */ + rc = LDAP_SUCCESS; + break; + + case LDAP_URL_ERR_MEM: /* can't allocate memory space */ + rc = LDAP_NO_MEMORY; + break; + + case LDAP_URL_ERR_PARAM: /* parameter is bad */ + case LDAP_URL_ERR_BADSCHEME: /* URL doesn't begin with "ldap[si]://" */ + case LDAP_URL_ERR_BADENCLOSURE: /* URL is missing trailing ">" */ + case LDAP_URL_ERR_BADURL: /* URL is bad */ + case LDAP_URL_ERR_BADHOST: /* host port is bad */ + case LDAP_URL_ERR_BADATTRS: /* bad (or missing) attributes */ + case LDAP_URL_ERR_BADSCOPE: /* scope string is invalid (or missing) */ + case LDAP_URL_ERR_BADFILTER: /* bad or missing filter */ + case LDAP_URL_ERR_BADEXTS: /* bad or missing extensions */ + rc = LDAP_PARAM_ERROR; + break; + } + if (rc == LDAP_OPT_SUCCESS) { if (lo->ldo_defludp != NULL) ldap_free_urllist(lo->ldo_defludp); @@ -555,24 +615,45 @@ ldap_set_option( if( ld->ld_error ) { LDAP_FREE(ld->ld_error); + ld->ld_error = NULL; } - ld->ld_error = LDAP_STRDUP(err); + if ( err ) { + ld->ld_error = LDAP_STRDUP(err); + } } return LDAP_OPT_SUCCESS; case LDAP_OPT_MATCHED_DN: { - const char *err = (const char *) invalue; + const char *matched = (const char *) invalue; - if(ld == NULL) { + if (ld == NULL) { /* need a struct ldap */ break; } if( ld->ld_matched ) { LDAP_FREE(ld->ld_matched); + ld->ld_matched = NULL; + } + + if ( matched ) { + ld->ld_matched = LDAP_STRDUP( matched ); + } + } return LDAP_OPT_SUCCESS; + + case LDAP_OPT_REFERRAL_URLS: { + char *const *referrals = (char *const *) invalue; + + if(ld == NULL) { + /* need a struct ldap */ + break; + } + + if( ld->ld_referrals ) { + LDAP_VFREE(ld->ld_referrals); } - ld->ld_matched = LDAP_STRDUP(err); + ld->ld_referrals = ldap_value_dup(referrals); } return LDAP_OPT_SUCCESS; case LDAP_OPT_API_FEATURE_INFO: @@ -586,7 +667,7 @@ ldap_set_option( default: #ifdef HAVE_TLS if ( ldap_pvt_tls_set_option( ld, option, (void *)invalue ) == 0 ) - return LDAP_OPT_SUCCESS; + return LDAP_OPT_SUCCESS; #endif #ifdef HAVE_CYRUS_SASL if ( ldap_int_sasl_set_option( ld, option, (void *)invalue ) == 0 ) @@ -608,3 +689,14 @@ ldap_set_rebind_proc( LDAP *ld, LDAP_REBIND_PROC *proc, void *params ) rc = ldap_set_option( ld, LDAP_OPT_REBIND_PARAMS, (void *)params ); return rc; } + +int +ldap_set_nextref_proc( LDAP *ld, LDAP_NEXTREF_PROC *proc, void *params ) +{ + int rc; + rc = ldap_set_option( ld, LDAP_OPT_NEXTREF_PROC, (void *)proc ); + if( rc != LDAP_OPT_SUCCESS ) return rc; + + rc = ldap_set_option( ld, LDAP_OPT_NEXTREF_PARAMS, (void *)params ); + return rc; +}