1 /* value.c - routines for dealing with values */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
13 #include <ac/socket.h>
14 #include <ac/string.h>
23 struct berval ***vals,
24 struct berval **addvals
29 for ( nn = 0; addvals != NULL && addvals[nn] != NULL; nn++ )
32 if ( *vals == NULL ) {
33 *vals = (struct berval **) ch_malloc( (nn + 1)
34 * sizeof(struct berval *) );
37 for ( n = 0; (*vals)[n] != NULL; n++ )
39 *vals = (struct berval **) ch_realloc( (char *) *vals,
40 (n + nn + 1) * sizeof(struct berval *) );
43 for ( i = 0, j = 0; i < nn; i++ ) {
44 if ( addvals[i]->bv_len > 0 ) {
45 (*vals)[n + j] = ber_bvdup( addvals[i] );
46 if( (*vals)[n + j++] == NULL ) break;
49 (*vals)[n + j] = NULL;
57 AttributeDescription *ad,
66 switch( usage & SLAP_MR_TYPE_MASK ) {
68 case SLAP_MR_EQUALITY:
69 mr = ad->ad_type->sat_equality;
71 case SLAP_MR_ORDERING:
72 mr = ad->ad_type->sat_ordering;
75 mr = ad->ad_type->sat_substr;
80 *text = "internal error";
85 *text = "inappropriate matching request";
86 return LDAP_INAPPROPRIATE_MATCHING;
89 /* we only support equality matching of binary attributes */
90 /* This is suspect, flexible certificate matching will hit this */
91 if( slap_ad_is_binary( ad ) && usage != SLAP_MR_EQUALITY ) {
92 *text = "inappropriate binary matching";
93 return LDAP_INAPPROPRIATE_MATCHING;
96 if( mr->smr_normalize ) {
97 rc = (mr->smr_normalize)( usage,
98 ad->ad_type->sat_syntax,
101 if( rc != LDAP_SUCCESS ) {
102 *text = "unable to normalize value";
103 return LDAP_INVALID_SYNTAX;
106 } else if ( mr->smr_syntax->ssyn_normalize ) {
107 rc = (mr->smr_syntax->ssyn_normalize)(
108 ad->ad_type->sat_syntax,
111 if( rc != LDAP_SUCCESS ) {
112 *text = "unable to normalize value";
113 return LDAP_INVALID_SYNTAX;
117 *out = ber_bvdup( in );
127 AttributeDescription *ad,
130 struct berval *v1, /* stored value */
131 void *v2, /* assertion */
135 struct berval *nv1 = NULL;
136 struct berval *nv2 = NULL;
138 if( !mr->smr_match ) {
139 return LDAP_INAPPROPRIATE_MATCHING;
142 if( ad->ad_type->sat_syntax->ssyn_normalize ) {
143 rc = ad->ad_type->sat_syntax->ssyn_normalize(
144 ad->ad_type->sat_syntax, v1, &nv1 );
146 if( rc != LDAP_SUCCESS ) {
147 return LDAP_INAPPROPRIATE_MATCHING;
151 if ( SLAP_IS_MR_VALUE_SYNTAX_NONCONVERTED_MATCH( flags ) &&
154 rc = (mr->smr_convert)( v2, &nv2 );
155 if ( rc != LDAP_SUCCESS ) {
156 return LDAP_INVALID_SYNTAX;
159 /* let smr_match know we've converted the value */
160 flags |= SLAP_MR_VALUE_SYNTAX_CONVERTED_MATCH;
163 rc = (mr->smr_match)( match, flags,
164 ad->ad_type->sat_syntax,
166 nv1 != NULL ? nv1 : v1,
167 nv2 != NULL ? nv2 : v2 );
176 AttributeDescription *ad,
178 struct berval **vals,
183 struct berval *nval = NULL;
184 struct berval *nval_tmp = NULL;
185 MatchingRule *mr = ad->ad_type->sat_equality;
187 if( mr == NULL || !mr->smr_match ) {
188 return LDAP_INAPPROPRIATE_MATCHING;
191 /* Take care of this here or ssyn_normalize later will hurt */
192 if ( SLAP_IS_MR_VALUE_SYNTAX_NONCONVERTED_MATCH( flags )
195 rc = (mr->smr_convert)( val, &nval );
196 if ( rc != LDAP_SUCCESS ) {
197 return LDAP_INVALID_SYNTAX;
200 /* let value_match know we've done the version */
201 flags |= SLAP_MR_VALUE_SYNTAX_CONVERTED_MATCH;
204 if( mr->smr_syntax->ssyn_normalize ) {
205 rc = mr->smr_syntax->ssyn_normalize(
206 mr->smr_syntax, nval == NULL ? val : nval, &nval_tmp );
210 if( rc != LDAP_SUCCESS ) {
212 return LDAP_INAPPROPRIATE_MATCHING;
216 for ( i = 0; vals[i] != NULL; i++ ) {
220 rc = value_match( &match, ad, mr, flags,
221 vals[i], nval == NULL ? val : nval, &text );
223 if( rc == LDAP_SUCCESS && match == 0 ) {
230 return LDAP_NO_SUCH_ATTRIBUTE;