/* ber-dump.c - Tool to dump BER encoded data
* Copyright (C) 2001 g10 Code GmbH
*
* This file is part of KSBA.
*
* KSBA is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* KSBA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*/
#include
#include
#include
#include
#include
#include
#include "visibility.h"
#include "ksba.h"
#include "ber-decoder.h"
#define PGMNAME "ber-dump"
#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 ))
# define ATTR_PRINTF(a,b) __attribute__ ((format (printf,a,b)))
#else
# define ATTR_PRINTF(a,b)
#endif
/* keep track of parsing error */
static int error_counter;
static void print_error (const char *fmt, ... ) ATTR_PRINTF(1,2);
static void
print_error (const char *fmt, ... )
{
va_list arg_ptr ;
va_start (arg_ptr, fmt);
fputs (PGMNAME ": ", stderr);
vfprintf (stderr, fmt, arg_ptr);
va_end (arg_ptr);
error_counter++;
}
static void
fatal (const char *fmt, ... )
{
va_list arg_ptr ;
va_start (arg_ptr, fmt);
fputs (PGMNAME ": fatal: ", stderr);
vfprintf (stderr, fmt, arg_ptr);
va_end (arg_ptr);
exit (1);
}
static void
one_file (FILE *fp, const char *fname, ksba_asn_tree_t asn_tree)
{
gpg_error_t err;
ksba_reader_t r;
BerDecoder d;
(void)fname; /* Not yet used in error messages. */
err = ksba_reader_new (&r);
if (err)
fatal ("out of core\n");
err = ksba_reader_set_file (r, fp);
if (err)
fatal ("ksba_reader_set_file failed: rc=%d\n", err);
d = _ksba_ber_decoder_new ();
if (!d)
fatal ("out of core\n");
err = _ksba_ber_decoder_set_reader (d, r);
if (err)
fatal ("ksba_ber_decoder_set_reader failed: rc=%d\n", err);
if (asn_tree)
{
err = _ksba_ber_decoder_set_module (d, asn_tree);
if (err)
fatal ("ksba_ber_decoder_set_module failed: rc=%d\n", err);
}
err = _ksba_ber_decoder_dump (d, stdout);
if (err)
print_error ("ksba_ber_decoder_dump failed: rc=%d\n", err);
_ksba_ber_decoder_release (d);
ksba_reader_release (r);
}
static void
usage (int exitcode)
{
fputs ("usage: ber-dump [--module asnfile] [files]\n", stderr);
exit (exitcode);
}
int
main (int argc, char **argv)
{
const char *asnfile = NULL;
ksba_asn_tree_t asn_tree = NULL;
int rc;
if (!argc || (argc > 1 &&
(!strcmp (argv[1],"--help") || !strcmp (argv[1],"-h"))) )
usage (0);
argc--; argv++;
if (argc && !strcmp (*argv,"--module"))
{
argc--; argv++;
if (!argc)
usage (1);
asnfile = *argv;
argc--; argv++;
}
if (asnfile)
{
rc = ksba_asn_parse_file (asnfile, &asn_tree, 0);
if (rc)
{
print_error ("parsing `%s' failed: rc=%d\n", asnfile, rc);
exit (1);
}
}
if (!argc)
one_file (stdin, "-", asn_tree);
else
{
for (; argc; argc--, argv++)
{
FILE *fp;
fp = fopen (*argv, "r");
if (!fp)
print_error ("can't open `%s': %s\n", *argv, strerror (errno));
else
{
one_file (fp, *argv, asn_tree);
fclose (fp);
}
}
}
ksba_asn_tree_release (asn_tree);
return error_counter? 1:0;
}