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

📄 slapi_utils.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	return slapi_entry_add_value( e, type, &val );}intslapi_entry_delete_string(Slapi_Entry *e, const char *type, const char *value){	Slapi_Value *vals[2];	Slapi_Value val;	val.bv_val = (char *)value;	val.bv_len = strlen( value );	vals[0] = &val;	vals[1] = NULL;	return slapi_entry_delete_values_sv( e, type, vals );	}intslapi_entry_attr_merge_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals ){	return slapi_entry_attr_merge( e, (char *)type, vals );}intslapi_entry_first_attr( const Slapi_Entry *e, Slapi_Attr **attr ){	if ( e == NULL ) {		return -1;	}	*attr = e->e_attrs;	return ( *attr != NULL ) ? 0 : -1;}intslapi_entry_next_attr( const Slapi_Entry *e, Slapi_Attr *prevattr, Slapi_Attr **attr ){	if ( e == NULL ) {		return -1;	}	if ( prevattr == NULL ) {		return -1;	}	*attr = prevattr->a_next;	return ( *attr != NULL ) ? 0 : -1;}intslapi_entry_attr_replace_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals ){	AttributeDescription *ad = NULL;	const char *text;	int rc;	BerVarray bv;		rc = slap_str2ad( type, &ad, &text );	if ( rc != LDAP_SUCCESS ) {		return 0;	}	attr_delete( &e->e_attrs, ad );	rc = bvptr2obj( vals, &bv );	if ( rc != LDAP_SUCCESS ) {		return -1;	}		rc = attr_merge_normalize( e, ad, bv, NULL );	slapi_ch_free( (void **)&bv );	if ( rc != LDAP_SUCCESS ) {		return -1;	}		return 0;}/*  * FIXME -- The caller must free the allocated memory.  * In Netscape they do not have to. */int slapi_attr_get_values(	Slapi_Attr	*attr, 	struct berval	***vals ) {	int		i, j;	struct berval	**bv;	if ( attr == NULL ) {		return 1;	}	for ( i = 0; attr->a_vals[i].bv_val != NULL; i++ ) {		; /* EMPTY */	}	bv = (struct berval **)ch_malloc( (i + 1) * sizeof(struct berval *) );	for ( j = 0; j < i; j++ ) {		bv[j] = ber_dupbv( NULL, &attr->a_vals[j] );	}	bv[j] = NULL;		*vals = (struct berval **)bv;	return 0;}char *slapi_dn_normalize( char *dn ) {	struct berval	bdn;	struct berval	pdn;	assert( dn != NULL );		bdn.bv_val = dn;	bdn.bv_len = strlen( dn );	if ( slapi_int_dn_pretty( &bdn, &pdn ) != LDAP_SUCCESS ) {		return NULL;	}	return pdn.bv_val;}char *slapi_dn_normalize_case( char *dn ) {	struct berval	bdn;	struct berval	ndn;	assert( dn != NULL );		bdn.bv_val = dn;	bdn.bv_len = strlen( dn );	if ( slapi_int_dn_normalize( &bdn, &ndn ) != LDAP_SUCCESS ) {		return NULL;	}	return ndn.bv_val;}int slapi_dn_issuffix(	char		*dn, 	char		*suffix ){	struct berval	bdn, ndn;	struct berval	bsuffix, nsuffix;	int rc;	assert( dn != NULL );	assert( suffix != NULL );	bdn.bv_val = dn;	bdn.bv_len = strlen( dn );	bsuffix.bv_val = suffix;	bsuffix.bv_len = strlen( suffix );	if ( dnNormalize( 0, NULL, NULL, &bdn, &ndn, NULL ) != LDAP_SUCCESS ) {		return 0;	}	if ( dnNormalize( 0, NULL, NULL, &bsuffix, &nsuffix, NULL )		!= LDAP_SUCCESS )	{		slapi_ch_free( (void **)&ndn.bv_val );		return 0;	}	rc = dnIsSuffix( &ndn, &nsuffix );	slapi_ch_free( (void **)&ndn.bv_val );	slapi_ch_free( (void **)&nsuffix.bv_val );	return rc;}intslapi_dn_isparent(	const char	*parentdn,	const char	*childdn ){	struct berval	assertedParentDN, normalizedAssertedParentDN;	struct berval	childDN, normalizedChildDN;	struct berval	normalizedParentDN;	int		match;	assert( parentdn != NULL );	assert( childdn != NULL );	assertedParentDN.bv_val = (char *)parentdn;	assertedParentDN.bv_len = strlen( parentdn );	if ( dnNormalize( 0, NULL, NULL, &assertedParentDN,		&normalizedAssertedParentDN, NULL ) != LDAP_SUCCESS )	{		return 0;	}	childDN.bv_val = (char *)childdn;	childDN.bv_len = strlen( childdn );	if ( dnNormalize( 0, NULL, NULL, &childDN,		&normalizedChildDN, NULL ) != LDAP_SUCCESS )	{		slapi_ch_free( (void **)&normalizedAssertedParentDN.bv_val );		return 0;	}	dnParent( &normalizedChildDN, &normalizedParentDN );	if ( dnMatch( &match, 0, slap_schema.si_syn_distinguishedName, NULL,		&normalizedParentDN, (void *)&normalizedAssertedParentDN ) != LDAP_SUCCESS )	{		match = -1;	}	slapi_ch_free( (void **)&normalizedAssertedParentDN.bv_val );	slapi_ch_free( (void **)&normalizedChildDN.bv_val );	return ( match == 0 );}/* * Returns DN of the parent entry, or NULL if the DN is * an empty string or NULL, or has no parent. */char *slapi_dn_parent( const char *_dn ){	struct berval	dn, prettyDN;	struct berval	parentDN;	char		*ret;	if ( _dn == NULL ) {		return NULL;	}	dn.bv_val = (char *)_dn;	dn.bv_len = strlen( _dn );	if ( dn.bv_len == 0 ) {		return NULL;	}	if ( dnPretty( NULL, &dn, &prettyDN, NULL ) != LDAP_SUCCESS ) {		return NULL;	}	dnParent( &prettyDN, &parentDN ); /* in-place */	if ( parentDN.bv_len == 0 ) {		slapi_ch_free_string( &prettyDN.bv_val );		return NULL;	}	ret = slapi_ch_strdup( parentDN.bv_val );	slapi_ch_free_string( &prettyDN.bv_val );	return ret;}int slapi_dn_isbesuffix( Slapi_PBlock *pb, char *ldn ){	struct berval	ndn;	Backend		*be;	if ( slapi_is_rootdse( ldn ) ) {		return 0;	}	/* according to spec should already be normalized */	ndn.bv_len = strlen( ldn );	ndn.bv_val = ldn;	be = select_backend( &pb->pb_op->o_req_ndn, 0, 0 );	if ( be == NULL ) {		return 0;	}	return be_issuffix( be, &ndn );}/* * Returns DN of the parent entry; or NULL if the DN is * an empty string, if the DN has no parent, or if the * DN is the suffix of the backend database */char *slapi_dn_beparent( Slapi_PBlock *pb, const char *ldn ){	Backend 	*be;	struct berval	dn, prettyDN;	struct berval	normalizedDN, parentDN;	char		*parent = NULL;	if ( pb == NULL ) {		return NULL;	}	PBLOCK_ASSERT_OP( pb, 0 );	if ( slapi_is_rootdse( ldn ) ) {		return NULL;	}	dn.bv_val = (char *)ldn;	dn.bv_len = strlen( ldn );	if ( dnPrettyNormal( NULL, &dn, &prettyDN, &normalizedDN, NULL ) != LDAP_SUCCESS ) {		return NULL;	}	be = select_backend( &pb->pb_op->o_req_ndn, 0, 0 );	if ( be == NULL || be_issuffix( be, &normalizedDN ) == 0 ) {		dnParent( &prettyDN, &parentDN );		if ( parentDN.bv_len != 0 )			parent = slapi_ch_strdup( parentDN.bv_val );	}	slapi_ch_free_string( &prettyDN.bv_val );	slapi_ch_free_string( &normalizedDN.bv_val );	return parent;}char *slapi_dn_ignore_case( char *dn ){       	return slapi_dn_normalize_case( dn );}char *slapi_ch_malloc( unsigned long size ) {	return ch_malloc( size );	}void slapi_ch_free( void **ptr ) {	if ( ptr == NULL || *ptr == NULL )		return;	ch_free( *ptr );	*ptr = NULL;}void slapi_ch_free_string( char **ptr ) {	slapi_ch_free( (void **)ptr );}voidslapi_ch_array_free( char **arrayp ){	char **p;	if ( arrayp != NULL ) {		for ( p = arrayp; *p != NULL; p++ ) {			slapi_ch_free( (void **)p );		}		slapi_ch_free( (void **)&arrayp );	}}struct berval *slapi_ch_bvdup(const struct berval *v){	struct berval *bv;	bv = (struct berval *) slapi_ch_malloc( sizeof(struct berval) );	bv->bv_len = v->bv_len;	bv->bv_val = slapi_ch_malloc( bv->bv_len );	AC_MEMCPY( bv->bv_val, v->bv_val, bv->bv_len );	return bv;}struct berval **slapi_ch_bvecdup(const struct berval **v){	int i;	struct berval **rv;	if ( v == NULL ) {		return NULL;	}	for ( i = 0; v[i] != NULL; i++ )		;	rv = (struct berval **) slapi_ch_malloc( (i + 1) * sizeof(struct berval *) );	for ( i = 0; v[i] != NULL; i++ ) {		rv[i] = slapi_ch_bvdup( v[i] );	}	rv[i] = NULL;	return rv;}char *slapi_ch_calloc(	unsigned long nelem, 	unsigned long size ) {	return ch_calloc( nelem, size );}char *slapi_ch_realloc(	char *block, 	unsigned long size ) {	return ch_realloc( block, size );}char *slapi_ch_strdup( const char *s ) {	return ch_strdup( s );}size_tslapi_ch_stlen( const char *s ) {	return strlen( s );}int slapi_control_present(	LDAPControl	**controls, 	char		*oid, 	struct berval	**val, 	int		*iscritical ) {	int		i;	int		rc = 0;	if ( val ) {		*val = NULL;	}		if ( iscritical ) {		*iscritical = 0;	}		for ( i = 0; controls != NULL && controls[i] != NULL; i++ ) {		if ( strcmp( controls[i]->ldctl_oid, oid ) != 0 ) {			continue;		}		rc = 1;		if ( controls[i]->ldctl_value.bv_len != 0 ) {			if ( val ) {				*val = &controls[i]->ldctl_value;			}		}		if ( iscritical ) {			*iscritical = controls[i]->ldctl_iscritical;		}		break;	}	return rc;}static voidslapControlMask2SlapiControlOp(slap_mask_t slap_mask,	unsigned long *slapi_mask){	*slapi_mask = SLAPI_OPERATION_NONE;	if ( slap_mask & SLAP_CTRL_ABANDON ) 		*slapi_mask |= SLAPI_OPERATION_ABANDON;	if ( slap_mask & SLAP_CTRL_ADD )		*slapi_mask |= SLAPI_OPERATION_ADD;	if ( slap_mask & SLAP_CTRL_BIND )		*slapi_mask |= SLAPI_OPERATION_BIND;	if ( slap_mask & SLAP_CTRL_COMPARE )		*slapi_mask |= SLAPI_OPERATION_COMPARE;	if ( slap_mask & SLAP_CTRL_DELETE )		*slapi_mask |= SLAPI_OPERATION_DELETE;	if ( slap_mask & SLAP_CTRL_MODIFY )		*slapi_mask |= SLAPI_OPERATION_MODIFY;	if ( slap_mask & SLAP_CTRL_RENAME )		*slapi_mask |= SLAPI_OPERATION_MODDN;	if ( slap_mask & SLAP_CTRL_SEARCH )		*slapi_mask |= SLAPI_OPERATION_SEARCH;	if ( slap_mask & SLAP_CTRL_UNBIND )		*slapi_mask |= SLAPI_OPERATION_UNBIND;}static voidslapiControlOp2SlapControlMask(unsigned long slapi_mask,	slap_mask_t *slap_mask){	*slap_mask = 0;	if ( slapi_mask & SLAPI_OPERATION_BIND )		*slap_mask |= SLAP_CTRL_BIND;	if ( slapi_mask & SLAPI_OPERATION_UNBIND )		*slap_mask |= SLAP_CTRL_UNBIND;	if ( slapi_mask & SLAPI_OPERATION_SEARCH )		*slap_mask |= SLAP_CTRL_SEARCH;	if ( slapi_mask & SLAPI_OPERATION_MODIFY )		*slap_mask |= SLAP_CTRL_MODIFY;	if ( slapi_mask & SLAPI_OPERATION_ADD )		*slap_mask |= SLAP_CTRL_ADD;	if ( slapi_mask & SLAPI_OPERATION_DELETE )		*slap_mask |= SLAP_CTRL_DELETE;	if ( slapi_mask & SLAPI_OPERATION_MODDN )		*slap_mask |= SLAP_CTRL_RENAME;	if ( slapi_mask & SLAPI_OPERATION_COMPARE )		*slap_mask |= SLAP_CTRL_COMPARE;	if ( slapi_mask & SLAPI_OPERATION_ABANDON )		*slap_mask |= SLAP_CTRL_ABANDON;	*slap_mask |= SLAP_CTRL_GLOBAL;}static intslapi_int_parse_control(	Operation *op,	SlapReply *rs,	LDAPControl *ctrl ){	/* Plugins must deal with controls themselves. */	return LDAP_SUCCESS;}void slapi_register_supported_control(	char		*controloid, 	unsigned long	controlops ){	slap_mask_t controlmask;	slapiControlOp2SlapControlMask( controlops, &controlmask );	register_supported_control( controloid, controlmask, NULL, slapi_int_parse_control, NULL );}int slapi_get_supported_controls(	char		***ctrloidsp, 	unsigned long	**ctrlopsp ) {	int i, rc;	rc = get_supported_controls( ctrloidsp, (slap_mask_t **)ctrlopsp );	if ( rc != LDAP_SUCCESS ) {		return rc;	}	for ( i = 0; (*ctrloidsp)[i] != NULL; i++ ) {		/* In place, naughty. */		slapControlMask2SlapiControlOp( (*ctrlopsp)[i], &((*ctrlopsp)[i]) );	}	return LDAP_SUCCESS;}LDAPControl *slapi_dup_control( LDAPControl *ctrl ){	LDAPControl *ret;	ret = (LDAPControl *)slapi_ch_malloc( sizeof(*ret) );	ret->ldctl_oid = slapi_ch_strdup( ctrl->ldctl_oid );	ber_dupbv( &ret->ldctl_value, &ctrl->ldctl_value );	ret->ldctl_iscritical = ctrl->ldctl_iscritical;	return ret;}void slapi_register_supported_saslmechanism( char *mechanism ){	/* FIXME -- can not add saslmechanism to OpenLDAP dynamically */	slapi_log_error( SLAPI_LOG_FATAL, "slapi_register_supported_saslmechanism",			"OpenLDAP does not support dynamic registration of SASL mechanisms\n" );}char **slapi_get_supported_saslmechanisms( void ){	/* FIXME -- can not get the saslmechanism without a connection. */	slapi_log_error( SLAPI_LOG_FATAL, "slapi_get_supported_saslmechanisms",			"can not get the SASL mechanism list "			"without a connection\n" );	return NULL;}char **slapi_get_supported_extended_ops( void ){	int		i, j, k;	char		**ppExtOpOID = NULL;	int		numExtOps = 0;	for ( i = 0; get_supported_extop( i ) != NULL; i++ ) {		;	}		for ( j = 0; slapi_int_get_supported_extop( j ) != NULL; j++ ) {		;	}	numExtOps = i + j;	if ( numExtOps == 0 ) {		return NULL;	}	ppExtOpOID = (char **)slapi_ch_malloc( (numExtOps + 1) * sizeof(char *) );	for ( k = 0; k < i; k++ ) {		struct berval	*bv;		bv = get_supported_extop( k );		assert( bv != NULL );		ppExtOpOID[ k ] = bv->bv_val;	}		for ( ; k < j; k++ ) {		struct berval	*bv;		bv = slapi_int_get_supported_extop( k );		assert( bv != NULL );		ppExtOpOID[ i + k ] = bv->bv_val;	}	ppExtOpOID[ i + k ] = NULL;	return ppExtOpOID;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -