]> git.sur5r.net Git - openldap/blob - servers/slapd/back-ldbm/compare.c
SLAPD compiles. Needs LDBM work to link.
[openldap] / servers / slapd / back-ldbm / compare.c
1 /* compare.c - ldbm backend compare routine */
2
3 #include "portable.h"
4
5 #include <stdio.h>
6
7 #include <ac/socket.h>
8 #include <ac/string.h>
9
10 #include "slap.h"
11 #include "back-ldbm.h"
12 #include "proto-back-ldbm.h"
13
14 extern Attribute        *attr_find();
15
16 int
17 ldbm_back_compare(
18     Backend     *be,
19     Connection  *conn,
20     Operation   *op,
21     char        *dn,
22     Ava         *ava
23 )
24 {
25         struct ldbminfo *li = (struct ldbminfo *) be->be_private;
26         char            *matched;
27         Entry           *e;
28         Attribute       *a;
29         int             i, rc;
30
31         /* get entry with reader lock */
32         if ( (e = dn2entry_r( be, dn, &matched )) == NULL ) {
33                 send_ldap_result( conn, op, LDAP_NO_SUCH_OBJECT, matched, "" );
34                 return( 1 );
35         }
36
37         /* check for deleted */
38         if ( ! access_allowed( be, conn, op, e, ava->ava_type, &ava->ava_value,
39             op->o_dn, ACL_COMPARE ) ) {
40                 send_ldap_result( conn, op, LDAP_INSUFFICIENT_ACCESS, "", "" );
41                 rc = 1;
42                 goto return_results;
43         }
44
45         if ( (a = attr_find( e->e_attrs, ava->ava_type )) == NULL ) {
46                 send_ldap_result( conn, op, LDAP_NO_SUCH_ATTRIBUTE, "", "" );
47                 rc = 1;
48                 goto return_results;
49         }
50
51         if ( value_find( a->a_vals, &ava->ava_value, a->a_syntax, 1 ) == 0 ) 
52                 send_ldap_result( conn, op, LDAP_COMPARE_TRUE, "", "" );
53         else
54                 send_ldap_result( conn, op, LDAP_COMPARE_FALSE, "", "" );
55
56         rc = 0;
57
58 return_results:;
59         cache_return_entry_r( &li->li_cache, e );
60         return( rc );
61 }