]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/bconfig.c
ITS#8054 operation duration logging
[openldap] / servers / slapd / bconfig.c
index e12a89aeb8d3bfb92155c0828fba3b003122d00a..5391f56c7defda38750e216aaec21e1d9c929152 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2005-2013 The OpenLDAP Foundation.
+ * Copyright 2005-2015 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -3203,9 +3203,9 @@ config_suffix(ConfigArgs *c)
        if(tbe == c->be) {
                Debug( LDAP_DEBUG_ANY, "%s: suffix already served by this backend!.\n",
                        c->log, 0, 0);
-               return 1;
                free(pdn.bv_val);
                free(ndn.bv_val);
+               return 1;
        } else if(tbe) {
                BackendDB *b2 = tbe;
 
@@ -3285,7 +3285,7 @@ config_rootpw(ConfigArgs *c) {
        }
 
        tbe = select_backend(&c->be->be_rootndn, 0);
-       if(tbe != c->be) {
+       if(tbe != c->be && !SLAP_DBHIDDEN( c->be )) {
                snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> can only be set when rootdn is under suffix",
                        c->argv[0] );
                Debug(LDAP_DEBUG_ANY, "%s: %s\n",
@@ -3661,7 +3661,8 @@ loglevel2bvarray( int l, BerVarray *bva )
        }
 
        if ( l == 0 ) {
-               return value_add_one( bva, ber_bvstr( "0" ) );
+               struct berval bv = BER_BVC("0");
+               return value_add_one( bva, &bv );
        }
 
        return mask_to_verbs( loglevel_ops, l, bva );
@@ -4925,7 +4926,7 @@ check_name_index( CfEntryInfo *parent, ConfigType ce_type, Entry *e,
        if ( ce_type == Cft_Database )
                nsibs--;
 
-       if ( index != nsibs ) {
+       if ( index != nsibs || isfrontend ) {
                if ( gotindex ) {
                        if ( index < nsibs ) {
                                if ( tailindex ) return LDAP_NAMING_VIOLATION;
@@ -6580,10 +6581,22 @@ int config_entry_release(
        Entry *e,
        int rw )
 {
+       int rc = LDAP_SUCCESS;
+
        if ( !e->e_private ) {
-               entry_free( e );
+               BackendDB *be = op->o_bd;
+               CfBackInfo *cfb = be->be_private;
+               BackendInfo *bi = cfb->cb_db.bd_info;
+
+               if ( bi && bi->bi_entry_release_rw ) {
+                       op->o_bd = &cfb->cb_db;
+                       rc = bi->bi_entry_release_rw( op, e, rw );
+                       op->o_bd = be;
+               } else {
+                       entry_free( e );
+               }
        }
-       return LDAP_SUCCESS;
+       return rc;
 }
 
 /* return LDAP_SUCCESS IFF we can retrieve the specified entry.
@@ -6825,7 +6838,12 @@ config_build_schema_inc( ConfigArgs *c, CfEntryInfo *ceparent,
                        bv.bv_len );
                c->value_dn.bv_len += bv.bv_len;
                c->value_dn.bv_val[c->value_dn.bv_len] ='\0';
-               rdnNormalize( 0, NULL, NULL, &c->value_dn, &rdn, NULL );
+               if ( rdnNormalize( 0, NULL, NULL, &c->value_dn, &rdn, NULL )) {
+                       Debug( LDAP_DEBUG_ANY,
+                               "config_build_schema_inc: invalid schema name \"%s\"\n",
+                               bv.bv_val, 0, 0 );
+                       return -1;
+               }
 
                c->ca_private = cf;
                e = config_build_entry( op, rs, ceparent, c, &rdn,
@@ -7384,6 +7402,18 @@ config_tool_entry_next( BackendDB *be )
                return NOID;
 }
 
+static ID
+config_tool_dn2id_get( Backend *be, struct berval *dn )
+{
+       CfBackInfo *cfb = be->be_private;
+       BackendInfo *bi = cfb->cb_db.bd_info;
+
+       if ( bi && bi->bi_tool_dn2id_get )
+               return bi->bi_tool_dn2id_get( &cfb->cb_db, dn );
+
+       return NOID;
+}
+
 static Entry *
 config_tool_entry_get( BackendDB *be, ID id )
 {
@@ -7461,22 +7491,6 @@ config_tool_entry_put( BackendDB *be, Entry *e, struct berval *text )
                                        return NOID;
                                }
                        } else {
-                               if ( !strncmp( e->e_nname.bv_val + 
-                                       STRLENOF( "olcDatabase" ), "=frontend",
-                                       STRLENOF( "=frontend" ) ) )
-                               {
-                                       struct berval rdn, pdn, ndn;
-                                       dnParent( &e->e_nname, &pdn );
-                                       rdn.bv_val = ca.log;
-                                       rdn.bv_len = snprintf(rdn.bv_val, sizeof( ca.log ),
-                                               "%s=" SLAP_X_ORDERED_FMT "%s",
-                                               cfAd_database->ad_cname.bv_val, -1,
-                                               frontendDB->bd_info->bi_type );
-                                       build_new_dn( &ndn, &pdn, &rdn, NULL );
-                                       ber_memfree( e->e_name.bv_val );
-                                       e->e_name = ndn;
-                                       ber_bvreplace( &e->e_nname, &e->e_name );
-                               }
                                entry_put_got_frontend++;
                                isFrontend = 1;
                        }
@@ -7566,6 +7580,38 @@ config_tool_entry_put( BackendDB *be, Entry *e, struct berval *text )
                return NOID;
 }
 
+static ID
+config_tool_entry_modify( BackendDB *be, Entry *e, struct berval *text )
+{
+       CfBackInfo *cfb = be->be_private;
+       BackendInfo *bi = cfb->cb_db.bd_info;
+       CfEntryInfo *ce, *last;
+       ConfigArgs ca = {0};
+
+       ce = config_find_base( cfb->cb_root, &e->e_nname, &last );
+
+       if ( ce && bi && bi->bi_tool_entry_modify )
+               return bi->bi_tool_entry_modify( &cfb->cb_db, e, text );
+
+       return NOID;
+}
+
+static int
+config_tool_entry_delete( BackendDB *be, struct berval *ndn, struct berval *text )
+{
+       CfBackInfo *cfb = be->be_private;
+       BackendInfo *bi = cfb->cb_db.bd_info;
+       CfEntryInfo *ce, *last;
+       ConfigArgs ca = {0};
+
+       ce = config_find_base( cfb->cb_root, ndn, &last );
+
+       if ( ce && bi && bi->bi_tool_entry_delete )
+               return bi->bi_tool_entry_delete( &cfb->cb_db, ndn, text );
+
+       return LDAP_OTHER;
+}
+
 static struct {
        char *name;
        AttributeDescription **desc;
@@ -7661,8 +7707,11 @@ config_back_initialize( BackendInfo *bi )
        bi->bi_tool_entry_first = config_tool_entry_first;
        bi->bi_tool_entry_first_x = config_tool_entry_first_x;
        bi->bi_tool_entry_next = config_tool_entry_next;
+       bi->bi_tool_dn2id_get = config_tool_dn2id_get;
        bi->bi_tool_entry_get = config_tool_entry_get;
        bi->bi_tool_entry_put = config_tool_entry_put;
+       bi->bi_tool_entry_modify = config_tool_entry_modify;
+       bi->bi_tool_entry_delete = config_tool_entry_delete;
 
        ca.argv = argv;
        argv[ 0 ] = "slapd";