-#ifdef PCACHE_CONTROL_PRIVDB
-static int
-pcache_op_privdb(
- Operation *op,
- SlapReply *rs )
-{
- slap_overinst *on = (slap_overinst *)op->o_bd->bd_info;
- cache_manager *cm = on->on_bi.bi_private;
- slap_callback *save_cb;
- slap_op_t type;
-
- /* skip if control is unset */
- if ( op->o_ctrlflag[ privDB_cid ] != SLAP_CONTROL_CRITICAL ) {
- return SLAP_CB_CONTINUE;
- }
-
- /* The cache DB isn't open yet */
- if ( cm->defer_db_open ) {
- send_ldap_error( op, rs, LDAP_UNAVAILABLE,
- "pcachePrivDB: cacheDB not available" );
- return rs->sr_err;
- }
-
- /* FIXME: might be a little bit exaggerated... */
- if ( !be_isroot( op ) ) {
- save_cb = op->o_callback;
- op->o_callback = NULL;
- send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
- "pcachePrivDB: operation not allowed" );
- op->o_callback = save_cb;
-
- return rs->sr_err;
- }
-
- /* map tag to operation */
- type = slap_req2op( op->o_tag );
- if ( type != SLAP_OP_LAST ) {
- BI_op_func **func;
- int rc;
-
- /* execute, if possible */
- func = &cm->db.be_bind;
- if ( func[ type ] != NULL ) {
- Operation op2 = *op;
-
- op2.o_bd = &cm->db;
-
- rc = func[ type ]( &op2, rs );
- if ( type == SLAP_OP_BIND && rc == LDAP_SUCCESS ) {
- op->o_conn->c_authz_cookie = cm->db.be_private;
- }
-
- return rs->sr_err;
- }
- }
-
- /* otherwise fall back to error */
- save_cb = op->o_callback;
- op->o_callback = NULL;
- send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
- "operation not supported with pcachePrivDB control" );
- op->o_callback = save_cb;
-
- return rs->sr_err;
-}
-#endif /* PCACHE_CONTROL_PRIVDB */