X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=binutils%2Frename.c;h=592d961d49699dc77d01baa632529f71569bf0e6;hb=1769380a11463b907263ef5443de5d14559f2095;hp=78ea9fd6b20da379640dee500926e13067c98694;hpb=72ec28b8afa357cdde70c612b4e0e9f37a34f8e4;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/rename.c b/binutils/rename.c index 78ea9fd6b2..592d961d49 100644 --- a/binutils/rename.c +++ b/binutils/rename.c @@ -1,11 +1,11 @@ /* rename.c -- rename a file, preserving symlinks. - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999-2019 Free Software Foundation, Inc. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,14 +15,13 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ +#include "sysdep.h" #include "bfd.h" #include "bucomm.h" -#include - #ifdef HAVE_GOOD_UTIME_H #include #else /* ! HAVE_GOOD_UTIME_H */ @@ -31,13 +30,8 @@ #endif /* HAVE_UTIMES */ #endif /* ! HAVE_GOOD_UTIME_H */ -/* We need to open the file in binary modes on system where that makes - a difference. */ -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -static int simple_copy PARAMS ((const char *, const char *)); +#if ! defined (_WIN32) || defined (__CYGWIN32__) +static int simple_copy (const char *, const char *); /* The number of bytes to copy at once. */ #define COPY_BUF 8192 @@ -46,9 +40,7 @@ static int simple_copy PARAMS ((const char *, const char *)); Return 0 if ok, -1 if error. */ static int -simple_copy (from, to) - const char *from; - const char *to; +simple_copy (const char *from, const char *to) { int fromfd, tofd, nread; int saved; @@ -90,14 +82,13 @@ simple_copy (from, to) } return 0; } +#endif /* __CYGWIN32__ or not _WIN32 */ /* Set the times of the file DESTINATION to be the same as those in STATBUF. */ void -set_times (destination, statbuf) - const char *destination; - const struct stat *statbuf; +set_times (const char *destination, const struct stat *statbuf) { int result; @@ -144,12 +135,9 @@ set_times (destination, statbuf) Return 0 if ok, -1 if error. */ int -smart_rename (from, to, preserve_dates) - const char *from; - const char *to; - int preserve_dates; +smart_rename (const char *from, const char *to, int preserve_dates ATTRIBUTE_UNUSED) { - boolean exists; + bfd_boolean exists; struct stat s; int ret = 0; @@ -165,15 +153,19 @@ smart_rename (from, to, preserve_dates) ret = rename (from, to); if (ret != 0) { - /* We have to clean up here. */ - - non_fatal (_("%s: rename: %s"), to, strerror (errno)); + /* We have to clean up here. */ + 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) @@ -199,8 +191,8 @@ smart_rename (from, to, preserve_dates) } else { - /* We have to clean up here. */ - non_fatal (_("%s: rename: %s"), to, strerror (errno)); + /* We have to clean up here. */ + non_fatal (_("unable to rename '%s'; reason: %s"), to, strerror (errno)); unlink (from); } } @@ -208,7 +200,7 @@ smart_rename (from, to, 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);