]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/add.c
cleanup bind
[openldap] / servers / slapd / add.c
index 2e11d8036092e1fa61b5cf9f22af11cdc2c8ea07..49f7b3440c7e21ebff7d4ff3dd86d4343a3424f2 100644 (file)
@@ -24,9 +24,9 @@
 
 #include "ldap_pvt.h"
 #include "slap.h"
-#include "slapi.h"
 
 #ifdef LDAP_SLAPI
+#include "slapi.h"
 static Slapi_PBlock *initAddPlugin( Backend *be, Connection *conn, Operation *op,
        struct berval *dn, Entry *e, int manageDSAit );
 static int doPreAddPluginFNs( Backend *be, Slapi_PBlock *pb );
@@ -113,7 +113,11 @@ do_add( Connection *conn, Operation *op )
                Modifications *mod;
                ber_tag_t rtag;
 
-               rtag = ber_scanf( ber, "{m{W}}", &tmp.sml_type, &tmp.sml_bvalues );
+#ifdef SLAP_NVALUES
+               tmp.sml_nvalues = NULL;
+#endif
+
+               rtag = ber_scanf( ber, "{m{W}}", &tmp.sml_type, &tmp.sml_values );
 
                if ( rtag == LBER_ERROR ) {
 #ifdef NEW_LOGGING
@@ -128,7 +132,7 @@ do_add( Connection *conn, Operation *op )
                        goto done;
                }
 
-               if ( tmp.sml_bvalues == NULL ) {
+               if ( tmp.sml_values == NULL ) {
 #ifdef NEW_LOGGING
                        LDAP_LOG( OPERATION, INFO, 
                                "do_add: conn %d         no values for type %s\n",
@@ -141,13 +145,16 @@ do_add( Connection *conn, Operation *op )
                                NULL, "no values for attribute type", NULL, NULL );
                        goto done;
                }
+
                mod  = (Modifications *) ch_malloc( sizeof(Modifications) );
-               
                mod->sml_op = LDAP_MOD_ADD;
                mod->sml_next = NULL;
                mod->sml_desc = NULL;
                mod->sml_type = tmp.sml_type;
-               mod->sml_bvalues = tmp.sml_bvalues;
+               mod->sml_values = tmp.sml_values;
+#ifdef SLAP_NVALUES
+               mod->sml_nvalues = NULL;
+#endif
 
                *modtail = mod;
                modtail = &mod->sml_next;
@@ -406,7 +413,7 @@ slap_mods2entry(
                        for( i=0; attr->a_vals[i].bv_val; i++ ) {
                                /* count them */
                        }
-                       for( j=0; mods->sml_bvalues[j].bv_val; j++ ) {
+                       for( j=0; mods->sml_values[j].bv_val; j++ ) {
                                /* count them */
                        }
                        j++;    /* NULL */
@@ -416,12 +423,26 @@ slap_mods2entry(
 
                        /* should check for duplicates */
 
-                       AC_MEMCPY( &attr->a_vals[i], mods->sml_bvalues,
+                       AC_MEMCPY( &attr->a_vals[i], mods->sml_values,
                                sizeof( struct berval ) * j );
 
                        /* trim the mods array */
-                       ch_free( mods->sml_bvalues );
-                       mods->sml_bvalues = NULL;
+                       ch_free( mods->sml_values );
+                       mods->sml_values = NULL;
+
+#ifdef SLAP_NVALUES
+                       if( attr->a_nvals ) {
+                               attr->a_nvals = ch_realloc( attr->a_nvals,
+                                       sizeof( struct berval ) * (i+j) );
+
+                               AC_MEMCPY( &attr->a_nvals[i], mods->sml_nvalues,
+                                       sizeof( struct berval ) * j );
+
+                               /* trim the mods array */
+                               ch_free( mods->sml_nvalues );
+                               mods->sml_nvalues = NULL;
+                       }
+#endif
 
                        continue;
 #else
@@ -432,7 +453,7 @@ slap_mods2entry(
 #endif
                }
 
-               if( mods->sml_bvalues[1].bv_val != NULL ) {
+               if( mods->sml_values[1].bv_val != NULL ) {
                        /* check for duplicates */
                        int             i, j;
                        MatchingRule *mr = mods->sml_desc->ad_type->sat_equality;
@@ -476,8 +497,13 @@ slap_mods2entry(
 
                /* move values to attr structure */
                /*      should check for duplicates */
-               attr->a_vals = mods->sml_bvalues;
-               mods->sml_bvalues = NULL;
+               attr->a_vals = mods->sml_values;
+               mods->sml_values = NULL;
+
+#ifdef SLAP_NVALUES
+               attr->a_nvals = mods->sml_nvalues;
+               mods->sml_nvalues = NULL;
+#endif
 
                *tail = attr;
                tail = &attr->a_next;