1/* dtest.c - lber decoding test program */
2/* $OpenLDAP$ */
3/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 *
5 * Copyright 1998-2011 The OpenLDAP Foundation.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted only as authorized by the OpenLDAP
10 * Public License.
11 *
12 * A copy of this license is available in the file LICENSE in the
13 * top-level directory of the distribution or, alternatively, at
14 * <http://www.OpenLDAP.org/license.html>.
15 */
16/* Portions Copyright (c) 1990 Regents of the University of Michigan.
17 * All rights reserved.
18 *
19 * Redistribution and use in source and binary forms are permitted
20 * provided that this notice is preserved and that due credit is given
21 * to the University of Michigan at Ann Arbor. The name of the University
22 * may not be used to endorse or promote products derived from this
23 * software without specific prior written permission. This software
24 * is provided ``as is'' without express or implied warranty.
25 */
26/* ACKNOWLEDGEMENTS:
27 * This work was originally developed by the University of Michigan
28 * (as part of U-MICH LDAP).
29 */
30
31#include "portable.h"
32
33#include <stdio.h>
34
35#include <ac/stdlib.h>
36#include <ac/string.h>
37#include <ac/socket.h>
38#include <ac/unistd.h>
39#include <ac/errno.h>
40
41#ifdef HAVE_CONSOLE_H
42#include <console.h>
43#endif
44
45#include <lber.h>
46
47static void usage( const char *name )
48{
49	fprintf( stderr, "usage: %s fmt\n", name );
50}
51
52int
53main( int argc, char **argv )
54{
55	char *s;
56
57	ber_tag_t	tag;
58	ber_len_t	len;
59
60	BerElement	*ber;
61	Sockbuf		*sb;
62	int		fd;
63
64	/* enable debugging */
65	int ival = -1;
66	ber_set_option( NULL, LBER_OPT_DEBUG_LEVEL, &ival );
67
68	if ( argc < 2 ) {
69		usage( argv[0] );
70		return( EXIT_FAILURE );
71	}
72
73#ifdef HAVE_CONSOLE_H
74	ccommand( &argv );
75	cshow( stdout );
76#endif
77
78	sb = ber_sockbuf_alloc();
79	fd = fileno( stdin );
80	ber_sockbuf_add_io( sb, &ber_sockbuf_io_fd, LBER_SBIOD_LEVEL_PROVIDER,
81		(void *)&fd );
82
83	ber = ber_alloc_t(LBER_USE_DER);
84	if( ber == NULL ) {
85		perror( "ber_alloc_t" );
86		return( EXIT_FAILURE );
87	}
88
89	for (;;) {
90		tag = ber_get_next( sb, &len, ber);
91		if( tag != LBER_ERROR ) break;
92
93		if( errno == EWOULDBLOCK ) continue;
94		if( errno == EAGAIN ) continue;
95
96		perror( "ber_get_next" );
97		return( EXIT_FAILURE );
98	}
99
100	printf("decode: message tag 0x%lx and length %ld\n",
101		(unsigned long) tag, (long) len );
102
103	for( s = argv[1]; *s; s++ ) {
104		char buf[128];
105		char fmt[2];
106		fmt[0] = *s;
107		fmt[1] = '\0';
108
109		printf("decode: format %s\n", fmt );
110		len = sizeof(buf);
111		tag = ber_scanf( ber, fmt, &buf[0], &len );
112
113		if( tag == LBER_ERROR ) {
114			perror( "ber_scanf" );
115			return( EXIT_FAILURE );
116		}
117	}
118
119	ber_sockbuf_free( sb );
120	return( EXIT_SUCCESS );
121}
122