X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fmisc.c;h=78844ffcc8f6ed5adca60b9f6cd9fb9a8bab8c74;hb=aa976a517088ba75fa0168b47803b3988f89c9c3;hp=7322dd2a0f56c89cde3db3d24c14c51bb4ad1a4a;hpb=7b00db5675864768f56636b4c329635cf05123f1;p=chaz%2Ftar diff --git a/src/misc.c b/src/misc.c index 7322dd2..78844ff 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. */ @@ -490,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 {