X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblber%2Fdtest.c;h=7d9339f295af7163deaeae0d5118d2695bf0e737;hb=e3defe9075835ccd62258843c1b95678714476b1;hp=5b60292ceeaedd559f7b06d36811fc9a2fa8a988;hpb=d3123eada880cc9c1eb04d82ffcfaf7a027e2f88;p=openldap diff --git a/libraries/liblber/dtest.c b/libraries/liblber/dtest.c index 5b60292cee..7d9339f295 100644 --- a/libraries/liblber/dtest.c +++ b/libraries/liblber/dtest.c @@ -1,6 +1,19 @@ /* dtest.c - lber decoding test program */ -/* - * Copyright (c) 1990 Regents of the University of Michigan. +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2012 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 + * . + */ +/* Portions Copyright (c) 1990 Regents of the University of Michigan. * All rights reserved. * * Redistribution and use in source and binary forms are permitted @@ -10,55 +23,99 @@ * software without specific prior written permission. This software * is provided ``as is'' without express or implied warranty. */ +/* ACKNOWLEDGEMENTS: + * This work was originally developed by the University of Michigan + * (as part of U-MICH LDAP). + */ #include "portable.h" #include -#include +#include #include #include +#include +#include -#ifdef MACOS +#ifdef HAVE_CONSOLE_H #include -#endif /* MACOS */ +#endif -#include "lber.h" +#include -static void usage( char *name ) +static void usage( const char *name ) { fprintf( stderr, "usage: %s fmt\n", name ); } +int main( int argc, char **argv ) { - long i; - unsigned long len; - int tag; - BerElement ber; - Sockbuf sb; - extern char *optarg; - -#ifdef MACOS + 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 + + 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 ); + } - memset( &sb, 0, sizeof(sb) ); - sb.sb_sd = 0; - sb.sb_ber.ber_buf = NULL; + 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 ); }