X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblber%2Fdtest.c;h=8297d6a881586104802145a4fe427eda7ea38ab4;hb=afa2cd1893875266c58677cc640514c1d9eef41f;hp=d2f72154b46b526c9773a11efae4f7e8f1502085;hpb=b5494457d86d7b57b8de5fccda725e143c8e30bd;p=openldap diff --git a/libraries/liblber/dtest.c b/libraries/liblber/dtest.c index d2f72154b4..8297d6a881 100644 --- a/libraries/liblber/dtest.c +++ b/libraries/liblber/dtest.c @@ -1,5 +1,10 @@ /* dtest.c - lber decoding test program */ +/* $OpenLDAP$ */ /* + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ +/* Portions * Copyright (c) 1990 Regents of the University of Michigan. * All rights reserved. * @@ -14,19 +19,20 @@ #include "portable.h" #include -#include +#include #include #include #include +#include #ifdef HAVE_CONSOLE_H #include -#endif /* MACOS */ +#endif -#include "lber-int.h" +#include -static void usage( char *name ) +static void usage( const char *name ) { fprintf( stderr, "usage: %s fmt\n", name ); } @@ -34,32 +40,70 @@ static void usage( char *name ) int main( int argc, char **argv ) { - long i; - unsigned long len; - int tag; - BerElement ber; - Sockbuf sb; + char *s; + + ber_tag_t tag; + ber_len_t len; + + BerElement *ber; + Sockbuf *sb; + int fd; + + /* enable debugging */ + int ival = -1; + ber_set_option( NULL, LBER_OPT_DEBUG_LEVEL, &ival ); + + if ( argc < 2 ) { + usage( argv[0] ); + return( EXIT_FAILURE ); + } #ifdef HAVE_CONSOLE_H ccommand( &argv ); cshow( stdout ); -#endif /* MACOS */ +#endif - memset( &sb, 0, sizeof(sb) ); - sb.sb_sd = 0; - sb.sb_ber.ber_buf = NULL; + sb = ber_sockbuf_alloc(); + fd = fileno( stdin ); + ber_sockbuf_add_io( sb, &ber_sockbuf_io_fd, LBER_SBIOD_LEVEL_PROVIDER, + (void *)&fd ); + + ber = ber_alloc_t(LBER_USE_DER); + if( ber == NULL ) { + perror( "ber_alloc_t" ); + return( EXIT_FAILURE ); + } + + for (;;) { + tag = ber_get_next( sb, &len, ber); + if( tag != LBER_ERROR ) break; + + if( errno == EWOULDBLOCK ) continue; + if( errno == EAGAIN ) continue; - if ( (tag = ber_get_next( &sb, &len, &ber )) == -1 ) { perror( "ber_get_next" ); - exit( 1 ); + return( EXIT_FAILURE ); } - printf( "message has tag 0x%x and length %ld\n", tag, len ); - if ( ber_scanf( &ber, "i", &i ) == -1 ) { - fprintf( stderr, "ber_scanf returns -1\n" ); - exit( 1 ); + printf("decode: message tag 0x%lx and length %ld\n", + (unsigned long) tag, (long) len ); + + for( s = argv[1]; *s; s++ ) { + char buf[128]; + char fmt[2]; + fmt[0] = *s; + fmt[1] = '\0'; + + printf("decode: format %s\n", fmt ); + len = sizeof(buf); + tag = ber_scanf( ber, fmt, &buf[0], &len ); + + if( tag == LBER_ERROR ) { + perror( "ber_scanf" ); + return( EXIT_FAILURE ); + } } - printf( "got int %d\n", i ); - return( 0 ); + ber_sockbuf_free( sb ); + return( EXIT_SUCCESS ); }