From 62da6969dc6a3fb81d873eee8b5d2bf779a0e5b3 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 11 Jun 2003 02:27:51 +0000 Subject: [PATCH] Preliminary backend overlay support, based on backglue, not tested... --- servers/slapd/Makefile.in | 4 +- servers/slapd/backover.c | 317 ++++++++++++++++++++++++++++++++ servers/slapd/config.c | 20 +- servers/slapd/proto-slap.h | 7 + servers/slapd/slap.h | 16 ++ servers/slapd/tools/Makefile.in | 2 +- 6 files changed, 362 insertions(+), 4 deletions(-) create mode 100644 servers/slapd/backover.c diff --git a/servers/slapd/Makefile.in b/servers/slapd/Makefile.in index dd8fbddca2..706d5459b4 100644 --- a/servers/slapd/Makefile.in +++ b/servers/slapd/Makefile.in @@ -23,7 +23,7 @@ SRCS = main.c globals.c config.c daemon.c \ oidm.c starttls.c index.c sets.c referral.c root_dse.c \ sasl.c module.c mra.c mods.c sl_malloc.c limits.c \ backglue.c operational.c matchedValues.c cancel.c syncrepl.c \ - $(@PLAT@_SRCS) + backover.c $(@PLAT@_SRCS) OBJS = main.o globals.o config.o daemon.o \ connection.o search.o filter.o add.o cr.o \ @@ -37,7 +37,7 @@ OBJS = main.o globals.o config.o daemon.o \ oidm.o starttls.o index.o sets.o referral.o root_dse.o \ sasl.o module.o mra.o mods.o sl_malloc.o limits.o \ backglue.o operational.o matchedValues.o cancel.o syncrepl.o \ - $(@PLAT@_OBJS) + backover.o $(@PLAT@_OBJS) LDAP_INCDIR= ../../include -I$(srcdir)/slapi LDAP_LIBDIR= ../../libraries diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c new file mode 100644 index 0000000000..ceeb6011af --- /dev/null +++ b/servers/slapd/backover.c @@ -0,0 +1,317 @@ +/* backover.c - backend overlay routines */ +/* $OpenLDAP$ */ +/* + * Copyright 2003 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ + +/* + * Functions to overlay other modules over a backend. + * + * -- Howard Chu + */ + +#include "portable.h" + +#include + +#include +#include + +#define SLAPD_TOOLS +#include "slap.h" + +static slap_overinst *overlays; + +enum db_which { db_open = 0, db_close, db_destroy }; + +static int +over_db_func( + BackendDB *be, + enum db_which which +) +{ + slap_overinfo *oi = (slap_overinfo *) be->bd_info; + slap_overinst *on = oi->oi_list; + BackendDB bd; + BI_db_open **func; + int rc = 0; + + func = &oi->oi_bi.bi_db_open; + if ( func[which] ) { + rc = func[which]( &oi->oi_bd ); + if ( rc ) return rc; + } + + bd = *be; + for (; on; on=on->on_next) { + bd.bd_info = &on->on_bi; + func = &on->on_bi.bi_db_open; + if (func[which]) { + rc = func[which]( &bd ); + if ( rc ) break; + } + } + return rc; +} + +static int +over_db_config( + BackendDB *be, + const char *fname, + int lineno, + int argc, + char **argv +) +{ + slap_overinfo *oi = (slap_overinfo *) be->bd_info; + slap_overinst *on = oi->oi_list; + BackendDB bd; + int rc = 0; + + if ( oi->oi_bi.bi_db_config ) { + rc = oi->oi_bi.bi_db_config( &oi->oi_bd, fname, lineno, + argc, argv ); + if ( rc ) return rc; + } + + bd = *be; + for (; on; on=on->on_next) { + bd.bd_info = &on->on_bi; + if (on->on_bi.bi_db_config) { + rc = on->on_bi.bi_db_config( &bd, fname, lineno, + argc, argv ); + if ( rc ) break; + } + } + return rc; +} + +static int +over_db_open( + BackendDB *be +) +{ + return over_db_func( be, db_open ); +} + +static int +over_db_close( + BackendDB *be +) +{ + return over_db_func( be, db_close ); +} + +static int +over_db_destroy( + BackendDB *be +) +{ + slap_overinfo *oi = (slap_overinfo *) be->bd_info; + slap_overinst *on = oi->oi_list, *next; + int rc; + + rc = over_db_func( be, db_destroy ); + + for (next = on->on_next; on; on=next) { + next = on->on_next; + free( on ); + } + free( oi ); + return rc; +} + +static int +over_back_response ( Operation *op, SlapReply *rs ) +{ + slap_overinfo *oi = (slap_overinfo *) op->o_bd->bd_info; + slap_overinst *on = oi->oi_list; + int rc = 0; + BackendDB *be = op->o_bd, db = *op->o_bd; + + op->o_bd = &db; + for (; on; on=on->on_next ) { + if ( on->on_response ) { + db.bd_info = (BackendInfo *)on; + rc = on->on_response( op, rs ); + if ( rc ) break; + } + } + op->o_bd = be; + return rc; +} + +enum op_which { op_bind = 0, op_unbind, op_search, op_compare, + op_modify, op_modrdn, op_add, op_delete, op_abandon, + op_cancel, op_extended }; + +static int +over_op_func( + Operation *op, + SlapReply *rs, + enum op_which which +) +{ + slap_overinfo *oi = (slap_overinfo *) op->o_bd->bd_info; + slap_overinst *on = oi->oi_list; + int rc = 0; + BackendDB *be = op->o_bd, db = *op->o_bd; + BI_op_bind **func; + slap_callback cb = {over_back_response, NULL}; + + op->o_bd = &db; + for (; on; on=on->on_next ) { + func = &on->on_bi.bi_op_bind; + if ( func[which] ) { + db.bd_info = (BackendInfo *)on; + rc = func[which]( op, rs ); + if ( rc ) break; + } + } + func = &oi->oi_bi.bi_op_bind; + if ( func[which] ) { + rc = func[which]( op, rs ); + } + + op->o_bd = be; + return rc; +} + +static int +over_op_bind( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_bind ); +} + +static int +over_op_unbind( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_unbind ); +} + +static int +over_op_search( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_search ); +} + +static int +over_op_compare( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_compare ); +} + +static int +over_op_modify( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_modify ); +} + +static int +over_op_modrdn( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_modrdn ); +} + +static int +over_op_add( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_add ); +} + +static int +over_op_delete( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_delete ); +} + +static int +over_op_abandon( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_abandon ); +} + +static int +over_op_cancel( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_cancel ); +} + +static int +over_op_extended( Operation *op, SlapReply *rs ) +{ + return over_op_func( op, rs, op_extended ); +} + +int +overlay_register( + slap_overinst *on +) +{ + on->on_next = overlays; + overlays = on; + return 0; +} + +static const char overtype[] = "over"; + +/* add an overlay to a particular backend. */ +int +overlay_config( BackendDB *be, const char *ov ) +{ + slap_overinst *on, *on2, *prev; + slap_overinfo *oi; + BackendInfo *bi; + + for ( on = overlays; on; on=on->on_next ) { + if (!strcmp( ov, on->on_bi.bi_type ) ) + break; + } + if (!on) { + Debug( LDAP_DEBUG_ANY, "overlay %s not found\n", ov, 0, 0 ); + return 1; + } + + if ( be->bd_info->bi_type != overtype ) { + oi = ch_malloc( sizeof(slap_overinfo) ); + oi->oi_bd = *be; + oi->oi_bi = *be->bd_info; + oi->oi_list = NULL; + bi = (BackendInfo *)oi; + + bi->bi_type = (char *)overtype; + + bi->bi_db_config = over_db_config; + bi->bi_db_open = over_db_open; + bi->bi_db_close = over_db_close; + bi->bi_db_destroy = over_db_destroy; + + bi->bi_op_bind = over_op_bind; + bi->bi_op_unbind = over_op_unbind; + bi->bi_op_search = over_op_search; + bi->bi_op_compare = over_op_compare; + bi->bi_op_modify = over_op_modify; + bi->bi_op_modrdn = over_op_modrdn; + bi->bi_op_add = over_op_add; + bi->bi_op_delete = over_op_delete; + bi->bi_op_abandon = over_op_abandon; + bi->bi_op_cancel = over_op_cancel; + bi->bi_extended = over_op_extended; + + be->bd_info = bi; + } + + oi = (slap_overinfo *) be->bd_info; + for ( prev=NULL, on2 = oi->oi_list; on2; prev=on2, on2=on2->on_next ); + on2 = ch_malloc( sizeof(slap_overinst) ); + if ( !prev ) { + oi->oi_list = on2; + } else { + prev->on_next = on2; + } + *on2 = *on; + + return 0; +} + diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 9cbb77b6aa..9cf80a8575 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -910,7 +910,7 @@ read_config( const char *fname, int depth ) "subordinate keyword must appear inside a database " "definition.\n", fname, lineno, 0 ); #else - Debug( LDAP_DEBUG_ANY, "%s: line %d: suffix line " + Debug( LDAP_DEBUG_ANY, "%s: line %d: subordinate keyword " "must appear inside a database definition.\n", fname, lineno, 0 ); #endif @@ -921,6 +921,24 @@ read_config( const char *fname, int depth ) num_subordinates++; } + /* add an overlay to this backend */ + } else if ( strcasecmp( cargv[0], "overlay" ) == 0 ) { + if ( be == NULL ) { +#ifdef NEW_LOGGING + LDAP_LOG( CONFIG, INFO, "%s: line %d: " + "overlay keyword must appear inside a database " + "definition.\n", fname, lineno, 0 ); +#else + Debug( LDAP_DEBUG_ANY, "%s: line %d: overlay keyword " + "must appear inside a database definition.\n", + fname, lineno, 0 ); +#endif + return 1; + + } else { + return overlay_config( be, cargv[1] ); + } + /* set database suffix */ } else if ( strcasecmp( cargv[0], "suffix" ) == 0 ) { Backend *tmp_be; diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 5d378d991a..f9e78a7c1a 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -253,6 +253,13 @@ LDAP_SLAPD_F (Attribute *) backend_operational( LDAP_SLAPD_F (int) glue_back_initialize( BackendInfo *bi ); LDAP_SLAPD_F (int) glue_sub_init( void ); +/* + * backover.c + */ + +LDAP_SLAPD_F (int) overlay_register( slap_overinst *on ); +LDAP_SLAPD_F (int) overlay_config( BackendDB *be, const char *ov ); + /* * ch_malloc.c */ diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 2921c089e4..e453346cf8 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -1763,6 +1763,22 @@ typedef struct slap_callback { void *sc_private; } slap_callback; +struct slap_overinfo; + +typedef struct slap_overinst { + BackendInfo on_bi; + slap_response *on_response; + void *on_private; + struct slap_overinfo *on_info; + struct slap_overinst *on_next; +} slap_overinst; + +typedef struct slap_overinfo { + BackendInfo oi_bi; + BackendDB oi_bd; + slap_overinst *oi_list; +} slap_overinfo; + /* * Paged Results state */ diff --git a/servers/slapd/tools/Makefile.in b/servers/slapd/tools/Makefile.in index 63635c819f..b8a1343b86 100644 --- a/servers/slapd/tools/Makefile.in +++ b/servers/slapd/tools/Makefile.in @@ -46,7 +46,7 @@ SLAPD_OBJS = ../globals.o ../config.o ../ch_malloc.o ../cr.o ../backend.o \ ../init.o ../controls.o ../kerberos.o ../passwd.o \ ../index.o ../extended.o ../starttls.o ../sets.o ../mra.o \ ../referral.o ../backglue.o ../oidm.o ../mods.o ../operation.o \ - ../cancel.o ../sl_malloc.o + ../cancel.o ../sl_malloc.o ../backover.o SLAPOBJS = $(SLAPD_OBJS) slapcommon.o mimic.o -- 2.39.5