This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: output renaming in objcopy & strip


Alan Modra wrote:
On Thu, May 17, 2007 at 06:09:11PM +0100, Nathan Sidwell wrote:
	* objcopy.c (strip_main): Detect identical input and output file
	names.
	(copy_main): Refactor tempname detection and use.

OK, but you missed changing one "output_file == NULL" to "output_file != tmpname" in strip_main.

ah, got it. thanks!


nathan
--
Nathan Sidwell    ::   http://www.codesourcery.com   ::         CodeSourcery
nathan@codesourcery.com    ::     http://www.planetfall.pwp.blueyonder.co.uk

2007-05-17  Nathan Sidwell  <nathan@codesourcery.com>

	* objcopy.c (strip_main): Detect identical input and output file
	names.
	(copy_main): Refactor tempname detection and use.

Index: objcopy.c
===================================================================
RCS file: /cvs/src/src/binutils/objcopy.c,v
retrieving revision 1.111
diff -c -3 -p -r1.111 objcopy.c
*** objcopy.c	11 May 2007 14:09:50 -0000	1.111
--- objcopy.c	18 May 2007 06:35:19 -0000
*************** strip_main (int argc, char *argv[])
*** 2769,2778 ****
  	   It has already been checked in get_file_size().  */
  	stat (argv[i], &statbuf);
  
!       if (output_file != NULL)
! 	tmpname = output_file;
!       else
  	tmpname = make_tempname (argv[i]);
  
        if (tmpname == NULL)
  	{
--- 2769,2778 ----
  	   It has already been checked in get_file_size().  */
  	stat (argv[i], &statbuf);
  
!       if (output_file == NULL || strcmp (argv[i], output_file) == 0)
  	tmpname = make_tempname (argv[i]);
+       else
+ 	tmpname = output_file;
  
        if (tmpname == NULL)
  	{
*************** strip_main (int argc, char *argv[])
*** 2788,2800 ****
  	{
  	  if (preserve_dates)
  	    set_times (tmpname, &statbuf);
! 	  if (output_file == NULL)
! 	    smart_rename (tmpname, argv[i], preserve_dates);
  	  status = hold_status;
  	}
        else
  	unlink_if_ordinary (tmpname);
!       if (output_file == NULL)
  	free (tmpname);
      }
  
--- 2788,2801 ----
  	{
  	  if (preserve_dates)
  	    set_times (tmpname, &statbuf);
! 	  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 != tmpname)
  	free (tmpname);
      }
  
*************** copy_main (int argc, char *argv[])
*** 2807,2812 ****
--- 2808,2814 ----
    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;
*************** copy_main (int argc, char *argv[])
*** 3397,3428 ****
    /* 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);
!     }
    else
!     {
!       copy_file (input_filename, output_filename, input_target, output_target);
  
!       if (status == 0 && preserve_dates)
! 	set_times (output_filename, &statbuf);
!       else if (status != 0)
! 	unlink_if_ordinary (output_filename);
      }
  
    if (change_warn)
      {
--- 3399,3422 ----
    /* 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)
!     tmpname = make_tempname (input_filename);
    else
!     tmpname = output_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);
!       if (tmpname != output_filename)
! 	smart_rename (tmpname, input_filename, preserve_dates);
      }
+   else
+     unlink_if_ordinary (tmpname);
  
    if (change_warn)
      {

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]