]> git.sur5r.net Git - openldap/blob - servers/slapd/back-monitor/compare.c
improvements to monitor backend: added a log entry that lists the current log level...
[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         const char              *dn,
50         const char              *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                                                                         
89                         rc = LDAP_COMPARE_TRUE;
90                         break;
91                 }
92         }
93         
94         send_ldap_result( conn, op, rc, NULL, NULL, NULL, NULL );
95         
96         if( rc != LDAP_NO_SUCH_ATTRIBUTE ) {
97                 rc = 0;
98         }
99         
100 return_results:;
101         monitor_cache_release( mi, e );
102
103         return( rc );
104 }
105