* objcopy.c (MKDIR): Define.

(copy_archive): Make name_list.name const.  Use MKDIR.
	Handle duplicate files in archives by making more temp dirs.
This commit is contained in:
Alan Modra 2002-02-11 02:34:14 +00:00
parent 20ae00985d
commit 4c168fa3f7
2 changed files with 47 additions and 12 deletions

View file

@ -1,3 +1,9 @@
2002-02-11 Alan Modra <amodra@bigpond.net.au>
* objcopy.c (MKDIR): Define.
(copy_archive): Make name_list.name const. Use MKDIR.
Handle duplicate files in archives by making more temp dirs.
2002-02-10 Daniel Jacobowitz <drow@mvista.com> 2002-02-10 Daniel Jacobowitz <drow@mvista.com>
* coffdump.c: Include "getopt.h" after "bucomm.h" * coffdump.c: Include "getopt.h" after "bucomm.h"

View file

@ -1268,6 +1268,13 @@ copy_object (ibfd, obfd)
} }
} }
#undef MKDIR
#if defined (_WIN32) && !defined (__CYGWIN32__)
#define MKDIR(DIR, MODE) mkdir (DIR)
#else
#define MKDIR(DIR, MODE) mkdir (DIR, MODE)
#endif
/* Read each archive element in turn from IBFD, copy the /* Read each archive element in turn from IBFD, copy the
contents to temp file, and keep the temp file handle. */ contents to temp file, and keep the temp file handle. */
@ -1280,7 +1287,7 @@ copy_archive (ibfd, obfd, output_target)
struct name_list struct name_list
{ {
struct name_list *next; struct name_list *next;
char *name; const char *name;
bfd *obfd; bfd *obfd;
} *list, *l; } *list, *l;
bfd **ptr = &obfd->archive_head; bfd **ptr = &obfd->archive_head;
@ -1288,11 +1295,7 @@ copy_archive (ibfd, obfd, output_target)
char *dir = make_tempname (bfd_get_filename (obfd)); char *dir = make_tempname (bfd_get_filename (obfd));
/* Make a temp directory to hold the contents. */ /* Make a temp directory to hold the contents. */
#if defined (_WIN32) && !defined (__CYGWIN32__) if (MKDIR (dir, 0700) != 0)
if (mkdir (dir) != 0)
#else
if (mkdir (dir, 0700) != 0)
#endif
{ {
fatal (_("cannot mkdir %s for archive copying (error: %s)"), fatal (_("cannot mkdir %s for archive copying (error: %s)"),
dir, strerror (errno)); dir, strerror (errno));
@ -1308,14 +1311,35 @@ copy_archive (ibfd, obfd, output_target)
while (!status && this_element != (bfd *) NULL) while (!status && this_element != (bfd *) NULL)
{ {
/* Create an output file for this member. */ char *output_name;
char *output_name = concat (dir, "/", bfd_get_filename (this_element), bfd *output_bfd;
(char *) NULL);
bfd *output_bfd = bfd_openw (output_name, output_target);
bfd *last_element; bfd *last_element;
struct stat buf; struct stat buf;
int stat_status = 0; int stat_status = 0;
/* Create an output file for this member. */
output_name = concat (dir, "/",
bfd_get_filename (this_element), (char *) 0);
/* If the file already exists, make another temp dir. */
if (stat (output_name, &buf) >= 0)
{
output_name = make_tempname (output_name);
if (MKDIR (output_name, 0700) != 0)
{
fatal (_("cannot mkdir %s for archive copying (error: %s)"),
output_name, strerror (errno));
}
l = (struct name_list *) xmalloc (sizeof (struct name_list));
l->name = output_name;
l->next = list;
l->obfd = NULL;
list = l;
output_name = concat (output_name, "/",
bfd_get_filename (this_element), (char *) 0);
}
output_bfd = bfd_openw (output_name, output_target);
if (preserve_dates) if (preserve_dates)
{ {
stat_status = bfd_stat_arch_elt (this_element, &buf); stat_status = bfd_stat_arch_elt (this_element, &buf);
@ -1370,10 +1394,15 @@ copy_archive (ibfd, obfd, output_target)
/* Delete all the files that we opened. */ /* Delete all the files that we opened. */
for (l = list; l != NULL; l = l->next) for (l = list; l != NULL; l = l->next)
{
if (l->obfd == NULL)
rmdir (l->name);
else
{ {
bfd_close (l->obfd); bfd_close (l->obfd);
unlink (l->name); unlink (l->name);
} }
}
rmdir (dir); rmdir (dir);
} }