mv, cp: Preserve nanosecond timestamps
Otherwise, we run into problems in a typical autoconf-based build system: - config.status is created at some point between two seconds. - config.status is run, generating Makefile by first writing to a file in /tmp, and then mv-ing it to Makefile. - If this mv happens before the beginning of the next second, Makefile will be created with the same tv_sec as config.status, but with tv_nsec = 0. - When make runs, it sees that Makefile is older than config.status, and re-runs config.status to generate Makefile.
This commit is contained in:
parent
0ba81a0f84
commit
1d28fbd6cf
@ -30,7 +30,7 @@ cp(const char *s1, const char *s2, int depth)
|
|||||||
FILE *f1, *f2;
|
FILE *f1, *f2;
|
||||||
struct dirent *d;
|
struct dirent *d;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
struct utimbuf ut;
|
struct timespec times[2];
|
||||||
ssize_t r;
|
ssize_t r;
|
||||||
int (*statf)(const char *, struct stat *);
|
int (*statf)(const char *, struct stat *);
|
||||||
char target[PATH_MAX], ns1[PATH_MAX], ns2[PATH_MAX], *statf_name;
|
char target[PATH_MAX], ns1[PATH_MAX], ns2[PATH_MAX], *statf_name;
|
||||||
@ -154,9 +154,9 @@ cp(const char *s1, const char *s2, int depth)
|
|||||||
if (cp_aflag || cp_pflag) {
|
if (cp_aflag || cp_pflag) {
|
||||||
/* timestamp and owner*/
|
/* timestamp and owner*/
|
||||||
if (!S_ISLNK(st.st_mode)) {
|
if (!S_ISLNK(st.st_mode)) {
|
||||||
ut.actime = st.st_atime;
|
times[0] = st.st_atim;
|
||||||
ut.modtime = st.st_mtime;
|
times[1] = st.st_mtim;
|
||||||
utime(s2, &ut);
|
utimensat(AT_FDCWD, s2, times, 0);
|
||||||
|
|
||||||
if (chown(s2, st.st_uid, st.st_gid) < 0) {
|
if (chown(s2, st.st_uid, st.st_gid) < 0) {
|
||||||
weprintf("chown %s:", s2);
|
weprintf("chown %s:", s2);
|
||||||
|
Loading…
Reference in New Issue
Block a user