[hackers] [sbase] mv, cp: Preserve nanosecond timestamps || Michael Forney

From: <git_AT_suckless.org>
Date: Sat, 16 May 2015 14:34:05 +0200 (CEST)

commit 1d28fbd6cfb38fa50976b2f2ff995b376638798e
Author: Michael Forney <mforney_AT_mforney.org>
Date: Sat May 16 04:57:25 2015 +0000

    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.

diff --git a/libutil/cp.c b/libutil/cp.c
index 32e0dc6..0f098d3 100644
--- a/libutil/cp.c
+++ b/libutil/cp.c
_AT_@ -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;
_AT_@ -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);
Received on Sat May 16 2015 - 14:34:05 CEST

This archive was generated by hypermail 2.3.0 : Sat May 16 2015 - 14:36:18 CEST