⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dynlist.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		"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 + -