/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2006 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
cir->cir_name.bv_len = strlen( scr->scr_oid );
cir->cir_cr = scr;
- assert( cir->cir_name.bv_val );
- assert( cir->cir_cr );
+ assert( cir->cir_name.bv_val != NULL );
+ assert( cir->cir_cr != NULL );
if ( avl_insert( &cr_index, (caddr_t) cir,
cr_index_cmp, avl_dup_error ) )
cir->cir_name.bv_len = strlen( *names );
cir->cir_cr = scr;
- assert( cir->cir_name.bv_val );
- assert( cir->cir_cr );
+ assert( cir->cir_name.bv_val != NULL );
+ assert( cir->cir_cr != NULL );
if ( avl_insert( &cr_index, (caddr_t) cir,
cr_index_cmp, avl_dup_error ) )
ContentRule *scr;
int code;
int op = 0;
+ char *oidm = NULL;
if ( cr->cr_names != NULL ) {
int i;
return SLAP_SCHERR_OIDM;
}
if ( oid != cr->cr_oid ) {
- ldap_memfree( cr->cr_oid );
+ oidm = cr->cr_oid;
cr->cr_oid = oid;
}
}
scr = (ContentRule *) ch_calloc( 1, sizeof(ContentRule) );
AC_MEMCPY( &scr->scr_crule, cr, sizeof(LDAPContentRule) );
+ scr->scr_oidmacro = oidm;
scr->scr_sclass = oc_find(cr->cr_oid);
if ( !scr->scr_sclass ) {
*err = cr->cr_oid;
- return SLAP_SCHERR_CLASS_NOT_FOUND;
+ code = SLAP_SCHERR_CLASS_NOT_FOUND;
+ goto fail;
}
/* check object class usage */
if( scr->scr_sclass->soc_kind != LDAP_SCHEMA_STRUCTURAL )
{
*err = cr->cr_oid;
- return SLAP_SCHERR_CR_BAD_STRUCT;
+ code = SLAP_SCHERR_CR_BAD_STRUCT;
+ goto fail;
}
if( scr->scr_sclass->soc_flags & SLAP_OC_OPERATIONAL ) op++;
code = cr_add_auxiliaries( scr, &op, err );
- if ( code != 0 ) return code;
+ if ( code != 0 ) goto fail;
code = cr_create_required( scr, &op, err );
- if ( code != 0 ) return code;
+ if ( code != 0 ) goto fail;
code = cr_create_allowed( scr, &op, err );
- if ( code != 0 ) return code;
+ if ( code != 0 ) goto fail;
code = cr_create_precluded( scr, &op, err );
- if ( code != 0 ) return code;
+ if ( code != 0 ) goto fail;
if( user && op ) {
- return SLAP_SCHERR_CR_BAD_AUX;
+ code = SLAP_SCHERR_CR_BAD_AUX;
+ goto fail;
}
code = cr_insert(scr,err);
if ( code == 0 && rscr )
*rscr = scr;
return code;
+fail:
+ ch_free( scr );
+ return code;
}
void
ContentRule *cr;
int i, num;
struct berval bv, *bva = NULL, idx;
- char ibuf[32], *ptr;
+ char ibuf[32];
if ( !start )
start = LDAP_STAILQ_FIRST( &cr_list );
/* count the result size */
i = 0;
- for ( cr=start; cr && cr!=end; cr=LDAP_STAILQ_NEXT(cr, scr_next)) {
+ for ( cr=start; cr; cr=LDAP_STAILQ_NEXT(cr, scr_next)) {
if ( sys && !(cr->scr_flags & SLAP_CR_HARDCODE)) continue;
i++;
+ if ( cr == end ) break;
}
if (!i) return;
ibuf[0] = '\0';
}
i = 0;
- for ( cr=start; cr && cr!=end; cr=LDAP_STAILQ_NEXT(cr, scr_next)) {
+ for ( cr=start; cr; cr=LDAP_STAILQ_NEXT(cr, scr_next)) {
+ LDAPContentRule lcr, *lcrp;
if ( sys && !(cr->scr_flags & SLAP_CR_HARDCODE)) continue;
- if ( ldap_contentrule2bv( &cr->scr_crule, &bv ) == NULL ) {
+ if ( cr->scr_oidmacro ) {
+ lcr = cr->scr_crule;
+ lcr.cr_oid = cr->scr_oidmacro;
+ lcrp = &lcr;
+ } else {
+ lcrp = &cr->scr_crule;
+ }
+ if ( ldap_contentrule2bv( lcrp, &bv ) == NULL ) {
ber_bvarray_free( bva );
}
if ( !sys ) {
- idx.bv_len = sprintf(idx.bv_val, "{%02d}", i);
+ idx.bv_len = sprintf(idx.bv_val, "{%d}", i);
}
bva[i].bv_len = idx.bv_len + bv.bv_len;
bva[i].bv_val = ch_malloc( bva[i].bv_len + 1 );
i++;
bva[i].bv_val = NULL;
ldap_memfree( bv.bv_val );
+ if ( cr == end ) break;
}
*res = bva;
}