#endif /* LDAP_BACK_PROXY_AUTHZ */
ldap_pvt_thread_mutex_t conn_mutex;
- int savecred;
- Avlnode *conntree;
+ int savecred;
+ Avlnode *conntree;
+
+ int rwm_started;
};
int ldap_back_freeconn( Operation *op, struct ldapconn *lc );
}
load_extop( (struct berval *)&slap_EXOP_WHOAMI,
0, ldap_back_exop_whoami );
+
+ /* FIXME: legacy: intercept old rewrite/remap directives
+ * and try to start the rwm overlay */
+ } else if ( strcasecmp( argv[0], "suffixmassage" ) == 0
+ || strcasecmp( argv[0], "map" ) == 0
+ || strncasecmp( argv[0], "rewrite", STRLENOF( "rewrite" ) ) == 0 )
+ {
+ if ( li->rwm_started == 0 && !overlay_is_inst( be, "rwm" ) ) {
+ if ( overlay_config( be, "rwm" ) ) {
+ fprintf( stderr, "%s: line %d: "
+ "unable to configure the \"rwm\" "
+ "overlay, required by directive "
+ "\"%s\".\n",
+ fname, lineno, argv[0] );
+#if SLAPD_OVER_RWM == SLAPD_MOD_DYNAMIC
+ fprintf( stderr, "\thint: try loading the \"rwm.la\" dynamic module.\n" );
+#endif /* SLAPD_OVER_RWM == SLAPD_MOD_DYNAMIC */
+ return( 1 );
+ }
+
+ fprintf( stderr, "%s: line %d: back-ldap: "
+ "automatically starting \"rwm\" overlay, "
+ "triggered by \"%s\" directive.\n",
+ fname, lineno, argv[ 0 ] );
+
+ li->rwm_started = 1;
+
+ return ( *be->bd_info->bi_db_config )( be, fname, lineno, argc, argv );
+ }
+
+ return SLAP_CONF_UNKNOWN;
/* anything else */
} else {
}
#endif /* LDAP_BACK_PROXY_AUTHZ */
-#ifdef SLAPD_MONITOR
+#if 0 && defined(SLAPD_MONITOR)
{
struct berval filter,
base = BER_BVC( "cn=Databases,cn=Monitor" );
bi = be->bd_info;
- if ( strcmp( be->bd_info->bi_type, "over" ) == 0 ) {
+ if ( overlay_is_over( be ) ) {
oi = (slap_overinfo *)be->bd_info->bi_private;
bi = oi->oi_orig;
}
attr_merge_normalize_one( e, mi->mi_ad_monitorOverlay,
&bv, NULL );
+ /* find the overlay number, j */
for ( on2 = overlay_next( NULL ), j = 0; on2; on2 = overlay_next( on2 ), j++ ) {
if ( on2->on_bi.bi_type == on->on_bi.bi_type ) {
break;
BackendDB *be = &backendDB[ j ];
char buf[ SLAP_LDAPDN_MAXLEN ];
struct berval dn;
- slap_overinst *on2;
- if ( strcmp( be->bd_info->bi_type, "over" ) != 0 ) {
- continue;
- }
-
- on2 = ((slap_overinfo *)be->bd_info->bi_private)->oi_list;
- for ( ; on2; on2 = on2->on_next ) {
- if ( on2->on_bi.bi_type == on->on_bi.bi_type ) {
- break;
- }
- }
-
- if ( on2 == NULL ) {
+ if ( !overlay_is_inst( be, on->on_bi.bi_type ) ) {
continue;
}
return 0;
}
+/*
+ * iterator on registered overlays; overlay_next( NULL ) returns the first
+ * overlay; * subsequent calls with the previously returned value allow to
+ * iterate * over the entire list; returns NULL when no more overlays are
+ * registered.
+ */
+
slap_overinst *
overlay_next(
slap_overinst *on
return on->on_next;
}
+/*
+ * returns a specific registered overlay based on the type; NULL if not
+ * registered.
+ */
+
+slap_overinst *
+overlay_find( const char *over_type )
+{
+ slap_overinst *on = overlays;
+
+ assert( over_type );
+
+ for ( ; on; on = on->on_next ) {
+ if ( strcmp( on->on_bi.bi_type, over_type ) == 0 ) {
+ break;
+ }
+ }
+
+ return on;
+}
+
static const char overtype[] = "over";
+/*
+ * returns TRUE (1) if the database is actually an overlay instance;
+ * FALSE (0) otherwise.
+ */
+
+int
+overlay_is_over( BackendDB *be )
+{
+ return be->bd_info->bi_type == overtype;
+}
+
+/*
+ * returns TRUE (1) if the given database is actually an overlay
+ * instance and, somewhere in the list, contains the requested overlay;
+ * FALSE (0) otherwise.
+ */
+
+int
+overlay_is_inst( BackendDB *be, const char *over_type )
+{
+ slap_overinst *on;
+
+ assert( be );
+
+ if ( !overlay_is_over( be ) ) {
+ return 0;
+ }
+
+ on = ((slap_overinfo *)be->bd_info->bi_private)->oi_list;
+ for ( ; on; on = on->on_next ) {
+ if ( strcmp( on->on_bi.bi_type, over_type ) == 0 ) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
/* add an overlay to a particular backend. */
int
overlay_config( BackendDB *be, const char *ov )
slap_overinfo *oi = NULL;
BackendInfo *bi = NULL;
- for ( on = overlays; on; on=on->on_next ) {
- if (!strcmp( ov, on->on_bi.bi_type ) )
- break;
- }
+ on = overlay_find( ov );
if (!on) {
Debug( LDAP_DEBUG_ANY, "overlay %s not found\n", ov, 0, 0 );
return 1;
/* If this is the first overlay on this backend, set up the
* overlay info structure
*/
- if ( be->bd_info->bi_type != overtype ) {
+ if ( !overlay_is_over( be ) ) {
oi = ch_malloc( sizeof(slap_overinfo) );
oi->oi_orig = be->bd_info;
oi->oi_bi = *be->bd_info;
* backover.c
*/
-LDAP_SLAPD_F (int) overlay_register( slap_overinst *on );
-LDAP_SLAPD_F (int) overlay_config( BackendDB *be, const char *ov );
-LDAP_SLAPD_F (slap_overinst *) overlay_next( slap_overinst *on );
+LDAP_SLAPD_F (int) overlay_register LDAP_P(( slap_overinst *on ));
+LDAP_SLAPD_F (int) overlay_config LDAP_P(( BackendDB *be, const char *ov ));
+LDAP_SLAPD_F (slap_overinst *) overlay_next LDAP_P(( slap_overinst *on ));
+LDAP_SLAPD_F (slap_overinst *) overlay_find LDAP_P(( const char *name ));
+LDAP_SLAPD_F (int) overlay_is_over LDAP_P(( BackendDB *be ));
+LDAP_SLAPD_F (int) overlay_is_inst LDAP_P(( BackendDB *be, const char *name ));
/*
* ch_malloc.c