compress,gzip,xz: Preserve timestamps with nanosecond precision.

This commit is contained in:
Jilles Tjoelker 2015-02-17 13:12:54 +00:00
parent 6da235a325
commit d6b3ef634c
3 changed files with 12 additions and 10 deletions

View File

@ -26,6 +26,7 @@
#define HAVE_ENCODER_SPARC 1 #define HAVE_ENCODER_SPARC 1
#define HAVE_ENCODER_X86 1 #define HAVE_ENCODER_X86 1
#define HAVE_FCNTL_H 1 #define HAVE_FCNTL_H 1
#define HAVE_FUTIMENS 1
#define HAVE_FUTIMES 1 #define HAVE_FUTIMES 1
#define HAVE_GETOPT_H 1 #define HAVE_GETOPT_H 1
#define HAVE_GETOPT_LONG 1 #define HAVE_GETOPT_LONG 1

View File

@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
#include <err.h> #include <err.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -360,14 +361,14 @@ err: if (ofp) {
static void static void
setfile(const char *name, struct stat *fs) setfile(const char *name, struct stat *fs)
{ {
static struct timeval tv[2]; static struct timespec tspec[2];
fs->st_mode &= S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO; fs->st_mode &= S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
TIMESPEC_TO_TIMEVAL(&tv[0], &fs->st_atim); tspec[0] = fs->st_atim;
TIMESPEC_TO_TIMEVAL(&tv[1], &fs->st_mtim); tspec[1] = fs->st_mtim;
if (utimes(name, tv)) if (utimensat(AT_FDCWD, name, tspec, 0))
cwarn("utimes: %s", name); cwarn("utimensat: %s", name);
/* /*
* Changing the ownership probably won't succeed, unless we're root * Changing the ownership probably won't succeed, unless we're root

View File

@ -1070,7 +1070,7 @@ out2:
static void static void
copymodes(int fd, const struct stat *sbp, const char *file) copymodes(int fd, const struct stat *sbp, const char *file)
{ {
struct timeval times[2]; struct timespec times[2];
struct stat sb; struct stat sb;
/* /*
@ -1098,10 +1098,10 @@ copymodes(int fd, const struct stat *sbp, const char *file)
if (fchmod(fd, sb.st_mode) < 0) if (fchmod(fd, sb.st_mode) < 0)
maybe_warn("couldn't fchmod: %s", file); maybe_warn("couldn't fchmod: %s", file);
TIMESPEC_TO_TIMEVAL(&times[0], &sb.st_atim); times[0] = sb.st_atim;
TIMESPEC_TO_TIMEVAL(&times[1], &sb.st_mtim); times[1] = sb.st_mtim;
if (futimes(fd, times) < 0) if (futimens(fd, times) < 0)
maybe_warn("couldn't utimes: %s", file); maybe_warn("couldn't futimens: %s", file);
/* only try flags if they exist already */ /* only try flags if they exist already */
if (sb.st_flags != 0 && fchflags(fd, sb.st_flags) < 0) if (sb.st_flags != 0 && fchflags(fd, sb.st_flags) < 0)