Browse Source

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>
Bernhard Reutner-Fischer 15 years ago
parent
commit
903cfa151a
2 changed files with 36 additions and 20 deletions
  1. 1 0
      test/time/Makefile.in
  2. 35 20
      test/time/tst-futimens1.c

+ 1 - 0
test/time/Makefile.in

@@ -9,3 +9,4 @@ TESTS_DISABLED += tst-ftime_l
 endif
 
 CFLAGS_tst-strptime2 := -std=c99
+DODIFF_futimens1 := 1

+ 35 - 20
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;
+				}
 			}
 		}
 	}