return (*at != NULL);
}
-
+
+/*
+ * check whether the two attributeTypes actually __are__ identical,
+ * or rather inconsistent
+ */
+static int
+at_check_dup(
+ AttributeType *sat,
+ AttributeType *new_sat )
+{
+ if ( new_sat->sat_oid != NULL ) {
+ if ( sat->sat_oid == NULL ) {
+ return SLAP_SCHERR_ATTR_INCONSISTENT;
+ }
+
+ if ( strcmp( sat->sat_oid, new_sat->sat_oid ) != 0 ) {
+ return SLAP_SCHERR_ATTR_INCONSISTENT;
+ }
+
+ } else {
+ if ( sat->sat_oid != NULL ) {
+ return SLAP_SCHERR_ATTR_INCONSISTENT;
+ }
+ }
+
+ if ( new_sat->sat_names ) {
+ int i;
+
+ if ( sat->sat_names == NULL ) {
+ return SLAP_SCHERR_ATTR_INCONSISTENT;
+ }
+
+ for ( i = 0; new_sat->sat_names[ i ]; i++ ) {
+ if ( sat->sat_names[ i ] == NULL ) {
+ return SLAP_SCHERR_ATTR_INCONSISTENT;
+ }
+
+ if ( strcasecmp( sat->sat_names[ i ],
+ new_sat->sat_names[ i ] ) != 0 )
+ {
+ return SLAP_SCHERR_ATTR_INCONSISTENT;
+ }
+ }
+ } else {
+ if ( sat->sat_names != NULL ) {
+ return SLAP_SCHERR_ATTR_INCONSISTENT;
+ }
+ }
+
+ return SLAP_SCHERR_ATTR_DUP;
+}
static int
struct aindexrec *air;
char **names;
+
if ( sat->sat_oid ) {
air = (struct aindexrec *)
ch_calloc( 1, sizeof(struct aindexrec) );
air->air_name.bv_len = strlen(sat->sat_oid);
air->air_at = sat;
if ( avl_insert( &attr_index, (caddr_t) air,
- attr_index_cmp, avl_dup_error ) ) {
+ attr_index_cmp, avl_dup_error ) )
+ {
+ AttributeType *old_sat;
+ int rc;
+
*err = sat->sat_oid;
- ldap_memfree(air);
- return SLAP_SCHERR_ATTR_DUP;
+
+ old_sat = at_bvfind( &air->air_name );
+ assert( old_sat != NULL );
+ rc = at_check_dup( old_sat, sat );
+
+ ldap_memfree( air );
+
+ return rc;
}
/* FIX: temporal consistency check */
- at_bvfind(&air->air_name);
+ at_bvfind( &air->air_name );
}
- if ( (names = sat->sat_names) ) {
+ names = sat->sat_names;
+ if ( names ) {
while ( *names ) {
air = (struct aindexrec *)
ch_calloc( 1, sizeof(struct aindexrec) );
air->air_name.bv_len = strlen(*names);
air->air_at = sat;
if ( avl_insert( &attr_index, (caddr_t) air,
- attr_index_cmp, avl_dup_error ) ) {
+ attr_index_cmp, avl_dup_error ) )
+ {
+ AttributeType *old_sat;
+ int rc;
+
*err = *names;
+
+ old_sat = at_bvfind( &air->air_name );
+ assert( old_sat != NULL );
+ rc = at_check_dup( old_sat, sat );
+
ldap_memfree(air);
- return SLAP_SCHERR_ATTR_DUP;
+
+ return rc;
}
/* FIX: temporal consistency check */
at_bvfind(&air->air_name);
int code;
char *cname;
char *oid;
+ char *oidm = NULL;
if ( !OID_LEADCHAR( at->at_oid[0] )) {
/* Expand OID macros */
return SLAP_SCHERR_OIDM;
}
if ( oid != at->at_oid ) {
- ldap_memfree( at->at_oid );
+ oidm = at->at_oid;
at->at_oid = oid;
}
}
sat->sat_cname.bv_val = cname;
sat->sat_cname.bv_len = strlen( cname );
+ sat->sat_oidmacro = oidm;
ldap_pvt_thread_mutex_init(&sat->sat_ad_mutex);
if ( at->at_sup_oid ) {
if ( sat->sat_extensions ) {
for (i=0; sat->sat_extensions[i]; i++) {
if (!strcasecmp( sat->sat_extensions[i]->lsei_name,
- "X-ORDERED" )) {
- sat->sat_flags |= SLAP_AT_ORDERED;
- break;
+ "X-ORDERED" ) && sat->sat_extensions[i]->lsei_values ) {
+ if ( !strcasecmp( sat->sat_extensions[i]->lsei_values[0],
+ "VALUES" )) {
+ sat->sat_flags |= SLAP_AT_ORDERED_VAL;
+ break;
+ } else if ( !strcasecmp( sat->sat_extensions[i]->lsei_values[0],
+ "SIBLINGS" )) {
+ sat->sat_flags |= SLAP_AT_ORDERED_SIB;
+ break;
+ }
}
}
}
sat->sat_substr = mr;
}
- code = at_insert(sat,err);
+ code = at_insert( sat, err );
if ( code == 0 && rsat )
*rsat = sat;
return code;
AttributeType *at;
int i, num;
struct berval bv, *bva = NULL, idx;
- char ibuf[32], *ptr;
+ char ibuf[32];
if ( !start )
start = LDAP_STAILQ_FIRST( &attr_list );
/* count the result size */
i = 0;
- for ( at=start; at && at!=end; at=LDAP_STAILQ_NEXT(at, sat_next)) {
+ for ( at=start; at; at=LDAP_STAILQ_NEXT(at, sat_next)) {
if ( sys && !(at->sat_flags & SLAP_AT_HARDCODE)) continue;
i++;
+ if ( at == end ) break;
}
if (!i) return;
ibuf[0] = '\0';
}
i = 0;
- for ( at=start; at && at!=end; at=LDAP_STAILQ_NEXT(at, sat_next)) {
+ for ( at=start; at; at=LDAP_STAILQ_NEXT(at, sat_next)) {
+ LDAPAttributeType lat, *latp;
if ( sys && !(at->sat_flags & SLAP_AT_HARDCODE)) continue;
- if ( ldap_attributetype2bv( &at->sat_atype, &bv ) == NULL ) {
+ if ( at->sat_oidmacro ) {
+ lat = at->sat_atype;
+ lat.at_oid = at->sat_oidmacro;
+ latp = ⪫
+ } else {
+ latp = &at->sat_atype;
+ }
+ if ( ldap_attributetype2bv( latp, &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 ( at == end ) break;
}
*res = bva;
}