]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapi/slapi_utils.c
ITS#3924
[openldap] / servers / slapd / slapi / slapi_utils.c
index 8d5560109990b337a784c8b054a35e40e9c4bffa..8e7b656468c114a3fdf26af2c54c9aee42eae77c 100644 (file)
@@ -294,7 +294,7 @@ slapi_entry_attr_get_charptr( const Slapi_Entry *e, const char *type )
 
                p = slapi_value_get_string( &attr->a_vals[0] );
                if ( p != NULL ) {
-                       return slapi_ch_strdup( (char *)p );
+                       return slapi_ch_strdup( p );
                }
        }
 
@@ -1094,15 +1094,15 @@ slapi_ch_realloc(
 }
 
 char *
-slapi_ch_strdup( char *s ) 
+slapi_ch_strdup( const char *s ) 
 {
-       return ch_strdup( (const char *)s );
+       return ch_strdup( s );
 }
 
 size_t
-slapi_ch_stlen( char *s ) 
+slapi_ch_stlen( const char *s ) 
 {
-       return strlen( (const char *)s );
+       return strlen( s );
 }
 
 int 
@@ -2376,7 +2376,7 @@ Slapi_Value *slapi_value_init_berval(Slapi_Value *v, struct berval *bval)
 
 Slapi_Value *slapi_value_init_string(Slapi_Value *v, const char *s)
 {
-       v->bv_val = slapi_ch_strdup( (char *)s );
+       v->bv_val = slapi_ch_strdup( s );
        v->bv_len = strlen( s );
 
        return v;
@@ -2681,7 +2681,7 @@ int slapi_acl_check_mods(Slapi_PBlock *pb, Slapi_Entry *e, LDAPMod **mods, char
        if ( pb == NULL || pb->pb_op == NULL )
                return LDAP_PARAM_ERROR;
 
-       ml = slapi_int_ldapmods2modifications( mods, NULL );
+       ml = slapi_int_ldapmods2modifications( mods );
        if ( ml == NULL ) {
                return LDAP_OTHER;
        }
@@ -2703,10 +2703,7 @@ int slapi_acl_check_mods(Slapi_PBlock *pb, Slapi_Entry *e, LDAPMod **mods, char
  * 
  * This function must also be called before slap_mods_check().
  */
-LDAPMod **slapi_int_modifications2ldapmods(
-       Modifications **pmodlist,
-       void *memctx
-)
+LDAPMod **slapi_int_modifications2ldapmods( Modifications **pmodlist )
 {
        Modifications *ml, *modlist;
        LDAPMod **mods, *modp;
@@ -2717,24 +2714,30 @@ LDAPMod **slapi_int_modifications2ldapmods(
        for( i = 0, ml = modlist; ml != NULL; i++, ml = ml->sml_next )
                ;
 
-       mods = (LDAPMod **)slap_sl_malloc( (i + 1) * sizeof(LDAPMod *), memctx );
+       mods = (LDAPMod **)slapi_ch_malloc( (i + 1) * sizeof(LDAPMod *) );
 
        for( i = 0, ml = modlist; ml != NULL; ml = ml->sml_next ) {
-               mods[i] = (LDAPMod *)slap_sl_malloc( sizeof(LDAPMod), memctx );
+               mods[i] = (LDAPMod *)slapi_ch_malloc( sizeof(LDAPMod) );
                modp = mods[i];
                modp->mod_op = ml->sml_op | LDAP_MOD_BVALUES;
-               modp->mod_type = slapi_ch_strdup( ml->sml_type.bv_val );
-               ml->sml_type.bv_val = NULL;
+               if ( BER_BVISNULL( &ml->sml_type ) ) {
+                       /* may happen for internally generated mods */
+                       assert( ml->sml_desc != NULL );
+                       modp->mod_type = slapi_ch_strdup( ml->sml_desc->ad_cname.bv_val );
+               } else {
+                       modp->mod_type = slapi_ch_strdup( ml->sml_type.bv_val );
+                       BER_BVZERO( &ml->sml_type );
+               }
 
                if ( ml->sml_values != NULL ) {
                        for( j = 0; ml->sml_values[j].bv_val != NULL; j++ )
                                ;
-                       modp->mod_bvalues = (struct berval **)slap_sl_malloc( (j + 1) *
-                               sizeof(struct berval *), memctx );
+                       modp->mod_bvalues = (struct berval **)slapi_ch_malloc( (j + 1) *
+                               sizeof(struct berval *) );
                        for( j = 0; ml->sml_values[j].bv_val != NULL; j++ ) {
+                               modp->mod_bvalues[j] = (struct berval *)slapi_ch_malloc(
+                                               sizeof(struct berval) );
                                /* Take ownership of original values. */
-                               modp->mod_bvalues[j] = (struct berval *)slap_sl_malloc(
-                                               sizeof(struct berval), memctx );
                                modp->mod_bvalues[j]->bv_len = ml->sml_values[j].bv_len;
                                modp->mod_bvalues[j]->bv_val = ml->sml_values[j].bv_val;
                                ml->sml_values[j].bv_len = 0;
@@ -2763,7 +2766,7 @@ LDAPMod **slapi_int_modifications2ldapmods(
  * before prettying (and we can't easily get out of calling
  * slap_mods_check() because we need normalized values).
  */
-Modifications *slapi_int_ldapmods2modifications ( LDAPMod **mods, void *memctx )
+Modifications *slapi_int_ldapmods2modifications ( LDAPMod **mods )
 {
        Modifications *modlist = NULL, **modtail;
        LDAPMod **modp;
@@ -2787,7 +2790,7 @@ Modifications *slapi_int_ldapmods2modifications ( LDAPMod **mods, void *memctx )
                        continue;
                }
 
-               mod = (Modifications *) slap_sl_malloc( sizeof(Modifications), memctx );
+               mod = (Modifications *) slapi_ch_malloc( sizeof(Modifications) );
                mod->sml_op = lmod->mod_op & ~(LDAP_MOD_BVALUES);
                mod->sml_flags = 0;
                mod->sml_type = ad->ad_cname;
@@ -2810,7 +2813,7 @@ Modifications *slapi_int_ldapmods2modifications ( LDAPMod **mods, void *memctx )
                if ( i == 0 ) {
                        mod->sml_values = NULL;
                } else {
-                       mod->sml_values = (BerVarray) slap_sl_malloc( (i + 1) * sizeof(struct berval), memctx );
+                       mod->sml_values = (BerVarray) slapi_ch_malloc( (i + 1) * sizeof(struct berval) );
 
                        /* NB: This implicitly trusts a plugin to return valid modifications. */
                        if ( lmod->mod_op & LDAP_MOD_BVALUES ) {
@@ -2819,8 +2822,7 @@ Modifications *slapi_int_ldapmods2modifications ( LDAPMod **mods, void *memctx )
                                }
                        } else {
                                for ( i = 0; lmod->mod_values[i] != NULL; i++ ) {
-                                       mod->sml_values[i].bv_val = dup ? slapi_ch_strdup( lmod->mod_values[i] ) :
-                                               lmod->mod_values[i];
+                                       mod->sml_values[i].bv_val = slapi_ch_strdup( lmod->mod_values[i] );
                                        mod->sml_values[i].bv_len = strlen( lmod->mod_values[i] );
                                }
                        }
@@ -2833,7 +2835,7 @@ Modifications *slapi_int_ldapmods2modifications ( LDAPMod **mods, void *memctx )
                modtail = &mod->sml_next;
        }
 
-       if ( slap_mods_check( modlist, &text, textbuf, sizeof( textbuf ), memctx ) != LDAP_SUCCESS ) {
+       if ( slap_mods_check( modlist, &text, textbuf, sizeof( textbuf ), NULL ) != LDAP_SUCCESS ) {
                slap_mods_free( modlist, 1 );
                modlist = NULL;
        }
@@ -2841,39 +2843,6 @@ Modifications *slapi_int_ldapmods2modifications ( LDAPMod **mods, void *memctx )
        return modlist;
 }
 
-/*
- * This function only frees the parts of the mods array that
- * are not shared with the Modification list that was created
- * by slapi_int_ldapmods2modifications() (if dup == 0).
- */
-void
-slapi_int_free_ldapmods ( LDAPMod **mods )
-{
-       int i, j;
-
-       if ( mods == NULL )
-               return;
-
-       for ( i = 0; mods[i] != NULL; i++ ) {
-               /*
-                * Don't free values themselves; they're owned by the
-                * Modification list. Do free the containing array.
-                */
-               if ( mods[i]->mod_op & LDAP_MOD_BVALUES ) {
-                       if ( mods[i]->mod_bvalues != NULL ) {
-                               for ( j = 0; mods[i]->mod_bvalues[j] != NULL; j++ )
-                                       slapi_ch_free( (void **)&mods[i]->mod_bvalues[j] );
-                               slapi_ch_free( (void **)&mods[i]->mod_bvalues );
-                       }
-               } else {
-                       slapi_ch_free( (void **)&mods[i]->mod_values );
-               }
-               slapi_ch_free_string( &mods[i]->mod_type );
-               slapi_ch_free( (void **)&mods[i] );
-       }
-       slapi_ch_free( (void **)&mods );
-}
-
 /*
  * Sun ONE DS 5.x computed attribute support. Computed attributes
  * allow for dynamically generated operational attributes, a very
@@ -3489,6 +3458,44 @@ slapi_op_get_type(Slapi_Operation * op)
        return type;
 }
 
+void slapi_be_set_readonly( Slapi_Backend *be, int readonly )
+{
+       if ( be == NULL )
+               return;
+
+       if ( readonly )
+               be->be_restrictops |= SLAP_RESTRICT_OP_WRITES;
+       else
+               be->be_restrictops &= ~(SLAP_RESTRICT_OP_WRITES);
+}
+
+int slapi_be_get_readonly( Slapi_Backend *be )
+{
+       if ( be == NULL )
+               return 0;
+
+       return ( (be->be_restrictops & SLAP_RESTRICT_OP_WRITES) == SLAP_RESTRICT_OP_WRITES );
+}
+
+const char *slapi_x_be_get_updatedn( Slapi_Backend *be )
+{
+       if ( be == NULL )
+               return NULL;
+
+       return be->be_update_ndn.bv_val;
+}
+
+Slapi_Backend *slapi_be_select( const Slapi_DN *sdn )
+{
+       Slapi_Backend *be;
+
+       slapi_sdn_get_ndn( sdn );
+
+       be = select_backend( (struct berval *)&sdn->ndn, 0, 0 );
+
+       return be;
+}
+
 #if 0
 void
 slapi_operation_set_flag(Slapi_Operation *op, unsigned long flag)