gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / binutils / rename.c
index a7be2c1f30cc5b72f67784ef6524c1562fd97841..bf3b68d0462dfba8eba7bc5197ad95a9ddd1cf66 100644 (file)
@@ -1,11 +1,11 @@
 /* rename.c -- rename a file, preserving symlinks.
 /* rename.c -- rename a file, preserving symlinks.
-   Copyright 1999 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
 
    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,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    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 "bfd.h"
 #include "bucomm.h"
 
-#include <sys/stat.h>
-
 #ifdef HAVE_GOOD_UTIME_H
 #include <utime.h>
 #else /* ! HAVE_GOOD_UTIME_H */
 #ifdef HAVE_GOOD_UTIME_H
 #include <utime.h>
 #else /* ! HAVE_GOOD_UTIME_H */
 #endif /* HAVE_UTIMES */
 #endif /* ! HAVE_GOOD_UTIME_H */
 
 #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
 
 /* 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
    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;
 {
   int fromfd, tofd, nread;
   int saved;
@@ -90,14 +82,13 @@ simple_copy (from, to)
     }
   return 0;
 }
     }
   return 0;
 }
+#endif /* __CYGWIN32__ or not _WIN32 */
 
 /* Set the times of the file DESTINATION to be the same as those in
    STATBUF.  */
 
 void
 
 /* 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;
 
 {
   int result;
 
@@ -144,12 +135,9 @@ set_times (destination, statbuf)
    Return 0 if ok, -1 if error.  */
 
 int
    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;
 
   struct stat s;
   int ret = 0;
 
@@ -165,15 +153,19 @@ smart_rename (from, to, preserve_dates)
   ret = rename (from, to);
   if (ret != 0)
     {
   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
       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)
     {
       ret = rename (from, to);
       if (ret == 0)
@@ -199,8 +191,8 @@ smart_rename (from, to, preserve_dates)
        }
       else
        {
        }
       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);
        }
     }
          unlink (from);
        }
     }
@@ -208,7 +200,7 @@ smart_rename (from, to, preserve_dates)
     {
       ret = simple_copy (from, to);
       if (ret != 0)
     {
       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);
 
       if (preserve_dates)
        set_times (to, &s);
This page took 0.029857 seconds and 4 git commands to generate.