aboutsummaryrefslogtreecommitdiff
path: root/binutils/bfdtest2.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-11-06 23:45:43 +0000
committerH.J. Lu <hjl.tools@gmail.com>2012-11-06 23:45:43 +0000
commitf7da43f33be2ec85f32f81c55cd5c046ff75d9f9 (patch)
tree5f60be7469658c278448336be9e9b01110977cc5 /binutils/bfdtest2.c
parent87988f9a1da85822606a7e9b90bd5d07a1608c47 (diff)
downloadgdb-f7da43f33be2ec85f32f81c55cd5c046ff75d9f9.zip
gdb-f7da43f33be2ec85f32f81c55cd5c046ff75d9f9.tar.gz
gdb-f7da43f33be2ec85f32f81c55cd5c046ff75d9f9.tar.bz2
Add a testcase for PR binutils/14567
binutils/ PR binutils/14567 * Makefile.am (BFDTEST2_PROG): New. (bfdtest2_DEPENDENCIES): Likewise. (TEST_PROGS): Add $(BFDTEST2_PROG). * Makefile.in: Regenerated. * bfdtest2.c: New file. binutils/testsuite/ PR binutils/14567 * binutils-all/ar.exp (bfdtest1): Removed. (long_filenames): Take bfdtests. (thin_archive): Likewise. (thin_archive_with_nested): Likewise. (bfdtests): New. Pass $bfdtests to long_filenames, thin_archive and thin_archive_with_nested.
Diffstat (limited to 'binutils/bfdtest2.c')
-rw-r--r--binutils/bfdtest2.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/binutils/bfdtest2.c b/binutils/bfdtest2.c
new file mode 100644
index 0000000..a0bdd7c
--- /dev/null
+++ b/binutils/bfdtest2.c
@@ -0,0 +1,106 @@
+/* A program to test BFD.
+ Copyright 2012 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;
+}