From: Dmitry V. Levin Date: Wed, 15 Jul 2015 15:34:59 +0000 (+0000) Subject: tests: add utimensat.test X-Git-Tag: v4.11~241 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=78e48eb4304656307fb00ee6078c68a44404e852;p=strace tests: add utimensat.test * tests/utimensat.c: New file. * tests/utimensat.test: New test. * tests/Makefile.am (check_PROGRAMS): Add utimensat. (TESTS): Add utimensat.test. * configure.ac (AC_CHECK_FUNCS): Add utimensat. * tests/.gitignore: Add utimensat. --- diff --git a/configure.ac b/configure.ac index 6131ef1e..702258a8 100644 --- a/configure.ac +++ b/configure.ac @@ -256,6 +256,7 @@ AC_CHECK_FUNCS(m4_normalize([ stpcpy strerror strsignal + utimensat ])) AC_CHECK_HEADERS(m4_normalize([ asm/cachectl.h diff --git a/tests/.gitignore b/tests/.gitignore index 6326d40c..4e609c0c 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -51,6 +51,7 @@ umovestr umovestr2 unix-pair-send-recv utime +utimensat xattr xet_robust_list *.log diff --git a/tests/Makefile.am b/tests/Makefile.am index e4439171..1b078e01 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -64,6 +64,7 @@ check_PROGRAMS = \ umovestr2 \ unix-pair-send-recv \ utime \ + utimensat \ xattr \ xet_robust_list \ # end of check_PROGRAMS @@ -135,6 +136,7 @@ TESTS = \ uid32.test \ uio.test \ utime.test \ + utimensat.test \ xattr.test \ xet_robust_list.test \ count.test \ diff --git a/tests/utimensat.c b/tests/utimensat.c new file mode 100644 index 00000000..00b9636e --- /dev/null +++ b/tests/utimensat.c @@ -0,0 +1,67 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include + +#if defined HAVE_UTIMENSAT \ + && defined AT_FDCWD && defined AT_SYMLINK_NOFOLLOW \ + && defined UTIME_NOW && defined UTIME_OMIT + +static void +print_ts(const struct timespec *ts) +{ + printf("{%ju, %ju}", (uintmax_t) ts->tv_sec, (uintmax_t) ts->tv_nsec); +} + +int +main(void) +{ + struct timeval tv; + struct timespec ts[2]; + + if (gettimeofday(&tv, NULL)) + return 77; + + ts[0].tv_sec = tv.tv_sec; + ts[0].tv_nsec = tv.tv_usec; + ts[1].tv_sec = tv.tv_sec - 1; + ts[1].tv_nsec = tv.tv_usec + 1; + if (!utimensat(AT_FDCWD, "utimensat\nfilename", ts, + AT_SYMLINK_NOFOLLOW)) + return 77; + + #define PREFIX "utimensat(AT_FDCWD, \"utimensat\\nfilename\", [" + + printf(PREFIX); + print_ts(&ts[0]); + printf(", "); + print_ts(&ts[1]); + puts("], AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory)"); + + ts[0].tv_nsec = UTIME_NOW; + ts[1].tv_nsec = UTIME_OMIT; + if (!utimensat(AT_FDCWD, "utimensat\nfilename", ts, + AT_SYMLINK_NOFOLLOW)) + return 77; + + printf(PREFIX); + puts("UTIME_NOW, UTIME_OMIT], AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory)"); + puts("+++ exited with 0 +++"); + + return 0; +} + +#else + +int +main(void) +{ + return 77; +} + +#endif diff --git a/tests/utimensat.test b/tests/utimensat.test new file mode 100755 index 00000000..762c6a13 --- /dev/null +++ b/tests/utimensat.test @@ -0,0 +1,21 @@ +#!/bin/sh + +# Check decoding of utimensat syscall. + +. "${srcdir=.}/init.sh" + +run_prog > /dev/null +OUT="$LOG.out" +run_strace -e utimensat $args > "$OUT" + +check_prog grep +LC_ALL=C grep -x "utimensat(.*" "$LOG" > /dev/null || { + rm -f "$OUT" + skip_ 'test executable does not use utimensat syscall' +} + +match_diff "$OUT" "$LOG" + +rm -f "$OUT" + +exit 0