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