X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fmisc.c;h=183a79d27b7e6ed3fa9241a76b3f6c08a931b85e;hb=ea9e2d8d8ed26b201c0bef9136014216983d3e8f;hp=55bedd2b2c901669ff4025feadbb2fd338984831;hpb=d659cbaccdc1f3279c49107cf15f15a639738529;p=chaz%2Ftar diff --git a/src/misc.c b/src/misc.c index 55bedd2..183a79d 100644 --- a/src/misc.c +++ b/src/misc.c @@ -23,6 +23,14 @@ #include #include #include +#include + +#if HAVE_STROPTS_H +# include +#endif +#if HAVE_SYS_FILIO_H +# include +#endif /* Handling strings. */ @@ -239,6 +247,27 @@ code_ns_fraction (int ns, char *p) } } } + +char const * +code_timespec (struct timespec t, char sbuf[TIMESPEC_STRSIZE_BOUND]) +{ + time_t s = t.tv_sec; + int ns = t.tv_nsec; + char *np; + bool negative = s < 0; + + if (negative && ns != 0) + { + s++; + ns = BILLION - ns; + } + + np = umaxtostr (negative ? - (uintmax_t) s : (uintmax_t) s, sbuf + 1); + if (negative) + *--np = '-'; + code_ns_fraction (ns, sbuf + UINTMAX_STRSIZE_BOUND); + return np; +} /* File handling. */ @@ -383,7 +412,7 @@ remove_any_file (const char *file_name, enum remove_option option) so, we do not have to backup block or character devices, nor remote entities. */ bool -maybe_backup_file (const char *file_name, int this_is_the_archive) +maybe_backup_file (const char *file_name, bool this_is_the_archive) { struct stat file_stat; @@ -469,6 +498,26 @@ deref_stat (bool deref, char const *name, struct stat *buf) return deref ? stat (name, buf) : lstat (name, buf); } +/* Set FD's (i.e., FILE's) access time to TIMESPEC[0]. If that's not + possible to do by itself, set its access and data modification + times to TIMESPEC[0] and TIMESPEC[1], respectively. */ +int +set_file_atime (int fd, char const *file, struct timespec const timespec[2]) +{ +#ifdef _FIOSATIME + if (0 <= fd) + { + struct timeval timeval; + timeval.tv_sec = timespec[0].tv_sec; + timeval.tv_usec = timespec[0].tv_nsec / 1000; + if (ioctl (fd, _FIOSATIME, &timeval) == 0) + return 0; + } +#endif + + return futimens (fd, file, timespec); +} + /* A description of a working directory. */ struct wd {