X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fbconfig.c;h=5391f56c7defda38750e216aaec21e1d9c929152;hb=5324d283d9ff1ba0f608d1130be683eb698f831e;hp=e12a89aeb8d3bfb92155c0828fba3b003122d00a;hpb=1fcd116219680bd3b3a2a439242ad29f3eaca345;p=openldap diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index e12a89aeb8..5391f56c7d 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * 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";