]> git.sur5r.net Git - openldap/blob - servers/slapd/back-monitor/compare.c
fix some ava bugs
[openldap] / servers / slapd / back-monitor / compare.c
1 /* compare.c - monitor backend compare routine */
2 /*
3  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6 /*
7  * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved.
8  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
9  * 
10  * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
11  * 
12  * This work has beed deveolped for the OpenLDAP Foundation 
13  * in the hope that it may be useful to the Open Source community, 
14  * but WITHOUT ANY WARRANTY.
15  * 
16  * Permission is granted to anyone to use this software for any purpose
17  * on any computer system, and to alter it and redistribute it, subject
18  * to the following restrictions:
19  * 
20  * 1. The author and SysNet s.n.c. are not responsible for the consequences
21  *    of use of this software, no matter how awful, even if they arise from
22  *    flaws in it.
23  * 
24  * 2. The origin of this software must not be misrepresented, either by
25  *    explicit claim or by omission.  Since few users ever read sources,
26  *    credits should appear in the documentation.
27  * 
28  * 3. Altered versions must be plainly marked as such, and must not be
29  *    misrepresented as being the original software.  Since few users
30  *    ever read sources, credits should appear in the documentation.
31  *    SysNet s.n.c. cannot be responsible for the consequences of the
32  *    alterations.
33  * 
34  * 4. This notice may not be removed or altered.
35  */
36
37 #include "portable.h"
38
39 #include <stdio.h>
40
41 #include <slap.h>
42 #include "back-monitor.h"
43
44 int
45 monitor_back_compare(
46         Backend                 *be,
47         Connection              *conn,
48         Operation               *op,
49         struct berval           *dn,
50         struct berval           *ndn,
51         AttributeAssertion      *ava
52 )
53 {
54         struct monitorinfo      *mi = (struct monitorinfo *) be->be_private;            int             rc;
55         Entry           *e, *matched = NULL;
56         Attribute       *a;
57
58         /* get entry with reader lock */
59         monitor_cache_dn2entry( mi, ndn, &e, &matched );
60         if ( e == NULL ) {
61                 send_ldap_result( conn, op, LDAP_NO_SUCH_OBJECT,
62                                 matched ? matched->e_dn : NULL,
63                                 NULL, NULL, NULL );
64                 if ( matched ) {
65                         monitor_cache_release( mi, matched );
66                 }
67
68                 return( 0 );
69         }
70
71         rc = access_allowed( be, conn, op, e, ava->aa_desc, 
72                         &ava->aa_value, ACL_COMPARE );
73         if ( !rc ) {
74                 send_ldap_result( conn, op, LDAP_INSUFFICIENT_ACCESS,
75                                 NULL, NULL, NULL, NULL );
76                 rc = 1;
77                 goto return_results;
78         }
79
80         rc = LDAP_NO_SUCH_ATTRIBUTE;
81
82         for ( a = attrs_find( e->e_attrs, ava->aa_desc );
83                         a != NULL;
84                         a = attrs_find( a->a_next, ava->aa_desc )) {
85                 rc = LDAP_COMPARE_FALSE;
86
87                 if ( value_find( ava->aa_desc, a->a_vals, &ava->aa_value ) == 0 ) {
88                         rc = LDAP_COMPARE_TRUE;
89                         break;
90                 }
91         }
92
93         send_ldap_result( conn, op, rc, NULL, NULL, NULL, NULL );
94
95         if( rc != LDAP_NO_SUCH_ATTRIBUTE ) {
96                 rc = 0;
97         }
98         
99 return_results:;
100         monitor_cache_release( mi, e );
101
102         return( rc );
103 }
104