X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fattr.c;h=dff429ded9a358e068cdca3db1ba3814cb09020b;hb=a5ee438c9394a19a241716d3d922299c20b0365d;hp=b064c92b2b4a80976ca6c02e9266922e733a5ce7;hpb=0dbaf87730ec9afe44dceaa452ae51e1dcaac3e7;p=openldap diff --git a/servers/slapd/attr.c b/servers/slapd/attr.c index b064c92b2b..dff429ded9 100644 --- a/servers/slapd/attr.c +++ b/servers/slapd/attr.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* attr.c - routines for dealing with attributes */ @@ -30,7 +30,7 @@ void attr_free( Attribute *a ) { #ifdef SLAPD_SCHEMA_NOT_COMPAT - ad_free( &a->a_desc, 0 ); + ad_free( a->a_desc, 1 ); #else free( a->a_type ); #endif @@ -79,9 +79,7 @@ Attribute *attr_dup( Attribute *a ) } #ifdef SLAPD_SCHEMA_NOT_COMPAT - tmp->a_desc = a->a_desc; - tmp->a_desc.ad_cname = ber_bvdup( a->a_desc.ad_cname ); - tmp->a_desc.ad_lang = ch_strdup( a->a_desc.ad_lang ); + tmp->a_desc = ad_dup( a->a_desc ); #else tmp->a_type = ch_strdup( a->a_type ); tmp->a_syntax = a->a_syntax; @@ -123,7 +121,6 @@ attr_normalize( char *s ) } #endif -#ifndef SLAPD_SCHEMA_NOT_COMPAT /* * attr_merge_fast - merge the given type and value with the list of * attributes in attrs. called from str2entry(), where we can make some @@ -132,6 +129,9 @@ attr_normalize( char *s ) * -1 trouble */ +#ifdef SLAPD_SCHEMA_NOT_COMPAT + /* not used */ +#else int attr_merge_fast( Entry *e, @@ -145,23 +145,17 @@ attr_merge_fast( { if ( *a == NULL ) { for ( *a = &e->e_attrs; **a != NULL; *a = &(**a)->a_next ) { -#ifdef SLAPD_SCHEMA_NOT_COMPAT - /* not yet implemented */ -#else if ( strcasecmp( (**a)->a_type, type ) == 0 ) { break; } -#endif } } if ( **a == NULL ) { **a = (Attribute *) ch_malloc( sizeof(Attribute) ); (**a)->a_vals = NULL; -#ifndef SLAPD_SCHEMA_NOT_COMPAT (**a)->a_type = attr_normalize( ch_strdup( type ) ); (**a)->a_syntax = attr_syntax( type ); -#endif (**a)->a_next = NULL; } @@ -170,6 +164,7 @@ attr_merge_fast( } #endif + /* * attr_merge - merge the given type and value with the list of * attributes in attrs. @@ -180,25 +175,30 @@ attr_merge_fast( int attr_merge( Entry *e, +#ifdef SLAPD_SCHEMA_NOT_COMPAT + AttributeDescription *desc, +#else const char *type, +#endif struct berval **vals ) { Attribute **a; for ( a = &e->e_attrs; *a != NULL; a = &(*a)->a_next ) { #ifdef SLAPD_SCHEMA_NOT_COMPAT - /* not yet implemented */ + if ( ad_cmp( (*a)->a_desc, desc ) == 0 ) #else - if ( strcasecmp( (*a)->a_type, type ) == 0 ) { + if ( strcasecmp( (*a)->a_type, type ) == 0 ) +#endif + { break; } -#endif } if ( *a == NULL ) { *a = (Attribute *) ch_malloc( sizeof(Attribute) ); #ifdef SLAPD_SCHEMA_NOT_COMPAT - /* not yet implemented */ + (*a)->a_desc = ad_dup( desc ); #else (*a)->a_type = attr_normalize( ch_strdup( type ) ); (*a)->a_syntax = attr_syntax( type ); @@ -210,6 +210,28 @@ attr_merge( return( value_add( &(*a)->a_vals, vals ) ); } +#ifdef SLAPD_SCHEMA_NOT_COMPAT +/* + * attrs_find - find attribute(s) by AttributeDescription + * returns next attribute which is subtype of provided description. + */ + +Attribute * +attrs_find( + Attribute *a, + AttributeDescription *desc +) +{ + for ( ; a != NULL; a = a->a_next ) { + if ( is_ad_subtype( a->a_desc, desc ) ) { + return( a ); + } + } + + return( NULL ); +} +#endif + /* * attr_find - find attribute by type */ @@ -217,17 +239,22 @@ attr_merge( Attribute * attr_find( Attribute *a, +#ifdef SLAPD_SCHEMA_NOT_COMPAT + AttributeDescription *desc +#else const char *type +#endif ) { for ( ; a != NULL; a = a->a_next ) { #ifdef SLAPD_SCHEMA_NOT_COMPAT - /* not yet implemented */ + if ( ad_cmp( a->a_desc, desc ) == 0 ) #else - if ( strcasecmp( a->a_type, type ) == 0 ) { + if ( strcasecmp( a->a_type, type ) == 0 ) +#endif + { return( a ); } -#endif } return( NULL ); @@ -243,30 +270,30 @@ attr_find( int attr_delete( Attribute **attrs, +#ifdef SLAPD_SCHEMA_NOT_COMPAT + AttributeDescription *desc +#else const char *type +#endif ) { Attribute **a; - Attribute *save; for ( a = attrs; *a != NULL; a = &(*a)->a_next ) { #ifdef SLAPD_SCHEMA_NOT_COMPAT - /* not yet implemented */ + if ( ad_cmp( (*a)->a_desc, desc ) == 0 ) #else - if ( strcasecmp( (*a)->a_type, type ) == 0 ) { - break; - } + if ( strcasecmp( (*a)->a_type, type ) == 0 ) #endif - } + { + Attribute *save = *a; + *a = (*a)->a_next; + attr_free( save ); - if ( *a == NULL ) { - return( 1 ); + return LDAP_SUCCESS; + } } - save = *a; - *a = (*a)->a_next; - attr_free( save ); - - return( 0 ); + return LDAP_NO_SUCH_ATTRIBUTE; }