* objcopy.c (strip_main): Detect identical input and output file
authorNathan Sidwell <nathan@codesourcery.com>
Fri, 18 May 2007 06:36:14 +0000 (06:36 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Fri, 18 May 2007 06:36:14 +0000 (06:36 +0000)
names.
(copy_main): Refactor tempname detection and use.

binutils/ChangeLog
binutils/objcopy.c

index f364cca0199933947065df978e471628d65e1178..6a7d9456eb4c71cb4a1c9b6d29bd7b0c26d0d5bc 100644 (file)
@@ -1,3 +1,9 @@
+2007-05-18  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * objcopy.c (strip_main): Detect identical input and output file
+       names.
+       (copy_main): Refactor tempname detection and use.
+
 2007-05-17  Nick Clifton  <nickc@redhat.com>
 
        * objdump.c (load_debug_section): Select bias for DWARF debug
index a841e014d40ceb4ee8e89e1cb25eb4b3dcd299c2..4d69033756137e4ac80d3f15672f56e6e8a52b5d 100644 (file)
@@ -2769,10 +2769,10 @@ strip_main (int argc, char *argv[])
           It has already been checked in get_file_size().  */
        stat (argv[i], &statbuf);
 
-      if (output_file != NULL)
-       tmpname = output_file;
-      else
+      if (output_file == NULL || strcmp (argv[i], output_file) == 0)
        tmpname = make_tempname (argv[i]);
+      else
+       tmpname = output_file;
 
       if (tmpname == NULL)
        {
@@ -2788,13 +2788,14 @@ strip_main (int argc, char *argv[])
        {
          if (preserve_dates)
            set_times (tmpname, &statbuf);
-         if (output_file == NULL)
-           smart_rename (tmpname, argv[i], preserve_dates);
+         if (output_file != tmpname)
+           smart_rename (tmpname, output_file ? output_file : argv[i],
+                         preserve_dates);
          status = hold_status;
        }
       else
        unlink_if_ordinary (tmpname);
-      if (output_file == NULL)
+      if (output_file != tmpname)
        free (tmpname);
     }
 
@@ -2807,6 +2808,7 @@ copy_main (int argc, char *argv[])
   char * binary_architecture = NULL;
   char *input_filename = NULL;
   char *output_filename = NULL;
+  char *tmpname;    
   char *input_target = NULL;
   char *output_target = NULL;
   bfd_boolean show_version = FALSE;
@@ -3397,32 +3399,24 @@ copy_main (int argc, char *argv[])
   /* If there is no destination file, or the source and destination files
      are the same, then create a temp and rename the result into the input.  */
   if (output_filename == NULL || strcmp (input_filename, output_filename) == 0)
-    {
-      char *tmpname = make_tempname (input_filename);
-
-      if (tmpname == NULL)
-       fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
-              input_filename, strerror (errno));
-
-      copy_file (input_filename, tmpname, input_target, output_target);
-      if (status == 0)
-       {
-         if (preserve_dates)
-           set_times (tmpname, &statbuf);
-         smart_rename (tmpname, input_filename, preserve_dates);
-       }
-      else
-       unlink (tmpname);
-    }
+    tmpname = make_tempname (input_filename);
   else
-    {
-      copy_file (input_filename, output_filename, input_target, output_target);
+    tmpname = output_filename;
+  
+  if (tmpname == NULL)
+    fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
+          input_filename, strerror (errno));
 
-      if (status == 0 && preserve_dates)
-       set_times (output_filename, &statbuf);
-      else if (status != 0)
-       unlink_if_ordinary (output_filename);
+  copy_file (input_filename, tmpname, input_target, output_target);
+  if (status == 0)
+    {
+      if (preserve_dates)
+       set_times (tmpname, &statbuf);
+      if (tmpname != output_filename)
+       smart_rename (tmpname, input_filename, preserve_dates);
     }
+  else
+    unlink_if_ordinary (tmpname);
 
   if (change_warn)
     {