version 1.70, 2002/01/02 16:06:56
|
version 1.71, 2002/01/03 01:53:41
|
Line 1
|
Line 1
|
/* decode.c - ber input decoding routines */ |
/* decode.c - ber input decoding routines */ |
/* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.69 2002/01/02 07:50:07 hyc Exp $ */ |
/* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.70 2002/01/02 16:06:56 kurt Exp $ */ |
/* |
/* |
* Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. |
* Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. |
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file |
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file |
Line 278 ber_get_stringb(
|
Line 278 ber_get_stringb(
|
return tag; |
return tag; |
} |
} |
|
|
|
enum bgbvc { ChArray, BvArray, BvVec }; |
|
|
|
typedef struct bgbvr { |
|
BerElement *ber; |
|
enum bgbvc choice; |
|
ber_tag_t tag; |
|
ber_len_t len; |
|
char *last; |
|
union { |
|
char ***c; |
|
BVarray *ba; |
|
struct berval ***bv; |
|
} res; |
|
} bgbvr; |
|
|
|
ber_tag_t |
|
ber_get_stringbvr( bgbvr *b, int n ) |
|
{ |
|
struct berval bv; |
|
|
|
if ( n ) |
|
b->tag = ber_next_element( b->ber, &b->len, b->last ); |
|
else |
|
b->tag = ber_first_element( b->ber, &b->len, &b->last ); |
|
|
|
if ( b->tag == LBER_DEFAULT ) |
|
{ |
|
if ( n == 0 ) { |
|
*b->res.c = NULL; |
|
return 0; |
|
} |
|
/* do the allocation */ |
|
switch (b->choice) { |
|
case ChArray: |
|
*b->res.c = LBER_MALLOC( (n+1) * sizeof( char * )); |
|
(*b->res.c)[n] = NULL; |
|
break; |
|
case BvArray: |
|
*b->res.ba = LBER_MALLOC( (n+1) * sizeof( struct berval )); |
|
(*b->res.ba)[n].bv_val = NULL; |
|
break; |
|
case BvVec: |
|
*b->res.bv = LBER_MALLOC( (n+1) * sizeof( struct berval *)); |
|
(*b->res.bv)[n] = NULL; |
|
break; |
|
} |
|
return 0; |
|
} |
|
|
|
if ( ber_get_stringbv( b->ber, &bv ) == LBER_DEFAULT ) |
|
return LBER_DEFAULT; |
|
|
|
b->tag = ber_get_stringbvr( b, n+1 ); |
|
if ( b->tag == 0 ) |
|
{ |
|
/* store my result */ |
|
switch (b->choice) { |
|
case ChArray: |
|
(*b->res.c)[n] = bv.bv_val; |
|
break; |
|
case BvArray: |
|
(*b->res.ba)[n] = bv; |
|
break; |
|
case BvVec: |
|
(*b->res.bv)[n] = ber_bvdup( &bv ); |
|
break; |
|
} |
|
} else { |
|
LBER_FREE( bv.bv_val ); |
|
} |
|
return b->tag; |
|
} |
|
|
ber_tag_t |
ber_tag_t |
ber_get_stringbv( BerElement *ber, struct berval *bv ) |
ber_get_stringbv( BerElement *ber, struct berval *bv ) |
{ |
{ |
Line 469 ber_next_element(
|
Line 542 ber_next_element(
|
} |
} |
|
|
/* Hopefully no one sends vectors with more elements than this */ |
/* Hopefully no one sends vectors with more elements than this */ |
#define TMP_SLOTS 1024 |
/* #define TMP_SLOTS 1024 */ |
|
|
/* VARARGS */ |
/* VARARGS */ |
ber_tag_t |
ber_tag_t |
Line 580 ber_scanf ( BerElement *ber,
|
Line 653 ber_scanf ( BerElement *ber,
|
|
|
case 'v': /* sequence of strings */ |
case 'v': /* sequence of strings */ |
{ |
{ |
|
#ifdef TMP_SLOTS |
char *tmp[TMP_SLOTS]; |
char *tmp[TMP_SLOTS]; |
sss = va_arg( ap, char *** ); |
sss = va_arg( ap, char *** ); |
*sss = NULL; |
*sss = NULL; |
Line 606 ber_scanf ( BerElement *ber,
|
Line 680 ber_scanf ( BerElement *ber,
|
for (j--; j>=0; j--) |
for (j--; j>=0; j--) |
LBER_FREE(tmp[j]); |
LBER_FREE(tmp[j]); |
} |
} |
|
#else |
|
bgbvr cookie = { ber, ChArray }; |
|
cookie.res.c = va_arg( ap, char *** ); |
|
rc = ber_get_stringbvr( &cookie, 0 ); |
|
#endif |
break; |
break; |
} |
} |
|
|
case 'V': /* sequence of strings + lengths */ |
case 'V': /* sequence of strings + lengths */ |
{ |
{ |
|
#ifdef TMP_SLOTS |
struct berval *tmp[TMP_SLOTS]; |
struct berval *tmp[TMP_SLOTS]; |
bv = va_arg( ap, struct berval *** ); |
bv = va_arg( ap, struct berval *** ); |
*bv = NULL; |
*bv = NULL; |
Line 637 ber_scanf ( BerElement *ber,
|
Line 717 ber_scanf ( BerElement *ber,
|
for (j--; j>=0; j--) |
for (j--; j>=0; j--) |
ber_bvfree(tmp[j]); |
ber_bvfree(tmp[j]); |
} |
} |
|
#else |
|
bgbvr cookie = { ber, BvVec }; |
|
cookie.res.bv = va_arg( ap, struct berval *** ); |
|
rc = ber_get_stringbvr( &cookie, 0 ); |
|
#endif |
break; |
break; |
} |
} |
|
|
case 'W': /* bvarray */ |
case 'W': /* bvarray */ |
{ |
{ |
|
#ifdef TMP_SLOTS |
struct berval tmp[TMP_SLOTS]; |
struct berval tmp[TMP_SLOTS]; |
bvp = va_arg( ap, struct berval ** ); |
bvp = va_arg( ap, struct berval ** ); |
*bvp = NULL; |
*bvp = NULL; |
Line 669 ber_scanf ( BerElement *ber,
|
Line 755 ber_scanf ( BerElement *ber,
|
for (j--; j>=0; j--) |
for (j--; j>=0; j--) |
LBER_FREE(tmp[j].bv_val); |
LBER_FREE(tmp[j].bv_val); |
} |
} |
|
#else |
|
bgbvr cookie = { ber, BvArray }; |
|
cookie.res.ba = va_arg( ap, struct berval ** ); |
|
rc = ber_get_stringbvr( &cookie, 0 ); |
|
#endif |
break; |
break; |
} |
} |
|
|