1 /* rename.c -- rename a file, preserving symlinks.
2 Copyright (C) 1999-2021 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 #ifdef HAVE_GOOD_UTIME_H
27 #elif defined HAVE_UTIMES
31 /* The number of bytes to copy at once. */
34 /* Copy file FROMFD to file TO, performing no translations.
35 Return 0 if ok, -1 if error. */
38 simple_copy (int fromfd
, const char *to
,
39 struct stat
*target_stat ATTRIBUTE_UNUSED
)
46 || lseek (fromfd
, 0, SEEK_SET
) != 0)
49 tofd
= open (to
, O_WRONLY
| O_TRUNC
| O_BINARY
);
58 while ((nread
= read (fromfd
, buf
, sizeof buf
)) > 0)
60 if (write (tofd
, buf
, nread
) != nread
)
72 #if !defined (_WIN32) || defined (__CYGWIN32__)
73 /* Writing to a setuid/setgid file may clear S_ISUID and S_ISGID.
74 Try to restore them, ignoring failure. */
75 if (target_stat
!= NULL
)
76 fchmod (tofd
, target_stat
->st_mode
);
89 /* Set the times of the file DESTINATION to be the same as those in
93 set_times (const char *destination
, const struct stat
*statbuf
)
96 #ifdef HAVE_GOOD_UTIME_H
99 tb
.actime
= statbuf
->st_atime
;
100 tb
.modtime
= statbuf
->st_mtime
;
101 result
= utime (destination
, &tb
);
102 #elif defined HAVE_UTIMES
103 struct timeval tv
[2];
105 tv
[0].tv_sec
= statbuf
->st_atime
;
107 tv
[1].tv_sec
= statbuf
->st_mtime
;
109 result
= utimes (destination
, tv
);
113 tb
[0] = statbuf
->st_atime
;
114 tb
[1] = statbuf
->st_mtime
;
115 result
= utime (destination
, tb
);
119 non_fatal (_("%s: cannot set time: %s"), destination
, strerror (errno
));
122 /* Copy FROM to TO. TARGET_STAT has the file status that, if non-NULL,
123 is used to fix up timestamps. Return 0 if ok, -1 if error.
124 At one time this function renamed files, but file permissions are
125 tricky to update given the number of different schemes used by
126 various systems. So now we just copy. */
129 smart_rename (const char *from
, const char *to
, int fromfd
,
130 struct stat
*target_stat
, bool preserve_dates
)
134 ret
= simple_copy (fromfd
, to
, target_stat
);
136 non_fatal (_("unable to copy file '%s'; reason: %s"),
137 to
, strerror (errno
));
140 set_times (to
, target_stat
);