compare.c revision 1.1.1.4
1/*	$NetBSD: compare.c,v 1.1.1.4 2014/05/28 09:58:41 tron Exp $	*/
2
3/* $OpenLDAP$ */
4/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 *
6 * Copyright 1998-2014 The OpenLDAP Foundation.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted only as authorized by the OpenLDAP
11 * Public License.
12 *
13 * A copy of this license is available in the file LICENSE in the
14 * top-level directory of the distribution or, alternatively, at
15 * <http://www.OpenLDAP.org/license.html>.
16 */
17/* Portions Copyright (c) 1990 Regents of the University of Michigan.
18 * All rights reserved.
19 */
20
21#include "portable.h"
22
23#include <stdio.h>
24
25#include <ac/socket.h>
26#include <ac/string.h>
27#include <ac/time.h>
28
29#include "ldap-int.h"
30#include "ldap_log.h"
31
32/* The compare request looks like this:
33 *	CompareRequest ::= SEQUENCE {
34 *		entry	DistinguishedName,
35 *		ava	SEQUENCE {
36 *			type	AttributeType,
37 *			value	AttributeValue
38 *		}
39 *	}
40 */
41
42/*
43 * ldap_compare_ext - perform an ldap extended compare operation.  The dn
44 * of the entry to compare to and the attribute and value to compare (in
45 * attr and value) are supplied.  The msgid of the response is returned.
46 *
47 * Example:
48 *	struct berval bvalue = { "secret", sizeof("secret")-1 };
49 *	rc = ldap_compare( ld, "c=us@cn=bob",
50 *		"userPassword", &bvalue,
51 *		sctrl, cctrl, &msgid )
52 */
53int
54ldap_compare_ext(
55	LDAP *ld,
56	LDAP_CONST char *dn,
57	LDAP_CONST char *attr,
58	struct berval *bvalue,
59	LDAPControl **sctrls,
60	LDAPControl **cctrls,
61	int	*msgidp )
62{
63	int rc;
64	BerElement	*ber;
65	ber_int_t	id;
66
67	Debug( LDAP_DEBUG_TRACE, "ldap_compare\n", 0, 0, 0 );
68
69	assert( ld != NULL );
70	assert( LDAP_VALID( ld ) );
71	assert( dn != NULL );
72	assert( attr != NULL );
73	assert( msgidp != NULL );
74
75	/* check client controls */
76	rc = ldap_int_client_controls( ld, cctrls );
77	if( rc != LDAP_SUCCESS ) return rc;
78
79	/* create a message to send */
80	if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
81		return( LDAP_NO_MEMORY );
82	}
83
84	LDAP_NEXT_MSGID(ld, id);
85	rc = ber_printf( ber, "{it{s{sON}N}", /* '}' */
86		id,
87		LDAP_REQ_COMPARE, dn, attr, bvalue );
88	if ( rc == -1 )
89	{
90		ld->ld_errno = LDAP_ENCODING_ERROR;
91		ber_free( ber, 1 );
92		return( ld->ld_errno );
93	}
94
95	/* Put Server Controls */
96	if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) {
97		ber_free( ber, 1 );
98		return ld->ld_errno;
99	}
100
101	if( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
102		ld->ld_errno = LDAP_ENCODING_ERROR;
103		ber_free( ber, 1 );
104		return( ld->ld_errno );
105	}
106
107
108	/* send the message */
109	*msgidp = ldap_send_initial_request( ld, LDAP_REQ_COMPARE, dn, ber, id );
110	return ( *msgidp < 0 ? ld->ld_errno : LDAP_SUCCESS );
111}
112
113/*
114 * ldap_compare_ext - perform an ldap extended compare operation.  The dn
115 * of the entry to compare to and the attribute and value to compare (in
116 * attr and value) are supplied.  The msgid of the response is returned.
117 *
118 * Example:
119 *	msgid = ldap_compare( ld, "c=us@cn=bob", "userPassword", "secret" )
120 */
121int
122ldap_compare(
123	LDAP *ld,
124	LDAP_CONST char *dn,
125	LDAP_CONST char *attr,
126	LDAP_CONST char *value )
127{
128	int msgid;
129	struct berval bvalue;
130
131	assert( value != NULL );
132
133	bvalue.bv_val = (char *) value;
134	bvalue.bv_len = (value == NULL) ? 0 : strlen( value );
135
136	return ldap_compare_ext( ld, dn, attr, &bvalue, NULL, NULL, &msgid ) == LDAP_SUCCESS
137		? msgid : -1;
138}
139
140int
141ldap_compare_ext_s(
142	LDAP *ld,
143	LDAP_CONST char *dn,
144	LDAP_CONST char *attr,
145	struct berval *bvalue,
146	LDAPControl **sctrl,
147	LDAPControl **cctrl )
148{
149	int		rc;
150	int		msgid;
151	LDAPMessage	*res;
152
153	rc = ldap_compare_ext( ld, dn, attr, bvalue, sctrl, cctrl, &msgid );
154
155	if (  rc != LDAP_SUCCESS )
156		return( rc );
157
158	if ( ldap_result( ld, msgid, LDAP_MSG_ALL, (struct timeval *) NULL, &res ) == -1 || !res )
159		return( ld->ld_errno );
160
161	return( ldap_result2error( ld, res, 1 ) );
162}
163
164int
165ldap_compare_s(
166	LDAP *ld,
167	LDAP_CONST char *dn,
168	LDAP_CONST char *attr,
169	LDAP_CONST char *value )
170{
171	struct berval bvalue;
172
173	assert( value != NULL );
174
175	bvalue.bv_val = (char *) value;
176	bvalue.bv_len = (value == NULL) ? 0 : strlen( value );
177
178	return ldap_compare_ext_s( ld, dn, attr, &bvalue, NULL, NULL );
179}
180