static int deref_cid;
static slap_overinst deref;
+static int ov_count;
static int
deref_parseCtrl (
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 );