mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-02-17 14:00:30 +08:00
Added ldap_get_entry_contols() and ldap_parse_reference(), but
have not implemented ldap_get_ber_controls() helper function yet.
This commit is contained in:
parent
fc9e20763f
commit
ff447a31e2
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user