Add overlay hooks for entry_get_rw / entry_release_rw

This commit is contained in:
Howard Chu 2007-02-06 04:18:14 +00:00
parent 578a2b0db4
commit 9381fc42a5
3 changed files with 183 additions and 7 deletions

View File

@ -612,6 +612,28 @@ glue_close (
return rc;
}
static int
glue_entry_get_rw (
Operation *op,
struct berval *dn,
ObjectClass *oc,
AttributeDescription *ad,
int rw,
Entry **e )
{
BackendDB *b0 = op->o_bd;
op->o_bd = glue_back_select( b0, dn );
int rc;
if ( op->o_bd->be_fetch ) {
rc = op->o_bd->be_fetch( op, dn, oc, ad, rw, e );
} else {
rc = LDAP_UNWILLING_TO_PERFORM;
}
op->o_bd =b0;
return rc;
}
static int
glue_entry_release_rw (
Operation *op,
@ -619,13 +641,10 @@ glue_entry_release_rw (
int rw
)
{
BackendDB *b0, b2;
BackendDB *b0 = op->o_bd;
int rc = -1;
b0 = op->o_bd;
b2 = *op->o_bd;
b2.bd_info = (BackendInfo *)glue_tool_inst( op->o_bd->bd_info );
op->o_bd = glue_back_select (&b2, &e->e_nname);
op->o_bd = glue_back_select (b0, &e->e_nname);
if ( op->o_bd->be_release ) {
rc = op->o_bd->be_release( op, e, rw );
@ -822,8 +841,6 @@ glue_db_init(
oi->oi_bi.bi_open = glue_open;
oi->oi_bi.bi_close = glue_close;
oi->oi_bi.bi_entry_release_rw = glue_entry_release_rw;
/* Only advertise these if the root DB supports them */
if ( bi->bi_tool_entry_open )
oi->oi_bi.bi_tool_entry_open = glue_tool_entry_open;
@ -1036,6 +1053,9 @@ glue_sub_init()
glue.on_bi.bi_chk_referrals = glue_chk_referrals;
glue.on_bi.bi_chk_controls = glue_chk_controls;
glue.on_bi.bi_entry_get_rw = glue_entry_get_rw;
glue.on_bi.bi_entry_release_rw = glue_entry_release_rw;
glue.on_response = glue_response;
return overlay_register( &glue );

View File

@ -322,6 +322,147 @@ over_access_allowed(
return rc;
}
int
overlay_entry_get_ov(
Operation *op,
struct berval *dn,
ObjectClass *oc,
AttributeDescription *ad,
int rw,
Entry **e,
slap_overinst *on )
{
slap_overinfo *oi = on->on_info;
BackendDB *be = op->o_bd, db;
BackendInfo *bi = op->o_bd->bd_info;
int rc = SLAP_CB_CONTINUE;
for ( ; on; on = on->on_next ) {
if ( on->on_bi.bi_entry_get_rw ) {
/* NOTE: do not copy the structure until required */
if ( !SLAP_ISOVERLAY( op->o_bd ) ) {
db = *op->o_bd;
db.be_flags |= SLAP_DBFLAG_OVERLAY;
op->o_bd = &db;
}
op->o_bd->bd_info = (BackendInfo *)on;
rc = on->on_bi.bi_entry_get_rw( op, dn,
oc, ad, rw, e );
if ( rc != SLAP_CB_CONTINUE ) break;
}
}
if ( rc == SLAP_CB_CONTINUE ) {
/* if the database structure was changed, o_bd points to a
* copy of the structure; put the original bd_info in place */
if ( SLAP_ISOVERLAY( op->o_bd ) ) {
op->o_bd->bd_info = oi->oi_orig;
}
if ( oi->oi_orig->bi_entry_get_rw ) {
rc = oi->oi_orig->bi_entry_get_rw( op, dn,
oc, ad, rw, e );
}
}
/* should not fall thru this far without anything happening... */
if ( rc == SLAP_CB_CONTINUE ) {
rc = LDAP_UNWILLING_TO_PERFORM;
}
op->o_bd = be;
op->o_bd->bd_info = bi;
return rc;
}
static int
over_entry_get_rw(
Operation *op,
struct berval *dn,
ObjectClass *oc,
AttributeDescription *ad,
int rw,
Entry **e )
{
slap_overinfo *oi;
slap_overinst *on;
assert( op->o_bd != NULL );
oi = op->o_bd->bd_info->bi_private;
on = oi->oi_list;
return overlay_entry_get_ov( op, dn, oc, ad, rw, e, on );
}
int
overlay_entry_release_ov(
Operation *op,
Entry *e,
int rw,
slap_overinst *on )
{
slap_overinfo *oi = on->on_info;
BackendDB *be = op->o_bd, db;
BackendInfo *bi = op->o_bd->bd_info;
int rc = SLAP_CB_CONTINUE;
for ( ; on; on = on->on_next ) {
if ( on->on_bi.bi_entry_release_rw ) {
/* NOTE: do not copy the structure until required */
if ( !SLAP_ISOVERLAY( op->o_bd ) ) {
db = *op->o_bd;
db.be_flags |= SLAP_DBFLAG_OVERLAY;
op->o_bd = &db;
}
op->o_bd->bd_info = (BackendInfo *)on;
rc = on->on_bi.bi_entry_release_rw( op, e, rw );
if ( rc != SLAP_CB_CONTINUE ) break;
}
}
if ( rc == SLAP_CB_CONTINUE ) {
/* if the database structure was changed, o_bd points to a
* copy of the structure; put the original bd_info in place */
if ( SLAP_ISOVERLAY( op->o_bd ) ) {
op->o_bd->bd_info = oi->oi_orig;
}
if ( oi->oi_orig->bi_entry_release_rw ) {
rc = oi->oi_orig->bi_entry_release_rw( op, e, rw );
}
}
/* should not fall thru this far without anything happening... */
if ( rc == SLAP_CB_CONTINUE ) {
entry_free( e );
rc = 0;
}
op->o_bd = be;
op->o_bd->bd_info = bi;
return rc;
}
static int
over_entry_release_rw(
Operation *op,
Entry *e,
int rw )
{
slap_overinfo *oi;
slap_overinst *on;
assert( op->o_bd != NULL );
oi = op->o_bd->bd_info->bi_private;
on = oi->oi_list;
return overlay_entry_release_ov( op, e, rw, on );
}
static int
over_acl_group(
Operation *op,
@ -1090,6 +1231,8 @@ overlay_config( BackendDB *be, const char *ov, int idx, BackendInfo **res )
bi->bi_chk_controls = over_aux_chk_controls;
/* these have specific arglists */
bi->bi_entry_get_rw = over_entry_get_rw;
bi->bi_entry_release_rw = over_entry_release_rw;
bi->bi_access_allowed = over_access_allowed;
bi->bi_acl_group = over_acl_group;
bi->bi_acl_attribute = over_acl_attribute;

View File

@ -437,6 +437,19 @@ LDAP_SLAPD_F (int) overlay_op_walk LDAP_P((
slap_operation_t which,
slap_overinfo *oi,
slap_overinst *on ));
LDAP_SLAPD_F (int) overlay_entry_get_ov LDAP_P((
Operation *op,
struct berval *dn,
ObjectClass *oc,
AttributeDescription *ad,
int rw,
Entry **e,
slap_overinst *ov ));
LDAP_SLAPD_F (int) overlay_entry_release_ov LDAP_P((
Operation *op,
Entry *e,
int rw,
slap_overinst *ov ));
LDAP_SLAPD_F (void) overlay_insert LDAP_P((
BackendDB *be, slap_overinst *on, slap_overinst ***prev, int idx ));
LDAP_SLAPD_F (void) overlay_move LDAP_P((