tag optional stuff

This commit is contained in:
Pierangelo Masarati 2008-10-22 23:38:09 +00:00
parent faddae3a0e
commit 6bedf74c41
2 changed files with 28 additions and 16 deletions

View File

@ -198,21 +198,24 @@ ldap_parse_derefresponse_control(
goto done;
}
for ( tag = ber_first_element( ber, &len, &last2 );
tag != LBER_DEFAULT;
tag = ber_next_element( ber, &len, last2 ) )
{
LDAPDerefVal *dv;
tag = ber_peek_tag( ber, &len );
if ( tag == (LBER_CONSTRUCTED|LBER_CLASS_CONTEXT) ) {
for ( tag = ber_first_element( ber, &len, &last2 );
tag != LBER_DEFAULT;
tag = ber_next_element( ber, &len, last2 ) )
{
LDAPDerefVal *dv;
dv = LDAP_CALLOC( 1, sizeof(LDAPDerefVal) );
dv = LDAP_CALLOC( 1, sizeof(LDAPDerefVal) );
tag = ber_scanf( ber, "{a[W]}", &dv->type, &dv->vals );
if ( tag == LBER_ERROR ) {
goto done;
tag = ber_scanf( ber, "{a[W]}", &dv->type, &dv->vals );
if ( tag == LBER_ERROR ) {
goto done;
}
*dvp = dv;
dvp = &dv->next;
}
*dvp = dv;
dvp = &dv->next;
}
tag = ber_scanf( ber, "}" );

View File

@ -64,7 +64,7 @@
* DerefRes ::= SEQUENCE {
* derefAttr AttributeDescription,
* derefVal LDAPDN,
* attrVals PartialAttributeList OPTIONAL }
* attrVals [0] PartialAttributeList OPTIONAL }
*
* If vals is empty, partialAttribute is omitted.
* If all vals in attrVals are empty, attrVals is omitted.
@ -345,19 +345,28 @@ deref_response( Operation *op, SlapReply *rs )
rc = ber_printf( ber, "{" /*}*/ );
for ( dr = drhead; dr != NULL; dr = dr->dr_next ) {
for ( i = 0; !BER_BVISNULL( &dr->dr_vals[ i ].dv_derefSpecVal ); i++ ) {
int j;
int j, first = 1;
rc = ber_printf( ber, "{OO{" /*}*/,
rc = ber_printf( ber, "{OO" /*}*/,
&dr->dr_spec.ds_derefAttr->ad_cname,
&dr->dr_vals[ i ].dv_derefSpecVal );
for ( j = 0; j < dr->dr_spec.ds_nattrs; j++ ) {
if ( dr->dr_vals[ i ].dv_attrVals[ j ] != NULL ) {
if ( first ) {
rc = ber_printf( ber, "t{" /*}*/,
(LBER_CONSTRUCTED|LBER_CLASS_CONTEXT) );
first = 0;
}
rc = ber_printf( ber, "{O[W]}",
&dr->dr_spec.ds_attributes[ j ]->ad_cname,
dr->dr_vals[ i ].dv_attrVals[ j ] );
}
}
rc = ber_printf( ber, /*{*/ "}N}" );
if ( !first ) {
rc = ber_printf( ber, /*{{*/ "}N}" );
} else {
rc = ber_printf( ber, /*{*/ "}" );
}
}
}
rc = ber_printf( ber, /*{*/ "}" );