diff options
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 5 | ||||
-rw-r--r-- | binutils/rename.c | 16 |
2 files changed, 15 insertions, 6 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index e7d5309..208f96e 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2003-11-27 Nick Clifton <nickc@redhat.com> + + * rename.c (smart_rename): Make sure that we have write + permission on the destination file before renaming. + 2003-11-26 Daniel Jacobowitz <drow@mvista.com> Nick Clifton <nickc@redhat.com> diff --git a/binutils/rename.c b/binutils/rename.c index 99561c4..398152e 100644 --- a/binutils/rename.c +++ b/binutils/rename.c @@ -159,14 +159,18 @@ smart_rename (const char *from, const char *to, int preserve_dates) if (ret != 0) { /* We have to clean up here. */ - - non_fatal (_("%s: rename: %s"), to, strerror (errno)); + non_fatal (_("unable to rename '%s' reason: %s"), to, strerror (errno)); unlink (from); } #else /* Use rename only if TO is not a symbolic link and has - only one hard link. */ - if (! exists || (!S_ISLNK (s.st_mode) && s.st_nlink == 1)) + only one hard link, and we have permission to write to it. */ + if (! exists + || (!S_ISLNK (s.st_mode) + && S_ISREG (s.st_mode) + && (s.st_mode & S_IWUSR) + && s.st_nlink == 1) + ) { ret = rename (from, to); if (ret == 0) @@ -193,7 +197,7 @@ smart_rename (const char *from, const char *to, int preserve_dates) else { /* We have to clean up here. */ - non_fatal (_("%s: rename: %s"), to, strerror (errno)); + non_fatal (_("unable to rename '%s' reason: %s"), to, strerror (errno)); unlink (from); } } @@ -201,7 +205,7 @@ smart_rename (const char *from, const char *to, int preserve_dates) { ret = simple_copy (from, to); if (ret != 0) - non_fatal (_("%s: simple_copy: %s"), to, strerror (errno)); + non_fatal (_("unable to copy file '%s' reason: %s"), to, strerror (errno)); if (preserve_dates) set_times (to, &s); |