X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fcompare.c;h=bbfa2ca8b3c293ac012568568a936eacf144a13a;hb=refs%2Ftags%2FOPENLDAP_REL_ENG_2_3_30;hp=4d89f59e7ae05324248f8e46f22ac589f9bf8e82;hpb=5b62482fac5183d5a137f7e99b23012df16d4793;p=openldap diff --git a/libraries/libldap/compare.c b/libraries/libldap/compare.c index 4d89f59e7a..bbfa2ca8b3 100644 --- a/libraries/libldap/compare.c +++ b/libraries/libldap/compare.c @@ -1,15 +1,35 @@ -/* - * Copyright (c) 1990 Regents of the University of Michigan. - * All rights reserved. +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2006 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. * - * compare.c + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1990 Regents of the University of Michigan. + * All rights reserved. + */ +/* Portions Copyright (C) The Internet Society (1997) + * ASN.1 fragments are from RFC 2251; see RFC for full legal notices. */ -#include "portable.h" +/* The compare request looks like this: + * CompareRequest ::= SEQUENCE { + * entry DistinguishedName, + * ava SEQUENCE { + * type AttributeType, + * value AttributeValue + * } + * } + */ -#ifndef lint -static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n"; -#endif +#include "portable.h" #include @@ -17,74 +37,144 @@ static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of #include #include -#include "lber.h" -#include "ldap.h" #include "ldap-int.h" +#include "ldap_log.h" /* - * ldap_compare - perform an ldap (and X.500) compare operation. The dn + * ldap_compare_ext - perform an ldap extended compare operation. The dn * of the entry to compare to and the attribute and value to compare (in * attr and value) are supplied. The msgid of the response is returned. * * Example: - * ldap_compare( ld, "c=us@cn=bob", "userPassword", "secret" ) + * struct berval bvalue = { "secret", sizeof("secret")-1 }; + * rc = ldap_compare( ld, "c=us@cn=bob", + * "userPassword", &bvalue, + * sctrl, cctrl, &msgid ) */ int -ldap_compare( LDAP *ld, char *dn, char *attr, char *value ) +ldap_compare_ext( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *attr, + struct berval *bvalue, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp ) { + int rc; BerElement *ber; - - /* The compare request looks like this: - * CompareRequest ::= SEQUENCE { - * entry DistinguishedName, - * ava SEQUENCE { - * type AttributeType, - * value AttributeValue - * } - * } - * and must be wrapped in an LDAPMessage. - */ + ber_int_t id; Debug( LDAP_DEBUG_TRACE, "ldap_compare\n", 0, 0, 0 ); + assert( ld != NULL ); + assert( LDAP_VALID( ld ) ); + assert( dn != NULL ); + assert( attr != NULL ); + assert( msgidp != NULL ); + + /* check client controls */ + rc = ldap_int_client_controls( ld, cctrls ); + if( rc != LDAP_SUCCESS ) return rc; + /* create a message to send */ - if ( (ber = ldap_alloc_ber_with_options( ld )) == NULLBER ) { - return( -1 ); + if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) { + return( LDAP_NO_MEMORY ); } - if ( ber_printf( ber, "{it{s{ss}}}", ++ld->ld_msgid, LDAP_REQ_COMPARE, - dn, attr, value ) == -1 ) { + LDAP_NEXT_MSGID(ld, id); + rc = ber_printf( ber, "{it{s{sON}N}", /* '}' */ + id, + LDAP_REQ_COMPARE, dn, attr, bvalue ); + if ( rc == -1 ) + { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); - return( -1 ); + return( ld->ld_errno ); } -#ifndef LDAP_NOCACHE - if ( ld->ld_cache != NULL ) { - if ( ldap_check_cache( ld, LDAP_REQ_COMPARE, ber ) == 0 ) { - ber_free( ber, 1 ); - ld->ld_errno = LDAP_SUCCESS; - return( ld->ld_msgid ); - } - ldap_add_request_to_cache( ld, LDAP_REQ_COMPARE, ber ); + /* Put Server Controls */ + if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) { + ber_free( ber, 1 ); + return ld->ld_errno; + } + + if( ber_printf( ber, /*{*/ "N}" ) == -1 ) { + ld->ld_errno = LDAP_ENCODING_ERROR; + ber_free( ber, 1 ); + return( ld->ld_errno ); } -#endif /* LDAP_NOCACHE */ + /* send the message */ - return ( ldap_send_initial_request( ld, LDAP_REQ_COMPARE, dn, ber )); + *msgidp = ldap_send_initial_request( ld, LDAP_REQ_COMPARE, dn, ber, id ); + return ( *msgidp < 0 ? ld->ld_errno : LDAP_SUCCESS ); +} + +/* + * ldap_compare_ext - perform an ldap extended compare operation. The dn + * of the entry to compare to and the attribute and value to compare (in + * attr and value) are supplied. The msgid of the response is returned. + * + * Example: + * msgid = ldap_compare( ld, "c=us@cn=bob", "userPassword", "secret" ) + */ +int +ldap_compare( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *attr, + LDAP_CONST char *value ) +{ + int msgid; + struct berval bvalue; + + assert( value != NULL ); + + bvalue.bv_val = (char *) value; + bvalue.bv_len = (value == NULL) ? 0 : strlen( value ); + + return ldap_compare_ext( ld, dn, attr, &bvalue, NULL, NULL, &msgid ) == LDAP_SUCCESS + ? msgid : -1; } int -ldap_compare_s( LDAP *ld, char *dn, char *attr, char *value ) +ldap_compare_ext_s( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *attr, + struct berval *bvalue, + LDAPControl **sctrl, + LDAPControl **cctrl ) { + int rc; int msgid; LDAPMessage *res; - if ( (msgid = ldap_compare( ld, dn, attr, value )) == -1 ) - return( ld->ld_errno ); + rc = ldap_compare_ext( ld, dn, attr, bvalue, sctrl, cctrl, &msgid ); + + if ( rc != LDAP_SUCCESS ) + return( rc ); if ( ldap_result( ld, msgid, 1, (struct timeval *) NULL, &res ) == -1 ) return( ld->ld_errno ); return( ldap_result2error( ld, res, 1 ) ); } + +int +ldap_compare_s( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *attr, + LDAP_CONST char *value ) +{ + struct berval bvalue; + + assert( value != NULL ); + + bvalue.bv_val = (char *) value; + bvalue.bv_len = (value == NULL) ? 0 : strlen( value ); + + return ldap_compare_ext_s( ld, dn, attr, &bvalue, NULL, NULL ); +}