X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Foverlays%2Fderef.c;h=af4d368f56080ca1a03bbb146efe2df7e5b6a143;hb=e6910e0a0c689b289837e75352541ee3fc966064;hp=2f4f564d236212acb06c9badfcfe6a0f89604832;hpb=0ea05ad5f28052268be08b324a1e09c907fc88c6;p=openldap diff --git a/servers/slapd/overlays/deref.c b/servers/slapd/overlays/deref.c index 2f4f564d23..af4d368f56 100644 --- a/servers/slapd/overlays/deref.c +++ b/servers/slapd/overlays/deref.c @@ -139,6 +139,7 @@ typedef struct deref_cb_t { static int deref_cid; static slap_overinst deref; +static int ov_count; static int deref_parseCtrl ( @@ -516,22 +517,57 @@ deref_op_search( Operation *op, SlapReply *rs ) return SLAP_CB_CONTINUE; } -int -deref_initialize(void) +static int +deref_db_init( BackendDB *be, ConfigReply *cr) +{ + if ( ov_count == 0 ) { + int rc; + + rc = register_supported_control2( LDAP_CONTROL_X_DEREF, + SLAP_CTRL_SEARCH, + NULL, + deref_parseCtrl, + 1, /* replace */ + &deref_cid ); + if ( rc != LDAP_SUCCESS ) { + Debug( LDAP_DEBUG_ANY, + "deref_init: Failed to register control (%d)\n", + rc, 0, 0 ); + return rc; + } + } + ov_count++; + return LDAP_SUCCESS; +} + +static int +deref_db_open( BackendDB *be, ConfigReply *cr) +{ + return overlay_register_control( be, LDAP_CONTROL_X_DEREF ); +} + +#ifdef SLAP_CONFIG_DELETE +static int +deref_db_destroy( BackendDB *be, ConfigReply *cr) { - int rc; - - rc = register_supported_control( LDAP_CONTROL_X_DEREF, - SLAP_CTRL_SEARCH, NULL, - deref_parseCtrl, &deref_cid ); - if ( rc != LDAP_SUCCESS ) { - Debug( LDAP_DEBUG_ANY, - "deref_init: Failed to register control (%d)\n", - rc, 0, 0 ); - return -1; + ov_count--; + overlay_unregister_control( be, LDAP_CONTROL_X_DEREF ); + if ( ov_count == 0 ) { + unregister_supported_control( LDAP_CONTROL_X_DEREF ); } + return 0; +} +#endif /* SLAP_CONFIG_DELETE */ +int +deref_initialize(void) +{ deref.on_bi.bi_type = "deref"; + deref.on_bi.bi_db_init = deref_db_init; + deref.on_bi.bi_db_open = deref_db_open; +#ifdef SLAP_CONFIG_DELETE + deref.on_bi.bi_db_destroy = deref_db_destroy; +#endif /* SLAP_CONFIG_DELETE */ deref.on_bi.bi_op_search = deref_op_search; return overlay_register( &deref );