]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/vlvctrl.c
More ldapbis cleanup
[openldap] / libraries / libldap / vlvctrl.c
index 53967800111dc25f47dbab2e6ec0f461f752edef..cd3efba1398a8b866937c3c3079914ab14c3bcc0 100644 (file)
@@ -27,9 +27,6 @@
  * 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 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
  ---*/
 
 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;
+
+       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;
+       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
@@ -203,18 +293,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;
 
@@ -225,25 +313,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;
@@ -277,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);