]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/attr.c
Format %d -> %ld.
[openldap] / servers / slapd / attr.c
index a2a009aeff20bb3cb6d10d3fc536bcd0443b0e6b..2a6b5f180e6a5b8bec29205d293cb2908fac3fda 100644 (file)
@@ -1,9 +1,28 @@
+/* attr.c - routines for dealing with attributes */
 /* $OpenLDAP$ */
-/*
- * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2003 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+/* Portions Copyright (c) 1995 Regents of the University of Michigan.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of Michigan at Ann Arbor. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
  */
-/* attr.c - routines for dealing with attributes */
 
 #include "portable.h"
 
@@ -111,8 +130,8 @@ Attribute *attrs_dup( Attribute *a )
  * attr_merge - merge the given type and value with the list of
  * attributes in attrs.
  *
- * For SLAP_NVALUES: nvals must be NULL if the attribute has no
- * normalizer. In this case, a->a_nvals will be set equal to a->a_vals.
+ * nvals must be NULL if the attribute has no normalizer.
+ * In this case, a->a_nvals will be set equal to a->a_vals.
  *
  * returns     0       everything went ok
  *             -1      trouble
@@ -156,23 +175,26 @@ int
 attr_merge_normalize(
        Entry           *e,
        AttributeDescription *desc,
-       BerVarray       vals
+       BerVarray       vals,
+       void     *memctx
 ) {
        BerVarray       nvals = NULL;
        int             rc;
 
-       if ( desc->ad_type->sat_equality->smr_normalize ) {
+       if ( desc->ad_type->sat_equality &&
+               desc->ad_type->sat_equality->smr_normalize )
+       {
                int     i;
                
-               for ( i = 0; vals[i].bv_val; i++);
+               for ( i = 0; vals[i].bv_val; i++ );
 
-               nvals = ch_calloc( sizeof(struct berval), i + 1 );
+               nvals = sl_calloc( sizeof(struct berval), i + 1, memctx );
                for ( i = 0; vals[i].bv_val; i++ ) {
                        rc = (*desc->ad_type->sat_equality->smr_normalize)(
-                                       0,
+                                       SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
                                        desc->ad_type->sat_syntax,
                                        desc->ad_type->sat_equality,
-                                       &vals[i], &nvals[i] );
+                                       &vals[i], &nvals[i], memctx );
 
                        if ( rc != LDAP_SUCCESS ) {
                                nvals[i+1].bv_val = NULL;
@@ -185,7 +207,9 @@ attr_merge_normalize(
        rc = attr_merge( e, desc, vals, nvals );
 
 error_return:;
-       ber_bvarray_free( nvals );
+       if ( nvals != NULL ) {
+               ber_bvarray_free_x( nvals, memctx );
+       }
        return rc;
 }
 
@@ -225,25 +249,34 @@ int
 attr_merge_normalize_one(
        Entry           *e,
        AttributeDescription *desc,
-       struct berval   *val
+       struct berval   *val,
+       void            *memctx
 ) {
        struct berval   nval;
+       struct berval   *nvalp;
        int             rc;
 
-       if ( desc->ad_type->sat_equality->smr_normalize ) {
+       if ( desc->ad_type->sat_equality &&
+               desc->ad_type->sat_equality->smr_normalize )
+       {
                rc = (*desc->ad_type->sat_equality->smr_normalize)(
-                               0,
+                               SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
                                desc->ad_type->sat_syntax,
                                desc->ad_type->sat_equality,
-                               val, &nval );
+                               val, &nval, memctx );
 
                if ( rc != LDAP_SUCCESS ) {
                        return rc;
                }
+               nvalp = &nval;
+       } else {
+               nvalp = NULL;
        }
 
-       rc = attr_merge_one( e, desc, val, &nval );
-       ch_free( nval.bv_val );
+       rc = attr_merge_one( e, desc, val, nvalp );
+       if ( nvalp != NULL ) {
+               sl_free( nval.bv_val, memctx );
+       }
        return rc;
 }