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:
Kurt Zeilenga 1998-12-27 21:59:12 +00:00
parent fc9e20763f
commit ff447a31e2
3 changed files with 118 additions and 0 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}