📄 dynlist.c
字号:
"DESC 'Dynamic list configuration' " "SUP olcOverlayConfig " "MAY olcDLattrSet )", Cft_Overlay, dlcfg, NULL, NULL }, { NULL, 0, NULL }};static intdl_cfgen( ConfigArgs *c ){ slap_overinst *on = (slap_overinst *)c->bi; dynlist_info_t *dli = (dynlist_info_t *)on->on_bi.bi_private; int rc = 0, i; if ( c->op == SLAP_CONFIG_EMIT ) { switch( c->type ) { case DL_ATTRSET: for ( i = 0; dli; i++, dli = dli->dli_next ) { struct berval bv; char *ptr = c->msg; assert( dli->dli_oc != NULL ); assert( dli->dli_ad != NULL ); ptr += snprintf( c->msg, sizeof( c->msg ), SLAP_X_ORDERED_FMT "%s %s", i, dli->dli_oc->soc_cname.bv_val, dli->dli_ad->ad_cname.bv_val ); if ( dli->dli_member_ad != NULL ) { ptr[ 0 ] = ' '; ptr++; ptr = lutil_strcopy( ptr, dli->dli_member_ad->ad_cname.bv_val ); } bv.bv_val = c->msg; bv.bv_len = ptr - bv.bv_val; value_add_one( &c->rvalue_vals, &bv ); } break; case DL_ATTRPAIR_COMPAT: case DL_ATTRPAIR: rc = 1; break; default: rc = 1; break; } return rc; } else if ( c->op == LDAP_MOD_DELETE ) { switch( c->type ) { case DL_ATTRSET: if ( c->valx < 0 ) { dynlist_info_t *dli_next; for ( dli_next = dli; dli_next; dli = dli_next ) { dli_next = dli->dli_next; ch_free( dli->dli_default_filter.bv_val ); ch_free( dli ); } on->on_bi.bi_private = NULL; } else { dynlist_info_t **dlip; for ( i = 0, dlip = (dynlist_info_t **)&on->on_bi.bi_private; i < c->valx; i++ ) { if ( *dlip == NULL ) { return 1; } dlip = &(*dlip)->dli_next; } dli = *dlip; *dlip = dli->dli_next; ch_free( dli->dli_default_filter.bv_val ); ch_free( dli ); dli = (dynlist_info_t *)on->on_bi.bi_private; } break; case DL_ATTRPAIR_COMPAT: case DL_ATTRPAIR: rc = 1; break; default: rc = 1; break; } return 1; /* FIXME */ } switch( c->type ) { case DL_ATTRSET: { dynlist_info_t **dlip, *dli_next = NULL; ObjectClass *oc = NULL; AttributeDescription *ad = NULL, *member_ad = NULL; const char *text; oc = oc_find( c->argv[ 1 ] ); if ( oc == NULL ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": " "unable to find ObjectClass \"%s\"", c->argv[ 1 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } rc = slap_str2ad( c->argv[ 2 ], &ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": " "unable to find AttributeDescription \"%s\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": " "AttributeDescription \"%s\" " "must be a subtype of \"labeledURI\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } if ( c->argc == 4 ) { rc = slap_str2ad( c->argv[ 3 ], &member_ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": " "unable to find AttributeDescription \"%s\"\n", c->argv[ 3 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } } for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private; *dlip; dlip = &(*dlip)->dli_next ) { /* The check on objectClass may be relaxed */#if 0 if ( (*dlip)->dli_oc == oc ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": " "objectClass \"%s\" already mapped.\n", oc->soc_cname.bv_val ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; }#endif if ( (*dlip)->dli_ad == ad ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": " "URL attributeDescription \"%s\" already mapped.\n", ad->ad_cname.bv_val ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } if ( member_ad != NULL && (*dlip)->dli_member_ad == member_ad ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": " "member attributeDescription \"%s\" already mapped.\n", member_ad->ad_cname.bv_val ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } } if ( c->valx > 0 ) { int i; for ( i = 0, dlip = (dynlist_info_t **)&on->on_bi.bi_private; i < c->valx; i++ ) { if ( *dlip == NULL ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": " "invalid index {%d}\n", c->valx ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } dlip = &(*dlip)->dli_next; } dli_next = *dlip; } else { for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private; *dlip; dlip = &(*dlip)->dli_next ) /* goto last */; } *dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) ); (*dlip)->dli_oc = oc; (*dlip)->dli_ad = ad; (*dlip)->dli_member_ad = member_ad; (*dlip)->dli_next = dli_next; rc = dynlist_build_def_filter( *dlip ); } break; case DL_ATTRPAIR_COMPAT: snprintf( c->msg, sizeof( c->msg ), "warning: \"attrpair\" only supported for limited " "backward compatibility with overlay \"dyngroup\"" ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); /* fallthru */ case DL_ATTRPAIR: { dynlist_info_t **dlip; ObjectClass *oc = NULL; AttributeDescription *ad = NULL, *member_ad = NULL; const char *text; oc = oc_find( "groupOfURLs" ); if ( oc == NULL ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find default ObjectClass \"groupOfURLs\"" ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } rc = slap_str2ad( c->argv[ 1 ], &member_ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find AttributeDescription \"%s\"", c->argv[ 1 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } rc = slap_str2ad( c->argv[ 2 ], &ad, &text ); if ( rc != LDAP_SUCCESS ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "unable to find AttributeDescription \"%s\"\n", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": " "AttributeDescription \"%s\" " "must be a subtype of \"labeledURI\"", c->argv[ 2 ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private; *dlip; dlip = &(*dlip)->dli_next ) { /* The check on objectClass may be relaxed */#if 0 if ( (*dlip)->dli_oc == oc ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "objectClass \"%s\" already mapped.\n", oc->soc_cname.bv_val ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; }#endif if ( (*dlip)->dli_ad == ad ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "URL attributeDescription \"%s\" already mapped.\n", ad->ad_cname.bv_val ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } if ( member_ad != NULL && (*dlip)->dli_member_ad == member_ad ) { snprintf( c->msg, sizeof( c->msg ), "\"dynlist-attrpair <member-ad> <URL-ad>\": " "member attributeDescription \"%s\" already mapped.\n", member_ad->ad_cname.bv_val ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->msg, 0 ); return 1; } } *dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) ); (*dlip)->dli_oc = oc; (*dlip)->dli_ad = ad; (*dlip)->dli_member_ad = member_ad; rc = dynlist_build_def_filter( *dlip ); } break; default: rc = 1; break; } return rc;}#endifstatic intdynlist_db_open( BackendDB *be ){ slap_overinst *on = (slap_overinst *) be->bd_info; dynlist_info_t *dli = (dynlist_info_t *)on->on_bi.bi_private; ObjectClass *oc = NULL; AttributeDescription *ad = NULL; if ( dli == NULL ) { dli = ch_calloc( 1, sizeof( dynlist_info_t ) ); on->on_bi.bi_private = (void *)dli; } for ( ; dli; dli = dli->dli_next ) { const char *text; int rc; if ( dli->dli_oc == NULL ) { if ( oc == NULL ) { oc = oc_find( "groupOfURLs" ); if ( oc == NULL ) { Debug( LDAP_DEBUG_ANY, "dynlist_db_open: " "unable to fetch objectClass \"groupOfURLs\".\n", 0, 0, 0 ); return 1; } } dli->dli_oc = oc; } if ( dli->dli_ad == NULL ) { if ( ad == NULL ) { rc = slap_str2ad( "memberURL", &ad, &text ); if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "dynlist_db_open: " "unable to fetch attributeDescription \"memberURL\": %d (%s).\n", rc, text, 0 ); return 1; } } dli->dli_ad = ad; } if ( BER_BVISNULL( &dli->dli_default_filter ) ) { rc = dynlist_build_def_filter( dli ); if ( rc != 0 ) { return rc; } } } return 0;}static intdynlist_db_destroy( BackendDB *be ){ slap_overinst *on = (slap_overinst *) be->bd_info; if ( on->on_bi.bi_private ) { dynlist_info_t *dli = (dynlist_info_t *)on->on_bi.bi_private, *dli_next; for ( dli_next = dli; dli_next; dli = dli_next ) { dli_next = dli->dli_next; ch_free( dli->dli_default_filter.bv_val ); ch_free( dli ); } } return 0;}static slap_overinst dynlist = { { NULL } };#ifdef TAKEOVER_DYNGROUPstatic char *obsolete_names[] = { "dyngroup", NULL};#endif#if SLAPD_OVER_DYNLIST == SLAPD_MOD_DYNAMICstatic#endif /* SLAPD_OVER_DYNLIST == SLAPD_MOD_DYNAMIC */intdynlist_initialize(void){#ifndef OL_2_2_COMPAT int rc = 0;#endif dynlist.on_bi.bi_type = "dynlist";#ifdef TAKEOVER_DYNGROUP /* makes dynlist incompatible with dyngroup */ dynlist.on_bi.bi_obsolete_names = obsolete_names;#endif#ifdef OL_2_2_COMPAT dynlist.on_bi.bi_db_config = dynlist_db_config;#else dynlist.on_bi.bi_db_config = config_generic_wrapper;#endif dynlist.on_bi.bi_db_open = dynlist_db_open; dynlist.on_bi.bi_db_destroy = dynlist_db_destroy; dynlist.on_response = dynlist_response;#ifndef OL_2_2_COMPAT dynlist.on_bi.bi_cf_ocs = dlocs; rc = config_register_schema( dlcfg, dlocs ); if ( rc ) { return rc; }#endif return overlay_register( &dynlist );}#if SLAPD_OVER_DYNLIST == SLAPD_MOD_DYNAMICintinit_module( int argc, char *argv[] ){ return dynlist_initialize();}#endif#endif /* SLAPD_OVER_DYNLIST */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -