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
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=278896
3 changed files with 12 additions and 10 deletions

View File

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

View File

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

View File

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