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:
		| @@ -30,7 +30,7 @@ cp(const char *s1, const char *s2, int depth) | ||||
| 	FILE *f1, *f2; | ||||
| 	struct dirent *d; | ||||
| 	struct stat st; | ||||
| 	struct utimbuf ut; | ||||
| 	struct timespec times[2]; | ||||
| 	ssize_t r; | ||||
| 	int (*statf)(const char *, struct stat *); | ||||
| 	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) { | ||||
| 		/* timestamp and owner*/ | ||||
| 		if (!S_ISLNK(st.st_mode)) { | ||||
| 			ut.actime = st.st_atime; | ||||
| 			ut.modtime = st.st_mtime; | ||||
| 			utime(s2, &ut); | ||||
| 			times[0] = st.st_atim; | ||||
| 			times[1] = st.st_mtim; | ||||
| 			utimensat(AT_FDCWD, s2, times, 0); | ||||
|  | ||||
| 			if (chown(s2, st.st_uid, st.st_gid) < 0) { | ||||
| 				weprintf("chown %s:", s2); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user