compress,gzip,xz: Preserve timestamps with nanosecond precision.
This commit is contained in:
parent
6da235a325
commit
d6b3ef634c
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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(×[0], &sb.st_atim);
|
times[0] = sb.st_atim;
|
||||||
TIMESPEC_TO_TIMEVAL(×[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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user