]> git.sur5r.net Git - openldap/commitdiff
Added ber_flatten2 - uses passed in struct berval, allocates copy or
authorHoward Chu <hyc@openldap.org>
Wed, 18 Dec 2002 19:15:27 +0000 (19:15 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 18 Dec 2002 19:15:27 +0000 (19:15 +0000)
directly re-uses existing ber buf.

include/lber.h
libraries/liblber/io.c

index aa952bd2c3694fc069fce072c7db50f2488af9b9..af9a4bff855802653f56c4bfb9891e5b5238fbd7 100644 (file)
@@ -469,6 +469,12 @@ ber_flatten LDAP_P((
        BerElement *ber,
        struct berval **bvPtr ));
 
+LBER_F( int )
+ber_flatten2 LDAP_P((
+       BerElement *ber,
+       struct berval *bv,
+       int alloc ));
+
 /*
  * LBER ber accessor functions
  */
index 74abb24fd4d22b1516e1b5dc0b5dfd41af1a75e2..a63d237f2231895f59c0863c9628cb7bd7b04156 100644 (file)
@@ -362,24 +362,21 @@ ber_init( struct berval *bv )
 
 /* New C-API ber_flatten routine */
 /* This routine allocates a struct berval whose contents are a BER
-** encoding taken from the ber argument.  The bvPtr pointer pointers to
+** encoding taken from the ber argument.  The bvPtr pointer points to
 ** the returned berval.
+**
+** ber_flatten2 is the same, but uses a struct berval passed by
+** the caller. If alloc is 0 the returned bv uses the ber buf directly.
 */
-int ber_flatten(
+int ber_flatten2(
        BerElement *ber,
-       struct berval **bvPtr)
+       struct berval *bv,
+       int alloc )
 {
-       struct berval *bv;
-       assert( bvPtr != NULL );
-
-    ber_int_options.lbo_valid = LBER_INITIALIZED;
+       assert( bv != NULL );
 
-       if(bvPtr == NULL) {
-               return -1;
-       }
+       ber_int_options.lbo_valid = LBER_INITIALIZED;
 
-       bv = LBER_MALLOC( sizeof(struct berval) );
        if ( bv == NULL ) {
                return -1;
        }
@@ -393,21 +390,49 @@ int ber_flatten(
                /* copy the berval */
                ber_len_t len = ber_pvt_ber_write( ber );
 
-               bv->bv_val = (char *) LBER_MALLOC( len + 1 );
-               if ( bv->bv_val == NULL ) {
-                       LBER_FREE( bv );
-                       return -1;
+               if ( alloc ) {
+                       bv->bv_val = (char *) LBER_MALLOC( len + 1 );
+                       if ( bv->bv_val == NULL ) {
+                               return -1;
+                       }
+                       AC_MEMCPY( bv->bv_val, ber->ber_buf, len );
+               } else {
+                       bv->bv_val = ber->ber_buf;
                }
-
-               AC_MEMCPY( bv->bv_val, ber->ber_buf, len );
                bv->bv_val[len] = '\0';
                bv->bv_len = len;
        }
-    
-       *bvPtr = bv;
        return 0;
 }
 
+int ber_flatten(
+       BerElement *ber,
+       struct berval **bvPtr)
+{
+       struct berval *bv;
+       int rc;
+       assert( bvPtr != NULL );
+
+       ber_int_options.lbo_valid = LBER_INITIALIZED;
+
+       if(bvPtr == NULL) {
+               return -1;
+       }
+
+       bv = LBER_MALLOC( sizeof(struct berval) );
+       if ( bv == NULL ) {
+               return -1;
+       }
+       rc = ber_flatten2(ber, bv, 1);
+       if (rc == -1) {
+               LBER_FREE(bv);
+       } else {
+               *bvPtr = bv;
+       }
+       return rc;
+}
+
 void
 ber_reset( BerElement *ber, int was_writing )
 {