* 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:
parent
20ae00985d
commit
4c168fa3f7
2 changed files with 47 additions and 12 deletions
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue