/* Test of <stat-time.h>.
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007-2008 Free Software Foundation, Inc.
- This program is free software; you can redistribute it and/or modify
+ 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, or (at your option)
- any later version.
+ 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,
but WITHOUT ANY WARRANTY; without even the implied warranty of
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, write to the Free Software Foundation,
- Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by James Youngman <jay@gnu.org>, 2007. */
#include <sys/stat.h>
#include <unistd.h>
-#define ASSERT(condition) if (!(condition)) abort ()
+#define ASSERT(expr) \
+ do \
+ { \
+ if (!(expr)) \
+ { \
+ fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
+ fflush (stderr); \
+ abort (); \
+ } \
+ } \
+ while (0)
enum { NFILES = 4 };
static void
+force_unlink (const char *filename)
+{
+ /* This chmod is necessary on mingw, where unlink() of a read-only file
+ fails with EPERM. */
+ chmod (filename, 0600);
+ unlink (filename);
+}
+
+static void
cleanup (int sig)
{
/* Remove temporary files. */
- unlink ("t-stt-stamp1");
- unlink ("t-stt-testfile");
- unlink ("t-stt-stamp2");
- unlink ("t-stt-renamed");
- unlink ("t-stt-stamp3");
+ force_unlink ("t-stt-stamp1");
+ force_unlink ("t-stt-testfile");
+ force_unlink ("t-stt-stamp2");
+ force_unlink ("t-stt-renamed");
+ force_unlink ("t-stt-stamp3");
if (sig != 0)
_exit (1);
sleep (2);
create_file ("t-stt-stamp2");
sleep (2);
- ASSERT (rename ("t-stt-testfile", "t-stt-renamed") == 0);
+ ASSERT (chmod ("t-stt-testfile", 0400) == 0);
sleep (2);
create_file ("t-stt-stamp3");
do_stat ("t-stt-stamp1", &statinfo[0]);
- do_stat ("t-stt-renamed", &statinfo[1]);
+ do_stat ("t-stt-testfile", &statinfo[1]);
do_stat ("t-stt-stamp2", &statinfo[2]);
do_stat ("t-stt-stamp3", &statinfo[3]);
/* Use the struct stat fields directly. */
ASSERT (statinfo[0].st_mtime < statinfo[2].st_mtime); /* mtime(stamp1) < mtime(stamp2) */
ASSERT (statinfo[2].st_mtime < statinfo[3].st_mtime); /* mtime(stamp2) < mtime(stamp3) */
- ASSERT (statinfo[2].st_mtime < statinfo[1].st_ctime); /* mtime(stamp2) < ctime(renamed) */
/* Now check the result of the access functions. */
ASSERT (modtimes[0].tv_sec < modtimes[2].tv_sec); /* mtime(stamp1) < mtime(stamp2) */
ts = get_stat_mtime (&statinfo[i]);
ASSERT (ts.tv_sec == statinfo[i].st_mtime);
}
+}
+
+static void
+test_ctime (const struct stat *statinfo)
+{
+ ASSERT (statinfo[2].st_mtime < statinfo[1].st_ctime); /* mtime(stamp2) < ctime(renamed) */
ASSERT (statinfo[2].st_mtime < statinfo[1].st_ctime); /* mtime(stamp2) < ctime(renamed) */
}
signal (SIGTERM, cleanup);
#endif
+ cleanup (0);
prepare_test (statinfo, modtimes);
test_mtime (statinfo, modtimes);
+ /* Skip the ctime tests on native Windows platforms, because there st_ctime
+ is either the same as st_mtime (plus or minus an offset) or set to the
+ file _creation_ time, and is not influenced by rename or chmod. */
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+ test_ctime (statinfo);
+#endif
test_birthtime (statinfo, modtimes, birthtimes);
cleanup (0);