From: Kurt Zeilenga Date: Sun, 27 Dec 1998 21:59:12 +0000 (+0000) Subject: Added ldap_get_entry_contols() and ldap_parse_reference(), but X-Git-Tag: OPENLDAP_SLAPD_BACK_LDAP~853 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=ff447a31e23aef8c479356f0ead124b317026b86;p=openldap Added ldap_get_entry_contols() and ldap_parse_reference(), but have not implemented ldap_get_ber_controls() helper function yet. --- diff --git a/libraries/libldap/controls.c b/libraries/libldap/controls.c index c00836e35e..e82a6c293f 100644 --- a/libraries/libldap/controls.c +++ b/libraries/libldap/controls.c @@ -140,3 +140,9 @@ LDAPControl *ldap_control_dup( LDAPControl *c ) new->ldctl_iscritical = c->ldctl_iscritical; return new; } + +/* get the controls from the BerElement */ +int ldap_get_ber_controls( BerElement *be, LDAPControl ***cp) +{ + return LDAP_NOT_SUPPORTED; +} diff --git a/libraries/libldap/getentry.c b/libraries/libldap/getentry.c index 069b2dcbe9..19636cefef 100644 --- a/libraries/libldap/getentry.c +++ b/libraries/libldap/getentry.c @@ -73,3 +73,46 @@ ldap_count_entries( LDAP *ld, LDAPMessage *chain ) return( i ); } + +int +ldap_get_entry_controls( + LDAP *ld, + LDAPMessage *entry, + LDAPControl ***serverctrls) +{ + int rc; + BerElement be; + + if ( ld == NULL || serverctrls == NULL || + entry == NULL || entry->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) + { + return LDAP_PARAM_ERROR; + } + + /* make a local copy of the BerElement */ + SAFEMEMCPY(&be, entry->lm_ber, sizeof(be)); + + if ( ber_scanf( &be, "{xx" /*}*/ ) == LBER_ERROR ) { + rc = LDAP_DECODING_ERROR; + goto cleanup_and_return; + } + + rc = ldap_get_ber_controls( &be, serverctrls ); + +cleanup_and_return: + if( rc != LDAP_SUCCESS ) { + ld->ld_errno = rc; + + if( ld->ld_matched != NULL ) + free( ld->ld_matched ); + + ld->ld_matched = NULL; + + if( ld->ld_error != NULL ) + free( ld->ld_error ); + + ld->ld_error = NULL; + } + + return rc; +} diff --git a/libraries/libldap/references.c b/libraries/libldap/references.c index 3c317e1937..a1e4731dc0 100644 --- a/libraries/libldap/references.c +++ b/libraries/libldap/references.c @@ -66,3 +66,72 @@ ldap_count_references( LDAP *ld, LDAPMessage *chain ) return( i ); } + +int +ldap_parse_reference( + LDAP *ld, + LDAPMessage *ref, + char ***referralsp, + LDAPControl ***serverctrls, + int freeit) +{ + BerElement be; + char **refs = NULL; + int rc; + + if( ld == NULL || ref == NULL || + ref->lm_msgtype != LDAP_RES_SEARCH_REFERENCE ) + { + return LDAP_PARAM_ERROR; + } + + /* make a private copy of BerElement */ + SAFEMEMCPY(&be, ref->lm_ber, sizeof(be)); + + if ( ber_scanf( &be, "{v" /*}*/, &refs ) == LBER_ERROR ) { + rc = LDAP_DECODING_ERROR; + goto free_and_return; + } + + if ( serverctrls == NULL ) { + rc = LDAP_SUCCESS; + goto free_and_return; + } + + if ( ber_scanf( &be, /*{*/ "}" ) == LBER_ERROR ) { + rc = LDAP_DECODING_ERROR; + goto free_and_return; + } + + rc = ldap_get_ber_controls( &be, serverctrls ); + +free_and_return: + + if( referralsp != NULL ) { + /* provide references regradless of return code */ + *referralsp = refs; + + } else { + ldap_value_free( refs ); + } + + if( freeit ) { + ldap_msgfree( ref ); + } + + if( rc != LDAP_SUCCESS ) { + ld->ld_errno = rc; + + if( ld->ld_matched != NULL ) + free( ld->ld_matched ); + + ld->ld_matched = NULL; + + if( ld->ld_error != NULL ) + free( ld->ld_error ); + + ld->ld_error = NULL; + } + + return rc; +}