X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-utimens-common.h;h=5bd4679665553818195603da35bb6a8ef582a8e2;hb=a77413333408e54b8d6c4e19918098794cef4b4b;hp=6c404cc5d251be5bf4c22ee85effda150f4d5bac;hpb=78d218ff8a7c36feaa55c58abdcec8270654e6f1;p=gnulib.git diff --git a/tests/test-utimens-common.h b/tests/test-utimens-common.h index 6c404cc5d..5bd467966 100644 --- a/tests/test-utimens-common.h +++ b/tests/test-utimens-common.h @@ -1,9 +1,9 @@ /* Test of file timestamp modification functions. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009-2013 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 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -19,14 +19,18 @@ #ifndef GL_TEST_UTIMENS_COMMON # define GL_TEST_UTIMENS_COMMON -#include -#include -#include -#include +# include +# include +# include +# include -#include "stat-time.h" -#include "timespec.h" -#include "utimecmp.h" +/* Gnulib modules. */ +# include "stat-time.h" +# include "timespec.h" +# include "utimecmp.h" + +/* Gnulib test header. */ +# include "nap.h" enum { BILLION = 1000 * 1000 * 1000, @@ -44,27 +48,30 @@ enum { : 0) }; -/* Sleep long enough to cross a timestamp quantization boundary on - most known systems with subsecond timestamp resolution. For - example, ext4 has a quantization of 10 milliseconds, but a - resolution of 1 nanosecond. Likewise, NTFS has a quantization as - slow as 15.25 milliseconds, but a resolution of 100 nanoseconds. - This is necessary on systems where creat or utimens with NULL - rounds down to the quantization boundary, but where gettime and - hence utimensat can inject timestamps between quantization - boundaries. By ensuring we cross a boundary, we are less likely to - confuse utimecmp for two times that would round to the same - quantization boundary but are distinct based on resolution. */ -static void -nap (void) +# if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ +/* Skip ctime tests on native Windows, since it is either a copy of + mtime or birth time (depending on the file system), rather than a + properly tracked change time. */ +# define check_ctime 0 +# else +# define check_ctime 1 +# endif + +/* Compare two st_ctime values. Return -1, 0 or 1, respectively + when A's st_ctime is smaller than, equal to or greater than B's. */ +static int +ctime_compare (struct stat const *a, struct stat const *b) { - /* Systems that lack usleep also lack subsecond timestamps, and have - a quantization boundary equal to the resolution. Our usage of - utimecmp allows equality, so no need to waste 980 milliseconds - if the replacement usleep rounds to 1 second. */ -#if HAVE_USLEEP - usleep (20 * 1000); /* 20 milliseconds. */ -#endif + if (a->st_ctime < b->st_ctime) + return -1; + else if (b->st_ctime < a->st_ctime) + return 1; + else if (get_stat_ctime_ns (a) < get_stat_ctime_ns (b)) + return -1; + else if (get_stat_ctime_ns (b) < get_stat_ctime_ns (a)) + return 1; + else + return 0; } #endif /* GL_TEST_UTIMENS_COMMON */