* objcopy.c (MKDIR): Define.
authorAlan Modra <amodra@gmail.com>
Mon, 11 Feb 2002 02:34:14 +0000 (02:34 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 11 Feb 2002 02:34:14 +0000 (02:34 +0000)
(copy_archive): Make name_list.name const.  Use MKDIR.
Handle duplicate files in archives by making more temp dirs.

binutils/ChangeLog
binutils/objcopy.c

index 53d58693fbd3719c6d0a96895f02e64704802341..919eab172a70418bf4c7fe3027740da9492305e9 100644 (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>
 
        * coffdump.c: Include "getopt.h" after "bucomm.h"
index 1a819e8a03f1df77cfd9f86a6d650fc088afb96b..ebdbccaf4377a0086cecad068dfa21a7b029e2cb 100644 (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
    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 *next;
-      char *name;
+      const char *name;
       bfd *obfd;
     } *list, *l;
   bfd **ptr = &obfd->archive_head;
@@ -1288,11 +1295,7 @@ copy_archive (ibfd, obfd, output_target)
   char *dir = make_tempname (bfd_get_filename (obfd));
 
   /* Make a temp directory to hold the contents.  */
-#if defined (_WIN32) && !defined (__CYGWIN32__)
-  if (mkdir (dir) != 0)
-#else
-  if (mkdir (dir, 0700) != 0)
-#endif
+  if (MKDIR (dir, 0700) != 0)
     {
       fatal (_("cannot mkdir %s for archive copying (error: %s)"),
             dir, strerror (errno));
@@ -1308,14 +1311,35 @@ copy_archive (ibfd, obfd, output_target)
 
   while (!status && this_element != (bfd *) NULL)
     {
-      /* Create an output file for this member.  */
-      char *output_name = concat (dir, "/", bfd_get_filename (this_element),
-                                 (char *) NULL);
-      bfd *output_bfd = bfd_openw (output_name, output_target);
+      char *output_name;
+      bfd *output_bfd;
       bfd *last_element;
       struct stat buf;
       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)
        {
          stat_status = bfd_stat_arch_elt (this_element, &buf);
@@ -1371,8 +1395,13 @@ copy_archive (ibfd, obfd, output_target)
   /* Delete all the files that we opened.  */
   for (l = list; l != NULL; l = l->next)
     {
-      bfd_close (l->obfd);
-      unlink (l->name);
+      if (l->obfd == NULL)
+       rmdir (l->name);
+      else
+       {
+         bfd_close (l->obfd);
+         unlink (l->name);
+       }
     }
   rmdir (dir);
 }