X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Frename.c;h=5c3bfee8e978f42b10091aea0a4455b65dcc7b07;hb=ac8cb70f3690b4eace1325c7ff918dce9073da7c;hp=fdc7263d1fc7fc5ffe6a1a71be12484b7a3c7976;hpb=252b5132c753830d5fd56823373aed85f2a0db63;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/rename.c b/binutils/rename.c index fdc7263d1f..5c3bfee8e9 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-2018 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,7 +30,8 @@ #endif /* HAVE_UTIMES */ #endif /* ! HAVE_GOOD_UTIME_H */ -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 @@ -40,18 +40,20 @@ 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; char buf[COPY_BUF]; - fromfd = open (from, O_RDONLY); + fromfd = open (from, O_RDONLY | O_BINARY); if (fromfd < 0) return -1; +#ifdef O_CREAT + tofd = open (to, O_CREAT | O_WRONLY | O_TRUNC | O_BINARY, 0777); +#else tofd = creat (to, 0777); +#endif if (tofd < 0) { saved = errno; @@ -80,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; @@ -134,36 +135,37 @@ 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) { - int exists; + bfd_boolean exists; struct stat s; int ret = 0; - exists = lstat (to, &s); + exists = lstat (to, &s) == 0; #if defined (_WIN32) && !defined (__CYGWIN32__) /* Win32, unlike unix, will not erase `to' in `rename(from, to)' but fail instead. Also, chown is not present. */ - if (exists == 0) + if (exists) remove (to); 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 < 0 || (!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) @@ -189,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); } } @@ -198,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);