aboutsummaryrefslogtreecommitdiff
path: root/binutils/objcopy.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2007-05-18 06:36:14 +0000
committerNathan Sidwell <nathan@codesourcery.com>2007-05-18 06:36:14 +0000
commit12f498a721b3acede21798bd2090cb189308ac2b (patch)
tree67969e65e5e4b86339315356fdc41361d75a8a5f /binutils/objcopy.c
parent65b650b4c7463f4508bed523c24ab0031a5ae5cd (diff)
downloadfsf-binutils-gdb-12f498a721b3acede21798bd2090cb189308ac2b.zip
fsf-binutils-gdb-12f498a721b3acede21798bd2090cb189308ac2b.tar.gz
fsf-binutils-gdb-12f498a721b3acede21798bd2090cb189308ac2b.tar.bz2
* objcopy.c (strip_main): Detect identical input and output file
names. (copy_main): Refactor tempname detection and use.
Diffstat (limited to 'binutils/objcopy.c')
-rw-r--r--binutils/objcopy.c52
1 files changed, 23 insertions, 29 deletions
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index a841e01..4d69033 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -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)
{