diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-05-16 09:22:21 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-05-16 09:22:21 +0000 |
commit | d4fdeab4db0d0e699c8fbbb07f12c4e1f64d0f94 (patch) | |
tree | 72231a38ed1cdd48ac6e02acb8b3917acb9dbcf4 /tests/ckmtime.c | |
download | tar-tarball-d4fdeab4db0d0e699c8fbbb07f12c4e1f64d0f94.tar.gz |
Diffstat (limited to 'tests/ckmtime.c')
-rw-r--r-- | tests/ckmtime.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/tests/ckmtime.c b/tests/ckmtime.c new file mode 100644 index 0000000..9fde42d --- /dev/null +++ b/tests/ckmtime.c @@ -0,0 +1,69 @@ +/* Check if filesystem timestamps are consistent with the system time. + Copyright (C) 2016 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program. If not, see <http://www.gnu.org/licenses/>. +*/ +#include <config.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <unistd.h> +#include <string.h> +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <stat-time.h> +#include <timespec.h> + +#define TEMPLATE "ckmtime.XXXXXX" +#define BILLION 1000000000 + +/* Some filesystems can slightly offset the timestamps of newly created files. + To compensate for it, tar testsuite waits at least 1 second before creating + next level of incremental backups. + + However, NFS mounts can offset the timestamps by bigger amounts. + + This program returns with success (0) if a newly created file is assigned + mtime matching the system time to the nearest second. +*/ +int +main (int argc, char **argv) +{ + int fd; + char name[sizeof(TEMPLATE)]; + struct stat st; + struct timespec ts, td; + double diff; + + gettime (&ts); + + strcpy (name, TEMPLATE); + umask (077); + fd = mkstemp (name); + assert (fd != -1); + unlink (name); + assert (fstat (fd, &st) == 0); + close (fd); + + td = timespec_sub (get_stat_mtime (&st), ts); + diff = td.tv_sec * BILLION + td.tv_nsec; + if (diff < 0) + diff = - diff; + if (diff / BILLION >= 1) + { + fprintf (stderr, "file timestamp unreliable\n"); + return 1; + } + return 0; +} |