/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
* Copyright 2006 Hans Leidekker
* All rights reserved.
*
* top-level directory of the distribution or, alternatively, at
* <http://www.OpenLDAP.org/license.html>.
*/
-/* 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
- * TO VERSION 2.0.1 OF THE OPENLDAP PUBLIC LICENSE, A COPY OF WHICH IS
- * AVAILABLE AT HTTP://WWW.OPENLDAP.ORG/LICENSE.HTML OR IN THE FILE "LICENSE"
- * IN THE TOP-LEVEL DIRECTORY OF THE DISTRIBUTION. ANY USE OR EXPLOITATION
- * 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
- * can be found in the file "build/LICENSE-2.0.1" in this distribution
- * of OpenLDAP Software.
- */
-/* Portions Copyright (C) The Internet Society (1997)
- * ASN.1 fragments are from RFC 2251; see RFC for full legal notices.
- */
#include "portable.h"
Create and encode the value of the paged results control (RFC 2696).
- ld (IN) An LDAP session handle, as obtained from a call to
- ldap_init().
-
- pagesize (IN) The number of entries to return per page.
-
+ ld (IN) An LDAP session handle
+ pagesize (IN) Page size requested
cookie (IN) Opaque structure used by the server to track its
- location in the search results. Pass in NULL on the
+ location in the search results. NULL on the
first call.
-
- value (OUT) the pointer to a struct berval; it is filled by this function
- with the value that must be assigned to the ldctl_value member
- of the LDAPControl structure. The bv_val member of the berval
- structure SHOULD be freed by calling ldap_memfree() when done.
+ value (OUT) Control value, SHOULD be freed by calling
+ ldap_memfree() when done.
- Ber encoding
-
pagedResultsControl ::= SEQUENCE {
controlType 1.2.840.113556.1.4.319,
criticality BOOLEAN DEFAULT FALSE,
int
ldap_create_page_control_value(
- LDAP *ld,
- unsigned long pagesize,
+ LDAP *ld,
+ ber_int_t pagesize,
struct berval *cookie,
struct berval *value )
{
ber_tag_t tag;
struct berval null_cookie = { 0, NULL };
- if ( ld == NULL || value == NULL || pagesize > LDAP_MAXINT ) {
- ld->ld_errno = LDAP_PARAM_ERROR;
- return ld->ld_errno;
+ if ( ld == NULL || value == NULL ||
+ pagesize < 1 || pagesize > LDAP_MAXINT )
+ {
+ if ( ld )
+ ld->ld_errno = LDAP_PARAM_ERROR;
+ return LDAP_PARAM_ERROR;
}
assert( LDAP_VALID( ld ) );
return ld->ld_errno;
}
- tag = ber_printf( ber, "{iO}", (ber_int_t)pagesize, cookie );
+ tag = ber_printf( ber, "{iO}", pagesize, cookie );
if ( tag == LBER_ERROR ) {
- goto error_return;
+ ld->ld_errno = LDAP_ENCODING_ERROR;
+ goto done;
}
if ( ber_flatten2( ber, value, 1 ) == -1 ) {
ld->ld_errno = LDAP_NO_MEMORY;
}
- if ( 0 ) {
-error_return:;
- ld->ld_errno = LDAP_ENCODING_ERROR;
- }
-
+done:;
if ( ber != NULL ) {
ber_free( ber, 1 );
}
Create and encode a page control.
- ld (IN) An LDAP session handle, as obtained from a call to
- ldap_init().
-
- pagesize (IN) The number of entries to return per page.
-
+ ld (IN) An LDAP session handle
+ pagesize (IN) Page size requested
cookie (IN) Opaque structure used by the server to track its
- location in the search results. Pass in NULL on the
+ location in the search results. NULL on the
first call.
-
- iscritical (IN) 0 - The control is not critical to the operation.
- non-zero - The control is critical to the operation.
-
- ctrlp (OUT) Returns a pointer to the LDAPControl created. This
- control SHOULD be freed by calling ldap_control_free()
- when done.
+ value (OUT) Control value, SHOULD be freed by calling
+ ldap_memfree() when done.
+ iscritical (IN) Criticality
+ ctrlp (OUT) LDAP control, SHOULD be freed by calling
+ ldap_control_free() when done.
- Ber encoding
-
pagedResultsControl ::= SEQUENCE {
controlType 1.2.840.113556.1.4.319,
criticality BOOLEAN DEFAULT FALSE,
int
ldap_create_page_control(
LDAP *ld,
- unsigned long pagesize,
+ ber_int_t pagesize,
struct berval *cookie,
int iscritical,
LDAPControl **ctrlp )
{
struct berval value;
+ BerElement *ber;
if ( ctrlp == NULL ) {
ld->ld_errno = LDAP_PARAM_ERROR;
return ld->ld_errno;
}
- ld->ld_errno = ldap_create_page_control_value( ld, pagesize, cookie, &value );
+ ld->ld_errno = ldap_create_page_control_value( ld,
+ pagesize, cookie, &value );
if ( ld->ld_errno == LDAP_SUCCESS ) {
+ if ((ber = ldap_alloc_ber_with_options(ld)) == NULL) {
+ ld->ld_errno = LDAP_NO_MEMORY;
+ return LDAP_NO_MEMORY;
+ }
+
ld->ld_errno = ldap_create_control( LDAP_CONTROL_PAGEDRESULTS,
- NULL, iscritical, ctrlp );
+ ber, iscritical, ctrlp );
if ( ld->ld_errno == LDAP_SUCCESS ) {
(*ctrlp)->ldctl_value = value;
} else {
LDAP_FREE( value.bv_val );
}
+ ber_free(ber, 1);
}
return ld->ld_errno;
Decode a page control.
- ld (IN) An LDAP session handle, as obtained from a call to
- ldap_init().
-
- ctrls (IN) The address of a NULL-terminated array of
- LDAPControl structures, typically obtained by a
- call to ldap_parse_result(). The array SHOULD include
- a page control.
-
- count (OUT) The number of entries returned in the page.
-
- cookie (OUT) Opaque structure used by the server to track its
- location in the search results. Use ldap_memfree() to
+ ld (IN) An LDAP session handle
+ ctrl (IN) The page response control
+ count (OUT) The number of entries in the page.
+ cookie (OUT) Opaque cookie. Use ldap_memfree() to
free the bv_val member of this structure.
---------------------------------------------------------------------------*/
int
ldap_parse_pageresponse_control(
- LDAP *ld,
- LDAPControl *ctrl,
- unsigned long *countp,
- struct berval *cookie )
+ LDAP *ld,
+ LDAPControl *ctrl,
+ ber_int_t *countp,
+ struct berval *cookie )
{
BerElement *ber;
ber_tag_t tag;
ber_int_t count;
if ( ld == NULL || ctrl == NULL || cookie == NULL ) {
- ld->ld_errno = LDAP_PARAM_ERROR;
- return ld->ld_errno;
+ if ( ld )
+ ld->ld_errno = LDAP_PARAM_ERROR;
+ return LDAP_PARAM_ERROR;
}
/* Create a BerElement from the berval returned in the control. */
Decode a page control.
- ld (IN) An LDAP session handle, as obtained from a call to
- ldap_init().
-
- ctrls (IN) The address of a NULL-terminated array of
- LDAPControl structures, typically obtained by a
- call to ldap_parse_result(). The array SHOULD include
- a page control.
-
- count (OUT) The number of entries returned in the page.
-
- cookie (OUT) Opaque structure used by the server to track its
- location in the search results. Use ber_bvfree() to
- free it.
+ ld (IN) An LDAP session handle
+ ctrls (IN) Response controls
+ count (OUT) The number of entries in the page.
+ cookie (OUT) Opaque cookie. Use ldap_memfree() to
+ free the bv_val member of this structure.
---------------------------------------------------------------------------*/
ldap_parse_page_control(
LDAP *ld,
LDAPControl **ctrls,
- unsigned long *countp,
+ ber_int_t *countp,
struct berval **cookiep )
{
+ LDAPControl *c;
struct berval cookie;
- int i;
if ( cookiep == NULL ) {
ld->ld_errno = LDAP_PARAM_ERROR;
return ld->ld_errno;
}
- /* Search the list of control responses for a page control. */
- for ( i = 0; ctrls[i]; i++ ) {
- if ( strcmp( LDAP_CONTROL_PAGEDRESULTS, ctrls[ i ]->ldctl_oid ) == 0 ) {
- break;
- }
- }
-
- /* No page control was found. */
- if ( ctrls[ i ] == NULL ) {
+ c = ldap_find_control( LDAP_CONTROL_PAGEDRESULTS, ctrls );
+ if ( c == NULL ) {
+ /* No page control was found. */
ld->ld_errno = LDAP_CONTROL_NOT_FOUND;
return ld->ld_errno;
}
- ld->ld_errno = ldap_parse_pageresponse_control( ld, ctrls[ i ], countp, &cookie );
+ ld->ld_errno = ldap_parse_pageresponse_control( ld, c, countp, &cookie );
if ( ld->ld_errno == LDAP_SUCCESS ) {
*cookiep = LDAP_MALLOC( sizeof( struct berval * ) );
if ( *cookiep == NULL ) {