/* $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
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;
}
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",
}
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 );
if ( ce_type == Cft_Database )
nsibs--;
- if ( index != nsibs ) {
+ if ( index != nsibs || isfrontend ) {
if ( gotindex ) {
if ( index < nsibs ) {
if ( tailindex ) return LDAP_NAMING_VIOLATION;
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.
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,
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 )
{
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;
}
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;
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";