X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Frename.c;h=bf3b68d0462dfba8eba7bc5197ad95a9ddd1cf66;hb=708a2ffff5cc2d280968a6b28268d8276d391bb4;hp=99561c47bcfc5369e78dc9fde1ef24f536e75fd1;hpb=2da42df615c0489291f8d3e1ce873642755a49c6;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/rename.c b/binutils/rename.c index 99561c47bc..bf3b68d046 100644 --- a/binutils/rename.c +++ b/binutils/rename.c @@ -1,11 +1,11 @@ /* rename.c -- rename a file, preserving symlinks. - Copyright 1999, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1999-2020 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,12 +30,7 @@ #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 - +#if ! defined (_WIN32) || defined (__CYGWIN32__) static int simple_copy (const char *, const char *); /* The number of bytes to copy at once. */ @@ -88,6 +82,7 @@ simple_copy (const char *from, const char *to) } return 0; } +#endif /* __CYGWIN32__ or not _WIN32 */ /* Set the times of the file DESTINATION to be the same as those in STATBUF. */ @@ -140,7 +135,7 @@ set_times (const char *destination, const struct stat *statbuf) Return 0 if ok, -1 if error. */ int -smart_rename (const char *from, const char *to, int preserve_dates) +smart_rename (const char *from, const char *to, int preserve_dates ATTRIBUTE_UNUSED) { bfd_boolean exists; struct stat s; @@ -159,14 +154,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 +192,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 +200,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);