This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
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)
{