diff options
author | jilles <jilles@FreeBSD.org> | 2015-01-24 13:50:13 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2015-01-24 13:50:13 +0000 |
commit | 3a9e3cd8d9759079220ebe0f13a1d1a8a458734e (patch) | |
tree | 2b470ac738f4b696f867cd706f33163b46c962c6 /bin/cp | |
parent | b126e557b253b006789504806612c8f6dc907bbe (diff) | |
download | FreeBSD-src-3a9e3cd8d9759079220ebe0f13a1d1a8a458734e.zip FreeBSD-src-3a9e3cd8d9759079220ebe0f13a1d1a8a458734e.tar.gz |
cp,mv,touch: Set timestamps with nanosecond precision.
This uses utimensat().
Diffstat (limited to 'bin/cp')
-rw-r--r-- | bin/cp/utils.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/bin/cp/utils.c b/bin/cp/utils.c index ad9695c..e77a6c1 100644 --- a/bin/cp/utils.c +++ b/bin/cp/utils.c @@ -330,7 +330,7 @@ copy_special(struct stat *from_stat, int exists) int setfile(struct stat *fs, int fd) { - static struct timeval tv[2]; + static struct timespec tspec[2]; struct stat ts; int rval, gotstat, islink, fdval; @@ -340,10 +340,11 @@ setfile(struct stat *fs, int fd) fs->st_mode &= S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO; - TIMESPEC_TO_TIMEVAL(&tv[0], &fs->st_atim); - TIMESPEC_TO_TIMEVAL(&tv[1], &fs->st_mtim); - if (islink ? lutimes(to.p_path, tv) : utimes(to.p_path, tv)) { - warn("%sutimes: %s", islink ? "l" : "", to.p_path); + tspec[0] = fs->st_atim; + tspec[1] = fs->st_mtim; + if (utimensat(AT_FDCWD, to.p_path, tspec, + islink ? AT_SYMLINK_NOFOLLOW : 0)) { + warn("utimensat: %s", to.p_path); rval = 1; } if (fdval ? fstat(fd, &ts) : |