]> git.sur5r.net Git - openldap/blob - servers/slapd/value.c
#ifdef -DSLAP_NVALUES
[openldap] / servers / slapd / value.c
1 /* value.c - routines for dealing with values */
2 /* $OpenLDAP$ */
3 /*
4  * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
5  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
6  */
7
8 #include "portable.h"
9
10 #include <stdio.h>
11
12 #include <ac/ctype.h>
13 #include <ac/socket.h>
14 #include <ac/string.h>
15 #include <ac/time.h>
16
17 #include <sys/stat.h>
18
19 #include "slap.h"
20
21 int
22 value_add( 
23     BerVarray *vals,
24     BerVarray addvals
25 )
26 {
27         int     n, nn;
28         BerVarray v2;
29
30         for ( nn = 0; addvals != NULL && addvals[nn].bv_val != NULL; nn++ )
31                 ;       /* NULL */
32
33         if ( *vals == NULL ) {
34                 *vals = (BerVarray) SLAP_MALLOC( (nn + 1)
35                     * sizeof(struct berval) );
36                 if( *vals == NULL ) {
37 #ifdef NEW_LOGGING
38                          LDAP_LOG( OPERATION, ERR,
39                       "value_add: SLAP_MALLOC failed.\n", 0, 0, 0 );
40 #else
41                         Debug(LDAP_DEBUG_TRACE,
42                       "value_add: SLAP_MALLOC failed.\n", 0, 0, 0 );
43 #endif
44                         return LBER_ERROR_MEMORY;
45                 }
46                 n = 0;
47         } else {
48                 for ( n = 0; (*vals)[n].bv_val != NULL; n++ ) {
49                         ;       /* Empty */
50                 }
51                 *vals = (BerVarray) SLAP_REALLOC( (char *) *vals,
52                     (n + nn + 1) * sizeof(struct berval) );
53                 if( *vals == NULL ) {
54 #ifdef NEW_LOGGING
55                          LDAP_LOG( OPERATION, ERR,
56                       "value_add: SLAP_MALLOC failed.\n", 0, 0, 0 );
57 #else
58                         Debug(LDAP_DEBUG_TRACE,
59                       "value_add: SLAP_MALLOC failed.\n", 0, 0, 0 );
60 #endif
61                         return LBER_ERROR_MEMORY;
62                 }
63         }
64
65         v2 = *vals + n;
66         for ( ; addvals->bv_val; v2++, addvals++ ) {
67                 ber_dupbv(v2, addvals);
68                 if (v2->bv_val == NULL) break;
69         }
70         v2->bv_val = NULL;
71         v2->bv_len = 0;
72
73         return LDAP_SUCCESS;
74 }
75
76 int
77 value_add_one( 
78     BerVarray *vals,
79     struct berval *addval
80 )
81 {
82         int     n;
83         BerVarray v2;
84
85         if ( *vals == NULL ) {
86                 *vals = (BerVarray) SLAP_MALLOC( 2 * sizeof(struct berval) );
87                 if( *vals == NULL ) {
88 #ifdef NEW_LOGGING
89                          LDAP_LOG( OPERATION, ERR,
90                       "value_add_one: SLAP_MALLOC failed.\n", 0, 0, 0 );
91 #else
92                         Debug(LDAP_DEBUG_TRACE,
93                       "value_add_one: SLAP_MALLOC failed.\n", 0, 0, 0 );
94 #endif
95                         return LBER_ERROR_MEMORY;
96                 }
97                 n = 0;
98         } else {
99                 for ( n = 0; (*vals)[n].bv_val != NULL; n++ ) {
100                         ;       /* Empty */
101                 }
102                 *vals = (BerVarray) SLAP_REALLOC( (char *) *vals,
103                     (n + 2) * sizeof(struct berval) );
104                 if( *vals == NULL ) {
105 #ifdef NEW_LOGGING
106                          LDAP_LOG( OPERATION, ERR,
107                       "value_add_one: SLAP_MALLOC failed.\n", 0, 0, 0 );
108 #else
109                         Debug(LDAP_DEBUG_TRACE,
110                       "value_add_one: SLAP_MALLOC failed.\n", 0, 0, 0 );
111 #endif
112                         return LBER_ERROR_MEMORY;
113                 }
114         }
115
116         v2 = *vals + n;
117         ber_dupbv(v2, addval);
118
119         v2++;
120         v2->bv_val = NULL;
121         v2->bv_len = 0;
122
123         return LDAP_SUCCESS;
124 }
125
126 int asserted_value_validate_normalize( 
127         AttributeDescription *ad,
128         MatchingRule *mr,
129         unsigned usage,
130         struct berval *in,
131         struct berval *out,
132         const char ** text )
133 {
134         int rc;
135
136         /* we expect the value to be in the assertion syntax */
137         assert( !SLAP_MR_IS_VALUE_OF_ATTRIBUTE_SYNTAX(usage) );
138
139         if( mr == NULL ) {
140                 *text = "inappropriate matching request";
141                 return LDAP_INAPPROPRIATE_MATCHING;
142         }
143
144         if( !mr->smr_match ) {
145                 *text = "requested matching rule not supported";
146                 return LDAP_INAPPROPRIATE_MATCHING;
147         }
148
149         rc = (mr->smr_syntax->ssyn_validate)( mr->smr_syntax, in );
150
151         if( rc != LDAP_SUCCESS ) {
152                 *text = "value does not conform to assertion syntax";
153                 return LDAP_INVALID_SYNTAX;
154         }
155
156         if( mr->smr_normalize ) {
157                 rc = (mr->smr_normalize)( usage,
158                         ad ? ad->ad_type->sat_syntax : NULL,
159                         mr, in, out );
160
161                 if( rc != LDAP_SUCCESS ) {
162                         *text = "unable to normalize value for matching";
163                         return LDAP_INVALID_SYNTAX;
164                 }
165
166         } else {
167                 ber_dupbv( out, in );
168         }
169
170         return LDAP_SUCCESS;
171 }
172
173
174 int
175 value_match(
176         int *match,
177         AttributeDescription *ad,
178         MatchingRule *mr,
179         unsigned flags,
180         struct berval *v1, /* stored value */
181         void *v2, /* assertion */
182         const char ** text )
183 {
184         int rc;
185         struct berval nv1 = { 0, NULL };
186         struct berval nv2 = { 0, NULL };
187
188         assert( mr != NULL );
189
190         if( !mr->smr_match ) {
191                 return LDAP_INAPPROPRIATE_MATCHING;
192         }
193
194
195         rc = (mr->smr_match)( match, flags,
196                 ad->ad_type->sat_syntax,
197                 mr,
198                 nv1.bv_val != NULL ? &nv1 : v1,
199                 nv2.bv_val != NULL ? &nv2 : v2 );
200         
201         if (nv1.bv_val ) free( nv1.bv_val );
202         if (nv2.bv_val ) free( nv2.bv_val );
203         return rc;
204 }
205
206 int value_find_ex(
207         AttributeDescription *ad,
208         unsigned flags,
209         BerVarray vals,
210         struct berval *val )
211 {
212         int     i;
213         int rc;
214         struct berval nval = { 0, NULL };
215         MatchingRule *mr = ad->ad_type->sat_equality;
216
217         if( mr == NULL || !mr->smr_match ) {
218                 return LDAP_INAPPROPRIATE_MATCHING;
219         }
220
221         assert(SLAP_IS_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH( flags ));
222
223         if( !SLAP_IS_MR_ASSERTED_VALUE_NORMALIZED_MATCH( flags ) &&
224                 mr->smr_normalize )
225         {
226                 rc = (mr->smr_normalize)(
227                         flags & SLAP_MR_TYPE_MASK|SLAP_MR_SUBTYPE_MASK,
228                         ad ? ad->ad_type->sat_syntax : NULL,
229                         mr, val, &nval );
230
231                 if( rc != LDAP_SUCCESS ) {
232                         return LDAP_INVALID_SYNTAX;
233                 }
234         }
235
236         for ( i = 0; vals[i].bv_val != NULL; i++ ) {
237                 int match;
238                 const char *text;
239
240                 rc = value_match( &match, ad, mr, flags,
241                         &vals[i], nval.bv_val == NULL ? val : &nval, &text );
242
243                 if( rc == LDAP_SUCCESS && match == 0 ) {
244                         free( nval.bv_val );
245                         return LDAP_SUCCESS;
246                 }
247         }
248
249         free( nval.bv_val );
250         return LDAP_NO_SUCH_ATTRIBUTE;
251 }