/* Test for futimens Copyright (C) 2021 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see . */ #include #include #include #include #include #include #include #include static int temp_fd = -1; static char *testfile; /* struct timespec array with Y2038 threshold minus 2 and 1 seconds. */ const struct timespec t1[2] = { { 0x7FFFFFFE, 0 }, { 0x7FFFFFFF, 0 } }; /* struct timespec array with Y2038 threshold plus 1 and 2 seconds. */ const struct timespec t2[2] = { { 0x80000001ULL, 0 }, { 0x80000002ULL, 0 } }; /* struct timespec array around Y2038 threshold. */ const struct timespec t3[2] = { { 0x7FFFFFFE, 0 }, { 0x80000002ULL, 0 } }; #define PREPARE do_prepare static void do_prepare (int argc, char *argv[]) { temp_fd = create_temp_file ("futimensat", &testfile); TEST_VERIFY_EXIT (temp_fd > 0); } static int test_futimens_helper (const struct timespec *ts) { if (!support_path_support_time64 (testfile)) FAIL_UNSUPPORTED ("File %s does not support 64-bit timestamps", testfile); struct stat64 st; int result; time_t t; /* Check if we run on port with 32 bit time_t size */ if (__builtin_add_overflow (ts->tv_sec, 0, &t)) { printf("time_t overflow!"); return 0; } result = futimens (temp_fd, ts); TEST_VERIFY_EXIT (result == 0); xfstat (temp_fd, &st); /* Check if seconds for atime match */ TEST_COMPARE (st.st_atime, ts[0].tv_sec); /* Check if seconds for mtime match */ TEST_COMPARE (st.st_mtime, ts[1].tv_sec); return 0; } static int do_test (void) { test_futimens_helper (&t1[0]); test_futimens_helper (&t2[0]); test_futimens_helper (&t3[0]); return 0; } #include