1 /* backover.c - backend overlay routines */
4 * Copyright 2003 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
9 * Functions to overlay other modules over a backend.
18 #include <ac/string.h>
19 #include <ac/socket.h>
24 static slap_overinst *overlays;
26 enum db_which { db_open = 0, db_close, db_destroy };
34 slap_overinfo *oi = (slap_overinfo *) be->bd_info;
35 slap_overinst *on = oi->oi_list;
40 func = &oi->oi_bd.bd_info->bi_db_open;
42 rc = func[which]( &oi->oi_bd );
47 for (; on; on=on->on_next) {
48 bd.bd_info = &on->on_bi;
49 func = &on->on_bi.bi_db_open;
51 rc = func[which]( &bd );
67 slap_overinfo *oi = (slap_overinfo *) be->bd_info;
68 slap_overinst *on = oi->oi_list;
72 if ( oi->oi_bd.bd_info->bi_db_config ) {
73 rc = oi->oi_bd.bd_info->bi_db_config( &oi->oi_bd, fname, lineno,
79 for (; on; on=on->on_next) {
80 bd.bd_info = &on->on_bi;
81 if (on->on_bi.bi_db_config) {
82 rc = on->on_bi.bi_db_config( &bd, fname, lineno,
95 return over_db_func( be, db_open );
103 return over_db_func( be, db_close );
111 slap_overinfo *oi = (slap_overinfo *) be->bd_info;
112 slap_overinst *on = oi->oi_list, *next;
115 rc = over_db_func( be, db_destroy );
117 for (next = on->on_next; on; on=next) {
126 over_back_response ( Operation *op, SlapReply *rs )
128 slap_overinfo *oi = (slap_overinfo *) op->o_bd->bd_info;
129 slap_overinst *on = oi->oi_list;
130 int rc = SLAP_CB_CONTINUE;
131 BackendDB *be = op->o_bd, db = *op->o_bd;
132 slap_callback *sc = op->o_callback->sc_private;
135 for (; on; on=on->on_next ) {
136 if ( on->on_response ) {
137 db.bd_info = (BackendInfo *)on;
138 rc = on->on_response( op, rs );
139 if ( ! (rc & SLAP_CB_CONTINUE) ) break;
143 if ( sc && (rc & SLAP_CB_CONTINUE) ) {
144 rc = sc->sc_response( op, rs );
147 rc &= ~SLAP_CB_CONTINUE;
151 enum op_which { op_bind = 0, op_unbind, op_search, op_compare,
152 op_modify, op_modrdn, op_add, op_delete, op_abandon,
153 op_cancel, op_extended };
162 slap_overinfo *oi = (slap_overinfo *) op->o_bd->bd_info;
163 slap_overinst *on = oi->oi_list;
165 BackendDB *be = op->o_bd, db = *op->o_bd;
166 slap_callback cb = {over_back_response, NULL};
170 cb.sc_private = op->o_callback;
171 op->o_callback = &cb;
173 for (; on; on=on->on_next ) {
174 func = &on->on_bi.bi_op_bind;
176 db.bd_info = (BackendInfo *)on;
177 rc = func[which]( op, rs );
182 func = &oi->oi_bd.bd_info->bi_op_bind;
184 rc = func[which]( op, rs );
192 over_op_bind( Operation *op, SlapReply *rs )
194 return over_op_func( op, rs, op_bind );
198 over_op_unbind( Operation *op, SlapReply *rs )
200 return over_op_func( op, rs, op_unbind );
204 over_op_search( Operation *op, SlapReply *rs )
206 return over_op_func( op, rs, op_search );
210 over_op_compare( Operation *op, SlapReply *rs )
212 return over_op_func( op, rs, op_compare );
216 over_op_modify( Operation *op, SlapReply *rs )
218 return over_op_func( op, rs, op_modify );
222 over_op_modrdn( Operation *op, SlapReply *rs )
224 return over_op_func( op, rs, op_modrdn );
228 over_op_add( Operation *op, SlapReply *rs )
230 return over_op_func( op, rs, op_add );
234 over_op_delete( Operation *op, SlapReply *rs )
236 return over_op_func( op, rs, op_delete );
240 over_op_abandon( Operation *op, SlapReply *rs )
242 return over_op_func( op, rs, op_abandon );
246 over_op_cancel( Operation *op, SlapReply *rs )
248 return over_op_func( op, rs, op_cancel );
252 over_op_extended( Operation *op, SlapReply *rs )
254 return over_op_func( op, rs, op_extended );
262 on->on_next = overlays;
267 static const char overtype[] = "over";
269 /* add an overlay to a particular backend. */
271 overlay_config( BackendDB *be, const char *ov )
273 slap_overinst *on, *on2, *prev;
277 for ( on = overlays; on; on=on->on_next ) {
278 if (!strcmp( ov, on->on_bi.bi_type ) )
282 Debug( LDAP_DEBUG_ANY, "overlay %s not found\n", ov, 0, 0 );
286 /* If this is the first overlay on this backend, set up the
287 * overlay info structure
289 if ( be->bd_info->bi_type != overtype ) {
290 oi = ch_malloc( sizeof(slap_overinfo) );
292 oi->oi_bi = *be->bd_info;
294 bi = (BackendInfo *)oi;
296 bi->bi_type = (char *)overtype;
298 bi->bi_db_config = over_db_config;
299 bi->bi_db_open = over_db_open;
300 bi->bi_db_close = over_db_close;
301 bi->bi_db_destroy = over_db_destroy;
303 bi->bi_op_bind = over_op_bind;
304 bi->bi_op_unbind = over_op_unbind;
305 bi->bi_op_search = over_op_search;
306 bi->bi_op_compare = over_op_compare;
307 bi->bi_op_modify = over_op_modify;
308 bi->bi_op_modrdn = over_op_modrdn;
309 bi->bi_op_add = over_op_add;
310 bi->bi_op_delete = over_op_delete;
311 bi->bi_op_abandon = over_op_abandon;
312 bi->bi_op_cancel = over_op_cancel;
313 bi->bi_extended = over_op_extended;
318 /* Walk to the end of the list of overlays, add the new
321 oi = (slap_overinfo *) be->bd_info;
322 for ( prev=NULL, on2 = oi->oi_list; on2; prev=on2, on2=on2->on_next );
323 on2 = ch_malloc( sizeof(slap_overinst) );
331 /* Any initialization needed? */
332 if ( on->on_bi.bi_db_init ) {
333 be->bd_info = (BackendInfo *)on2;
334 on2->on_bi.bi_db_init( be );
335 be->bd_info = (BackendInfo *)oi;