From 903cfa151a16d1722c53829663002ee78670a961 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Thu, 26 Nov 2009 18:52:29 +0100 Subject: try to probe if stat.t_mtim.tv_nsec is available Do not treat tv_nsec mismatches as errors on filesystems without support for it. Signed-off-by: Bernhard Reutner-Fischer --- test/time/Makefile.in | 1 + test/time/tst-futimens1.c | 55 ++++++++++++++++++++++++++++++----------------- 2 files changed, 36 insertions(+), 20 deletions(-) (limited to 'test') diff --git a/test/time/Makefile.in b/test/time/Makefile.in index 65d814a71..05f73a45d 100644 --- a/test/time/Makefile.in +++ b/test/time/Makefile.in @@ -9,3 +9,4 @@ TESTS_DISABLED += tst-ftime_l endif CFLAGS_tst-strptime2 := -std=c99 +DODIFF_futimens1 := 1 diff --git a/test/time/tst-futimens1.c b/test/time/tst-futimens1.c index a452de2c7..ed7f44feb 100644 --- a/test/time/tst-futimens1.c +++ b/test/time/tst-futimens1.c @@ -1,5 +1,5 @@ /* vi: set sw=4 ts=4: */ -/* testcase +/* testcase for futimens(2) * Copyright (C) 2009 Bernhard Reutner-Fischer * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */ @@ -30,7 +30,16 @@ int do_test(int argc, char **argv) { char *name; int i, errors; errors = argc - argc + 0; - + unsigned has_stat_nsec = 0; + { + struct stat probe; + /* Let's attempt an educated guess if this filesystem supports + * nanosecond mtime. */ + if ((!stat(".", &probe)) && probe.st_mtim.tv_nsec) + has_stat_nsec = 1; + else if ((!stat(argv[0], &probe)) && probe.st_mtim.tv_nsec) + has_stat_nsec = 1; + } for (i=0; i < (int) (sizeof(tests)/sizeof(tests[0])); ++i) { int err, fd; struct stat sb; @@ -44,19 +53,18 @@ int do_test(int argc, char **argv) { err = futimens(fd, tests[i].ts); if ((errno && !err) || (!errno && err)) { err = errno; - printf("%s: FAILED test %d (errno and return value disagree)\n", - argv[0], i); + printf("FAILED test %d (errno and return value disagree)\n", i); ++errors; } else err = errno; if (err != tests[i].err) { - printf("%s: FAILED test %d (expected errno %d, got %d)\n", - argv[0], i, tests[i].err, err); + printf("FAILED test %d (expected errno %d, got %d)\n", + i, tests[i].err, err); ++errors; continue; } if (stat(name, &sb) < 0) { - printf("%s: FAILED test %d (verification)\n", argv[0], i); + printf("FAILED test %d (verification)\n", i); ++errors; continue; } else { @@ -65,20 +73,27 @@ int do_test(int argc, char **argv) { tests[i].ts[1].tv_sec != sb.st_mtim.tv_sec || tests[i].ts[1].tv_nsec != sb.st_mtim.tv_nsec; if (wrong) { - ++errors; - if (tests[i].ts[0].tv_sec != sb.st_atim.tv_sec) - printf("%s: FAILED test %d (access time, sec: expected %ld, got %ld)\n", - argv[0], i, tests[i].ts[0].tv_sec, sb.st_atim.tv_sec); - if (tests[i].ts[0].tv_nsec != sb.st_atim.tv_nsec) - printf("%s: FAILED test %d (access time, nsec: expected %ld, got %ld)\n", - argv[0], i, tests[i].ts[0].tv_nsec, sb.st_atim.tv_nsec); + if (tests[i].ts[0].tv_sec != sb.st_atim.tv_sec) { + printf("FAILED test %d (access time, sec: expected %ld, got %ld)\n", + i, tests[i].ts[0].tv_sec, sb.st_atim.tv_sec); + ++errors; + } + if (tests[i].ts[0].tv_nsec != sb.st_atim.tv_nsec) { + printf("FAILED test %d (access time, nsec: expected %ld, got %ld)\n", + i, tests[i].ts[0].tv_nsec, sb.st_atim.tv_nsec); + errors += has_stat_nsec; + } - if (tests[i].ts[1].tv_sec != sb.st_mtim.tv_sec) - printf("%s: FAILED test %d (modification time, sec: expected %ld, got %ld)\n", - argv[0], i, tests[i].ts[1].tv_sec, sb.st_mtim.tv_sec); - if (tests[i].ts[1].tv_nsec != sb.st_mtim.tv_nsec) - printf("%s: FAILED test %d (modification time, nsec: expected %ld, got %ld)\n", - argv[0], i, tests[i].ts[1].tv_nsec, sb.st_mtim.tv_nsec); + if (tests[i].ts[1].tv_sec != sb.st_mtim.tv_sec) { + printf("FAILED test %d (modification time, sec: expected %ld, got %ld)\n", + i, tests[i].ts[1].tv_sec, sb.st_mtim.tv_sec); + ++errors; + } + if (tests[i].ts[1].tv_nsec != sb.st_mtim.tv_nsec) { + printf("FAILED test %d (modification time, nsec: expected %ld, got %ld)\n", + i, tests[i].ts[1].tv_nsec, sb.st_mtim.tv_nsec); + errors += has_stat_nsec; + } } } } -- cgit v1.2.3