]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/vlvctrl.c
More ldapbis cleanup
[openldap] / libraries / libldap / vlvctrl.c
index 04b5526a65f6cc6f8f55ecd72a0bf312ba892b14..cd3efba1398a8b866937c3c3079914ab14c3bcc0 100644 (file)
@@ -1,10 +1,18 @@
-/*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * 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.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
  */
-/* 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
  * 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.
+ */
 
 #include "portable.h"
 
@@ -22,7 +34,6 @@
 #include <ac/stdlib.h>
 #include <ac/string.h>
 #include <ac/time.h>
-#include <ac/ctype.h>
 
 #include "ldap-int.h"
 
    
    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
 
  ---*/
 
-LIBLDAP_F( int )
-ldap_create_vlv_control( LDAP *ld,
-                                                LDAPVLVInfo *vlvinfop,
-                                                LDAPControl **ctrlp )
+int
+ldap_create_vlv_control_value(
+       LDAP *ld,
+       LDAPVLVInfo *vlvinfop,
+       struct berval *value )
 {
        ber_tag_t tag;
        BerElement *ber;
 
-       if ( (ld==NULL) || (vlvinfop==NULL) || (ctrlp == NULL) ) {
-               ld->ld_errno =  LDAP_PARAM_ERROR;
-               return(ld->ld_errno);
+       if ( ld == NULL || vlvinfop == NULL || value == NULL ) {
+               if ( ld )
+                       ld->ld_errno = LDAP_PARAM_ERROR;
+               return LDAP_PARAM_ERROR;
        }
 
-       if ((ber = ldap_alloc_ber_with_options(ld)) == NULL) {
+       assert( LDAP_VALID( ld ) );
+
+       value->bv_val = NULL;
+       value->bv_len = 0;
+
+       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{ii}",
+       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, /*{*/ "}"); 
-       if( tag == LBER_ERROR ) goto exit;
+       tag = ber_printf( ber, /*{*/ "N}" ); 
+       if ( tag == LBER_ERROR ) {
+               goto error_return;
+       }
 
-       ld->ld_errno = ldap_int_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;
+       BerElement      *ber;
+
+       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 ) {
+               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_VLVREQUEST,
+                       ber, 1, 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;
 }
 
 
 /*---
-   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
@@ -188,50 +292,40 @@ exit:
    
 ---*/
 
-LIBLDAP_F( int )
-ldap_parse_vlv_control(
-       LDAP           *ld,
-       LDAPControl    **ctrls,
-       unsigned long  *target_posp,
-       unsigned long  *list_countp,
+int
+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;
 
+       assert( ld != NULL );
+       assert( LDAP_VALID( ld ) );
+
        if (contextp) {
                *contextp = NULL;        /* Make sure we return a NULL if error occurs. */
        }
 
-       if (ld == NULL) {
+       if (ctrl == NULL) {
                ld->ld_errno = LDAP_PARAM_ERROR;
                return(ld->ld_errno);
        }
 
-       if (ctrls == NULL) {
+       if (strcmp(LDAP_CONTROL_VLVRESPONSE, ctrl->ldctl_oid) != 0) {
+               /* Not VLV Response control */
                ld->ld_errno = LDAP_CONTROL_NOT_FOUND;
                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;
-       }
-
-       /* 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;
@@ -265,15 +359,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);