mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-02-05 13:40:08 +08:00
Add overlay hooks for entry_get_rw / entry_release_rw
This commit is contained in:
parent
578a2b0db4
commit
9381fc42a5
@ -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 );
|
||||
|
@ -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;
|
||||
|
@ -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((
|
||||
|
Loading…
Reference in New Issue
Block a user