diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2007-05-18 06:36:14 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@codesourcery.com> | 2007-05-18 06:36:14 +0000 |
commit | 12f498a721b3acede21798bd2090cb189308ac2b (patch) | |
tree | 67969e65e5e4b86339315356fdc41361d75a8a5f /binutils/objcopy.c | |
parent | 65b650b4c7463f4508bed523c24ab0031a5ae5cd (diff) | |
download | gdb-12f498a721b3acede21798bd2090cb189308ac2b.zip gdb-12f498a721b3acede21798bd2090cb189308ac2b.tar.gz 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.c | 52 |
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) { |