/* A program to test BFD.
Copyright (C) 2012-2018 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
This program 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.
This program 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, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
#include "sysdep.h"
#include "bfd.h"
static void
die (const char *s)
{
printf ("oops: %s\n", s);
exit (1);
}
static void *
iovec_open (struct bfd *nbfd ATTRIBUTE_UNUSED, void *open_closure)
{
return open_closure;
}
static file_ptr iovec_read (struct bfd *nbfd ATTRIBUTE_UNUSED,
void *stream, void *buf, file_ptr nbytes,
file_ptr offset)
{
FILE* file = (FILE*) stream;
if (fseek(file, offset, SEEK_SET) != 0)
die ("fseek error");
return fread (buf, 1, nbytes, file);
}
static int
iovec_stat (struct bfd *abfd ATTRIBUTE_UNUSED,
void *stream, struct stat *sb)
{
return fstat (fileno ((FILE*) stream), sb);
}
static bfd_boolean
check_format_any (struct bfd *abfd, bfd_format format)
{
char** targets = NULL;
if (bfd_check_format_matches (abfd, format, &targets))
return TRUE;
if (targets)
{
bfd_find_target (targets[0], abfd);
return bfd_check_format (abfd, format);
}
return FALSE;
}
int
main (int argc, const char** argv)
{
FILE* file;
bfd *abfd, *mbfd;
if (argc < 2)
die ("Usage: test archivefile");
file = fopen(argv[1], "rb");
if (!file)
die ("file not found");
abfd = bfd_openr_iovec (argv[1], 0, iovec_open, file,
iovec_read, NULL, iovec_stat);
if (!abfd)
die ("error opening file");
if (!check_format_any (abfd, bfd_archive))
die ("not an archive");
mbfd = bfd_openr_next_archived_file (abfd, 0);
if (!mbfd)
die ("error opening archive member");
if (!bfd_close (mbfd))
die ("error closing archive member");
if (!bfd_close (abfd))
die ("error closing archive");
return 0;
}