From dc0cf937e50ea1abb7ce439a011531ddb3bbda02 Mon Sep 17 00:00:00 2001 From: Martin Pärtel Date: Sat, 10 May 2014 12:37:38 +0100 Subject: Use lutimes() when utimensat() unavailable (#6). --- tests/utimens_nofollow.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'tests/utimens_nofollow.c') diff --git a/tests/utimens_nofollow.c b/tests/utimens_nofollow.c index 8316b26..02fcf58 100644 --- a/tests/utimens_nofollow.c +++ b/tests/utimens_nofollow.c @@ -1,45 +1,46 @@ -#ifndef __APPLE__ - -#define _BSD_SOURCE /* For atoll */ +#define _BSD_SOURCE /* For atoll and lutimes */ +#include #include #include #include #include #include +#include #include #include int main(int argc, char* argv[]) { - struct timespec times[2]; - if (argc != 6) { fprintf(stderr, "Usage: utimens_nofollow path atime atime_nsec mtime mtime_nsec\n"); return 1; } +#ifdef HAVE_UTIMENSAT + struct timespec times[2]; times[0].tv_sec = (time_t)atoll(argv[2]); times[0].tv_nsec = atoll(argv[3]); times[1].tv_sec = (time_t)atoll(argv[4]); times[1].tv_nsec = atoll(argv[5]); - if (utimensat(AT_FDCWD, argv[1], times, AT_SYMLINK_NOFOLLOW) == -1) { perror("failed to utimensat the given path"); return 2; } +#elif HAVE_LUTIMES + struct timeval times[2]; + times[0].tv_sec = (time_t)atoll(argv[2]); + times[0].tv_usec = (suseconds_t)atoll(argv[3]) / 1000; + times[1].tv_sec = (time_t)atoll(argv[4]); + times[1].tv_usec = (suseconds_t)atoll(argv[5]) / 1000; + if (lutimes(argv[1], times) == -1) { + perror("failed to lutimes the given path"); + return 2; + } +#else +#error "No symlink-compatible utime* function available." +#endif return 0; } - -#else /* #ifndef __APPLE__ */ - -#include -int main() -{ - fprintf("utimensat() unavailable on this platform\n"); - return 1; -} - -#endif /* #ifndef __APPLE__ */ -- cgit v1.2.3