📄 slapi_utils.c
字号:
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 + -