/* ar.c - Archive modify and extract.
- Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ Copyright 1991-2013 Free Software Foundation, Inc.
This file is part of GNU Binutils.
#include "filenames.h"
#include "binemul.h"
#include "plugin.h"
-#include <sys/stat.h>
#ifdef __GO32___
#define EXT_NAME_LEN 3 /* Bufflen of addition to name if it's MS-DOS. */
{
FILE *s;
- s = help ? stdout : stderr;
-
#if BFD_SUPPORTS_PLUGINS
/* xgettext:c-format */
const char *command_line
= _("Usage: %s [emulation options] [-]{dmpqrstx}[abcDfilMNoPsSTuvV]"
" [member-name] [count] archive-file file...\n");
#endif
+ s = help ? stdout : stderr;
+
fprintf (s, command_line, program_name);
/* xgettext:c-format */
return &argv[optind];
}
-/* If neither -D nor -U was not specified explicitly,
+/* If neither -D nor -U was specified explicitly,
then use the configured default. */
static void
default_deterministic (void)
case 'V':
show_version = 1;
break;
- }
+
+ /* PR binutils/13493: Support plugins. */
+ case OPTION_PLUGIN:
+#if BFD_SUPPORTS_PLUGINS
+ plugin_target = "plugin";
+ bfd_plugin_set_plugin (optarg);
+#else
+ fprintf (stderr, _("sorry - this program has been built without plugin support\n"));
+ xexit (1);
+#endif
+ break;
+ }
}
if (argc < 2)
xexit (1);
}
+ if ((operation == replace || operation == quick_append)
+ && bfd_openr_next_archived_file (arch, NULL) != NULL)
+ {
+ /* PR 15140: Catch attempts to convert a normal
+ archive into a thin archive or vice versa. */
+ if (make_thin_archive && ! bfd_is_thin_archive (arch))
+ {
+ fatal (_("Cannot convert existing library %s to thin format"),
+ bfd_get_filename (arch));
+ goto bloser;
+ }
+ else if (! make_thin_archive && bfd_is_thin_archive (arch))
+ {
+ fatal (_("Cannot convert existing thin library %s to normal format"),
+ bfd_get_filename (arch));
+ goto bloser;
+ }
+ }
+
last_one = &(arch->archive_next);
/* Read all the contents right away, regardless. */
for (next_one = bfd_openr_next_archived_file (arch, NULL);
static void
print_contents (bfd *abfd)
{
- size_t ncopied = 0;
+ bfd_size_type ncopied = 0;
+ bfd_size_type size;
char *cbuf = (char *) xmalloc (BUFSIZE);
struct stat buf;
- size_t size;
+
if (bfd_stat_arch_elt (abfd, &buf) != 0)
/* xgettext:c-format */
fatal (_("internal stat error on %s"), bfd_get_filename (abfd));
size = buf.st_size;
while (ncopied < size)
{
+ bfd_size_type nread;
+ bfd_size_type tocopy = size - ncopied;
- size_t nread;
- size_t tocopy = size - ncopied;
if (tocopy > BUFSIZE)
tocopy = BUFSIZE;
- nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd);
+ nread = bfd_bread (cbuf, tocopy, abfd);
if (nread != tocopy)
/* xgettext:c-format */
fatal (_("%s is not a valid archive"),
bfd_get_filename (bfd_my_archive (abfd)));
- /* fwrite in mingw32 may return int instead of size_t. Cast the
- return value to size_t to avoid comparison between signed and
+ /* fwrite in mingw32 may return int instead of bfd_size_type. Cast the
+ return value to bfd_size_type to avoid comparison between signed and
unsigned values. */
- if ((size_t) fwrite (cbuf, 1, nread, stdout) != nread)
+ if ((bfd_size_type) fwrite (cbuf, 1, nread, stdout) != nread)
fatal ("stdout: %s", strerror (errno));
ncopied += tocopy;
}
{
FILE *ostream;
char *cbuf = (char *) xmalloc (BUFSIZE);
- size_t nread, tocopy;
- size_t ncopied = 0;
- size_t size;
+ bfd_size_type nread, tocopy;
+ bfd_size_type ncopied = 0;
+ bfd_size_type size;
struct stat buf;
if (bfd_stat_arch_elt (abfd, &buf) != 0)
if (tocopy > BUFSIZE)
tocopy = BUFSIZE;
- nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd);
+ nread = bfd_bread (cbuf, tocopy, abfd);
if (nread != tocopy)
/* xgettext:c-format */
fatal (_("%s is not a valid archive"),
output_file = ostream;
}
- /* fwrite in mingw32 may return int instead of size_t. Cast
- the return value to size_t to avoid comparison between
+ /* fwrite in mingw32 may return int instead of bfd_size_type. Cast
+ the return value to bfd_size_type to avoid comparison between
signed and unsigned values. */
- if ((size_t) fwrite (cbuf, 1, nread, ostream) != nread)
+ if ((bfd_size_type) fwrite (cbuf, 1, nread, ostream) != nread)
fatal ("%s: %s", output_filename, strerror (errno));
ncopied += tocopy;
}