diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2009-11-26 18:52:29 +0100 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2009-11-26 19:00:35 +0100 |
commit | 903cfa151a16d1722c53829663002ee78670a961 (patch) | |
tree | 2523e0cafffd3ca6d33a2bd988e51a24cc3bb248 /test/time/tst-futimens1.c | |
parent | e5e2672ada188e1287702a00cfacdda06be08c11 (diff) |
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 <rep.dot.nop@gmail.com>
Diffstat (limited to 'test/time/tst-futimens1.c')
-rw-r--r-- | test/time/tst-futimens1.c | 55 |
1 files changed, 35 insertions, 20 deletions
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 <uClibc@uClibc.org> * 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; + } } } } |