X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fvlvctrl.c;h=1ecf5f4bee87b309a1e721ab9c9e11def4b669b9;hb=6c1d48aa8d066ff85809b8a544952ad2d1dc3400;hp=a4b10cec056912bee721151084ca7efd3d11397b;hpb=6939c531700652491f4be4688c6a1f35a1ab8a18;p=openldap diff --git a/libraries/libldap/vlvctrl.c b/libraries/libldap/vlvctrl.c index a4b10cec05..1ecf5f4bee 100644 --- a/libraries/libldap/vlvctrl.c +++ b/libraries/libldap/vlvctrl.c @@ -1,10 +1,18 @@ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2010 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. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ -/* Adapted for inclusion into OpenLDAP by Kurt D. Zeilenga */ -/*--- - * Copyright (C) 1999, 2000 Novell, Inc. All Rights Reserved. +/* Portions Copyright (C) 1999, 2000 Novell, Inc. All Rights Reserved. * * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND * TREATIES. USE, MODIFICATION, AND REDISTRIBUTION OF THIS WORK IS SUBJECT @@ -14,8 +22,8 @@ * OF THIS WORK OTHER THAN AS AUTHORIZED IN VERSION 2.0.1 OF THE OPENLDAP * PUBLIC LICENSE, OR OTHER PRIOR WRITTEN CONSENT FROM NOVELL, COULD SUBJECT * THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY. - *---*/ -/* Note: A verbatim copy of version 2.0.1 of the OpenLDAP Public License + *--- + * Note: A verbatim copy of version 2.0.1 of the OpenLDAP Public License * can be found in the file "build/LICENSE-2.0.1" in this distribution * of OpenLDAP Software. */ @@ -39,19 +47,18 @@ Create and encode the Virtual List View control. - ld (IN) An LDAP session handle, as obtained from a call to - ldap_init(). + ld (IN) An LDAP session handle. vlvinfop (IN) The address of an LDAPVLVInfo structure whose contents are used to construct the value of the control that is created. - ctrlp (OUT) A result parameter that will be assigned the address + value (OUT) A struct berval that contains the value to be assigned to the ldctl_value member of an LDAPControl structure that contains the - VirtualListViewRequest control created by this function. - The memory occupied by the LDAPControl structure + VirtualListViewRequest control. + The bv_val member of the berval structure SHOULD be freed when it is no longer in use by - calling ldap_control_free(). + calling ldap_memfree(). Ber encoding @@ -76,75 +83,162 @@ ---*/ int -ldap_create_vlv_control( LDAP *ld, - LDAPVLVInfo *vlvinfop, - LDAPControl **ctrlp ) +ldap_create_vlv_control_value( + LDAP *ld, + LDAPVLVInfo *vlvinfop, + struct berval *value ) { ber_tag_t tag; BerElement *ber; - assert( ld != NULL ); + if ( ld == NULL || vlvinfop == NULL || value == NULL ) { + if ( ld ) + ld->ld_errno = LDAP_PARAM_ERROR; + return LDAP_PARAM_ERROR; + } + assert( LDAP_VALID( ld ) ); - assert( vlvinfop != NULL ); - assert( ctrlp != NULL ); - if ((ber = ldap_alloc_ber_with_options(ld)) == NULL) { + value->bv_val = NULL; + value->bv_len = 0; + ld->ld_errno = LDAP_SUCCESS; + + ber = ldap_alloc_ber_with_options( ld ); + if ( ber == NULL ) { ld->ld_errno = LDAP_NO_MEMORY; - return(LDAP_NO_MEMORY); + return ld->ld_errno; } - tag = ber_printf(ber, "{ii" /*}*/, + tag = ber_printf( ber, "{ii" /*}*/, vlvinfop->ldvlv_before_count, - vlvinfop->ldvlv_after_count); - if( tag == LBER_ERROR ) goto exit; + vlvinfop->ldvlv_after_count ); + if ( tag == LBER_ERROR ) { + goto error_return; + } - if (vlvinfop->ldvlv_attrvalue == NULL) { - tag = ber_printf(ber, "t{iiN}", + if ( vlvinfop->ldvlv_attrvalue == NULL ) { + tag = ber_printf( ber, "t{iiN}", LDAP_VLVBYINDEX_IDENTIFIER, vlvinfop->ldvlv_offset, - vlvinfop->ldvlv_count); - if( tag == LBER_ERROR ) goto exit; + vlvinfop->ldvlv_count ); + if ( tag == LBER_ERROR ) { + goto error_return; + } } else { - tag = ber_printf(ber, "tO", + tag = ber_printf( ber, "tO", LDAP_VLVBYVALUE_IDENTIFIER, - vlvinfop->ldvlv_attrvalue); - if( tag == LBER_ERROR ) goto exit; + vlvinfop->ldvlv_attrvalue ); + if ( tag == LBER_ERROR ) { + goto error_return; + } } - if (vlvinfop->ldvlv_context) { - tag = ber_printf(ber, "tO", + if ( vlvinfop->ldvlv_context ) { + tag = ber_printf( ber, "tO", LDAP_VLVCONTEXT_IDENTIFIER, - vlvinfop->ldvlv_context); - if( tag == LBER_ERROR ) goto exit; + vlvinfop->ldvlv_context ); + if ( tag == LBER_ERROR ) { + goto error_return; + } } - tag = ber_printf(ber, /*{*/ "N}"); - if( tag == LBER_ERROR ) goto exit; + tag = ber_printf( ber, /*{*/ "N}" ); + if ( tag == LBER_ERROR ) { + goto error_return; + } - ld->ld_errno = ldap_create_control( LDAP_CONTROL_VLVREQUEST, - ber, 1, ctrlp); + if ( ber_flatten2( ber, value, 1 ) == -1 ) { + ld->ld_errno = LDAP_NO_MEMORY; + } - ber_free(ber, 1); - return(ld->ld_errno); + if ( 0 ) { +error_return:; + ld->ld_errno = LDAP_ENCODING_ERROR; + } -exit: - ber_free(ber, 1); - ld->ld_errno = LDAP_ENCODING_ERROR; - return(ld->ld_errno); + if ( ber != NULL ) { + ber_free( ber, 1 ); + } + + return ld->ld_errno; +} + +/*--- + ldap_create_vlv_control + + Create and encode the Virtual List View control. + + ld (IN) An LDAP session handle. + + vlvinfop (IN) The address of an LDAPVLVInfo structure whose contents + are used to construct the value of the control + that is created. + + ctrlp (OUT) A result parameter that will be assigned the address + of an LDAPControl structure that contains the + VirtualListViewRequest control created by this function. + The memory occupied by the LDAPControl structure + SHOULD be freed when it is no longer in use by + calling ldap_control_free(). + + + Ber encoding + + VirtualListViewRequest ::= SEQUENCE { + beforeCount INTEGER (0 .. maxInt), + afterCount INTEGER (0 .. maxInt), + CHOICE { + byoffset [0] SEQUENCE, { + offset INTEGER (0 .. maxInt), + contentCount INTEGER (0 .. maxInt) } + [1] greaterThanOrEqual assertionValue } + contextID OCTET STRING OPTIONAL } + + + Note: The first time the VLV control is created, the ldvlv_context + field of the LDAPVLVInfo structure should be set to NULL. + The context obtained from calling ldap_parse_vlv_control() + should be used as the context in the next ldap_create_vlv_control + call. + + ---*/ + +int +ldap_create_vlv_control( + LDAP *ld, + LDAPVLVInfo *vlvinfop, + LDAPControl **ctrlp ) +{ + struct berval value; + + if ( ctrlp == NULL ) { + ld->ld_errno = LDAP_PARAM_ERROR; + return ld->ld_errno; + } + + ld->ld_errno = ldap_create_vlv_control_value( ld, vlvinfop, &value ); + if ( ld->ld_errno == LDAP_SUCCESS ) { + + ld->ld_errno = ldap_control_create( LDAP_CONTROL_VLVREQUEST, + 1, &value, 0, ctrlp ); + if ( ld->ld_errno != LDAP_SUCCESS ) { + LDAP_FREE( value.bv_val ); + } + } + + return ld->ld_errno; } /*--- - ldap_parse_vlv_control + ldap_parse_vlvresponse_control Decode the Virtual List View control return information. ld (IN) An LDAP session handle. - ctrls (IN) The address of a NULL-terminated array of - LDAPControl structures, typically obtained - by a call to ldap_parse_result(). + ctrl (IN) The address of the LDAPControl structure. target_posp (OUT) This result parameter is filled in with the list index of the target entry. If this parameter is @@ -192,18 +286,16 @@ exit: ---*/ int -ldap_parse_vlv_control( - LDAP *ld, - LDAPControl **ctrls, - unsigned long *target_posp, - unsigned long *list_countp, +ldap_parse_vlvresponse_control( + LDAP *ld, + LDAPControl *ctrl, + ber_int_t *target_posp, + ber_int_t *list_countp, struct berval **contextp, - int *errcodep ) + ber_int_t *errcodep ) { BerElement *ber; - LDAPControl *pControl; - int i; - unsigned long pos, count, err; + ber_int_t pos, count, err; ber_tag_t tag, berTag; ber_len_t berLen; @@ -214,25 +306,19 @@ ldap_parse_vlv_control( *contextp = NULL; /* Make sure we return a NULL if error occurs. */ } - if (ctrls == NULL) { - ld->ld_errno = LDAP_CONTROL_NOT_FOUND; + if (ctrl == NULL) { + ld->ld_errno = LDAP_PARAM_ERROR; return(ld->ld_errno); } - /* Search the list of control responses for a VLV control. */ - for (i=0; ctrls[i]; i++) { - pControl = ctrls[i]; - if (!strcmp(LDAP_CONTROL_VLVRESPONSE, pControl->ldctl_oid)) - goto foundVLVControl; + if (strcmp(LDAP_CONTROL_VLVRESPONSE, ctrl->ldctl_oid) != 0) { + /* Not VLV Response control */ + ld->ld_errno = LDAP_CONTROL_NOT_FOUND; + return(ld->ld_errno); } - /* No sort control was found. */ - ld->ld_errno = LDAP_CONTROL_NOT_FOUND; - return(ld->ld_errno); - -foundVLVControl: /* Create a BerElement from the berval returned in the control. */ - ber = ber_init(&pControl->ldctl_value); + ber = ber_init(&ctrl->ldctl_value); if (ber == NULL) { ld->ld_errno = LDAP_NO_MEMORY; @@ -266,15 +352,9 @@ foundVLVControl: ber_free(ber, 1); /* Return data to the caller for items that were requested. */ - if (target_posp) { - *target_posp = pos; - } - if (list_countp) { - *list_countp = count; - } - if (errcodep) { - *errcodep = err; - } + if (target_posp) *target_posp = pos; + if (list_countp) *list_countp = count; + if (errcodep) *errcodep = err; ld->ld_errno = LDAP_SUCCESS; return(ld->ld_errno);