1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/* 239bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Check decoding of utimensat syscall. 3d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 439bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org> 5d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * All rights reserved. 6d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Redistribution and use in source and binary forms, with or without 8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * modification, are permitted provided that the following conditions 9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * are met: 10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 1. Redistributions of source code must retain the above copyright 11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer. 12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer in the 14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * documentation and/or other materials provided with the distribution. 15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 3. The name of the author may not be used to endorse or promote products 16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * derived from this software without specific prior written permission. 17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */ 29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "tests.h" 31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <fcntl.h> 32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdint.h> 33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdio.h> 34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <sys/stat.h> 35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <sys/time.h> 3639bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <unistd.h> 3739bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <asm/unistd.h> 38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 3939bac055674d23770b9a724221b728e443196ea7Elliott Hughes#if defined __NR_utimensat && defined UTIME_NOW && defined UTIME_OMIT 40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void 42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_ts(const struct timespec *ts) 43d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 4439bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("{tv_sec=%lld, tv_nsec=%llu}", (long long) ts->tv_sec, 4539bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(ts->tv_nsec)); 4639bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_time_t_nsec(ts->tv_sec, 4739bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(ts->tv_nsec), 1); 4839bac055674d23770b9a724221b728e443196ea7Elliott Hughes} 4939bac055674d23770b9a724221b728e443196ea7Elliott Hughes 5039bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic const char *errstr; 5139bac055674d23770b9a724221b728e443196ea7Elliott Hughes 5239bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic long 5339bac055674d23770b9a724221b728e443196ea7Elliott Hughesk_utimensat(const kernel_ulong_t dirfd, 5439bac055674d23770b9a724221b728e443196ea7Elliott Hughes const kernel_ulong_t pathname, 5539bac055674d23770b9a724221b728e443196ea7Elliott Hughes const kernel_ulong_t times, 5639bac055674d23770b9a724221b728e443196ea7Elliott Hughes const kernel_ulong_t flags) 5739bac055674d23770b9a724221b728e443196ea7Elliott Hughes{ 5839bac055674d23770b9a724221b728e443196ea7Elliott Hughes long rc = syscall(__NR_utimensat, dirfd, pathname, times, flags); 5939bac055674d23770b9a724221b728e443196ea7Elliott Hughes errstr = sprintrc(rc); 6039bac055674d23770b9a724221b728e443196ea7Elliott Hughes return rc; 61d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 62d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 63d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesint 64d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesmain(void) 65d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 6639bac055674d23770b9a724221b728e443196ea7Elliott Hughes static const kernel_ulong_t bogus_fd = 6739bac055674d23770b9a724221b728e443196ea7Elliott Hughes (kernel_ulong_t) 0xbadc0deddeadbeef; 6839bac055674d23770b9a724221b728e443196ea7Elliott Hughes static const kernel_ulong_t kfdcwd = 6939bac055674d23770b9a724221b728e443196ea7Elliott Hughes (kernel_ulong_t) 0xdefaced00000000 | -100U; 7039bac055674d23770b9a724221b728e443196ea7Elliott Hughes static const char proto_fname[] = "utimensat\nfilename"; 7139bac055674d23770b9a724221b728e443196ea7Elliott Hughes static const char qname[] = "\"utimensat\\nfilename\""; 7239bac055674d23770b9a724221b728e443196ea7Elliott Hughes 7339bac055674d23770b9a724221b728e443196ea7Elliott Hughes char *const fname = tail_memdup(proto_fname, sizeof(proto_fname)); 7439bac055674d23770b9a724221b728e443196ea7Elliott Hughes const kernel_ulong_t kfname = (uintptr_t) fname; 7539bac055674d23770b9a724221b728e443196ea7Elliott Hughes struct timespec *const ts = tail_alloc(sizeof(*ts) * 2); 7639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 7739bac055674d23770b9a724221b728e443196ea7Elliott Hughes (void) close(0); 7839bac055674d23770b9a724221b728e443196ea7Elliott Hughes 7939bac055674d23770b9a724221b728e443196ea7Elliott Hughes /* dirfd */ 8039bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(0, kfname, 0, 0); 8139bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(0, %s, NULL, 0) = %s\n", qname, errstr); 8239bac055674d23770b9a724221b728e443196ea7Elliott Hughes 8339bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(bogus_fd, kfname, 0, 0); 8439bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(%d, %s, NULL, 0) = %s\n", 8539bac055674d23770b9a724221b728e443196ea7Elliott Hughes (int) bogus_fd, qname, errstr); 8639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 8739bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(-100U, kfname, 0, 0); 8839bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, NULL, 0) = %s\n", qname, errstr); 8939bac055674d23770b9a724221b728e443196ea7Elliott Hughes 9039bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, 0, 0); 9139bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, NULL, 0) = %s\n", qname, errstr); 9239bac055674d23770b9a724221b728e443196ea7Elliott Hughes 9339bac055674d23770b9a724221b728e443196ea7Elliott Hughes /* pathname */ 9439bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, 0, 0, 0); 9539bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, NULL, NULL, 0) = %s\n", errstr); 9639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 9739bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname + sizeof(proto_fname) - 1, 0, 0); 9839bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, \"\", NULL, 0) = %s\n", errstr); 9939bac055674d23770b9a724221b728e443196ea7Elliott Hughes 10039bac055674d23770b9a724221b728e443196ea7Elliott Hughes fname[sizeof(proto_fname) - 1] = '+'; 10139bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, 0, 0); 10239bac055674d23770b9a724221b728e443196ea7Elliott Hughes fname[sizeof(proto_fname) - 1] = '\0'; 10339bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %p, NULL, 0) = %s\n", fname, errstr); 10439bac055674d23770b9a724221b728e443196ea7Elliott Hughes 10539bac055674d23770b9a724221b728e443196ea7Elliott Hughes if (F8ILL_KULONG_SUPPORTED) { 10639bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, f8ill_ptr_to_kulong(fname), 0, 0); 10739bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %#jx, NULL, 0) = %s\n", 10839bac055674d23770b9a724221b728e443196ea7Elliott Hughes (uintmax_t) f8ill_ptr_to_kulong(fname), errstr); 10939bac055674d23770b9a724221b728e443196ea7Elliott Hughes } 11039bac055674d23770b9a724221b728e443196ea7Elliott Hughes 11139bac055674d23770b9a724221b728e443196ea7Elliott Hughes /* times */ 11239bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) (ts + 1), 0); 11339bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, %p, 0) = %s\n", 11439bac055674d23770b9a724221b728e443196ea7Elliott Hughes qname, ts + 1, errstr); 11539bac055674d23770b9a724221b728e443196ea7Elliott Hughes 11639bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) (ts + 2), 0); 11739bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, %p, 0)" 11839bac055674d23770b9a724221b728e443196ea7Elliott Hughes " = %s\n", qname, ts + 2, errstr); 11939bac055674d23770b9a724221b728e443196ea7Elliott Hughes 12039bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[0].tv_sec = 1492358706; 12139bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[0].tv_nsec = 123456789; 12239bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[1].tv_sec = 1492357068; 12339bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[1].tv_nsec = 234567890; 12439bac055674d23770b9a724221b728e443196ea7Elliott Hughes 12539bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100); 12639bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, [", qname); 12739bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_ts(&ts[0]); 12839bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf(", "); 12939bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_ts(&ts[1]); 13039bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr); 131d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 13239bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[0].tv_sec = -1; 13339bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[0].tv_nsec = 2000000000; 13439bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[1].tv_sec = (time_t) -0x100000001LL; 13539bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[1].tv_nsec = 2345678900U; 136d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 13739bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100); 13839bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, [", qname); 13939bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_ts(&ts[0]); 14039bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf(", "); 14139bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_ts(&ts[1]); 14239bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr); 143d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 14439bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[0].tv_sec = 0; 14539bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[0].tv_nsec = 0; 14639bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL; 14739bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[1].tv_nsec = 0; 148d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 14939bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100); 15039bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, [", qname); 15139bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_ts(&ts[0]); 15239bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf(", "); 15339bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_ts(&ts[1]); 15439bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr); 155d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 15639bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[0].tv_sec = 0xdeadbeefU; 15739bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[0].tv_nsec = 0xfacefeedU; 15839bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL; 15939bac055674d23770b9a724221b728e443196ea7Elliott Hughes ts[1].tv_nsec = (long) 0xbadc0dedfacefeedLL; 160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 16139bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100); 16239bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, [", qname); 163d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_ts(&ts[0]); 164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf(", "); 165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_ts(&ts[1]); 16639bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr); 167d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes ts[0].tv_nsec = UTIME_NOW; 169d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes ts[1].tv_nsec = UTIME_OMIT; 17039bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100); 17139bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, [UTIME_NOW, UTIME_OMIT]" 17239bac055674d23770b9a724221b728e443196ea7Elliott Hughes ", AT_SYMLINK_NOFOLLOW) = %s\n", qname, errstr); 17339bac055674d23770b9a724221b728e443196ea7Elliott Hughes 17439bac055674d23770b9a724221b728e443196ea7Elliott Hughes if (F8ILL_KULONG_SUPPORTED) { 17539bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, f8ill_ptr_to_kulong(ts), 0); 17639bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, %#jx, 0) = %s\n", 17739bac055674d23770b9a724221b728e443196ea7Elliott Hughes qname, (uintmax_t) f8ill_ptr_to_kulong(ts), errstr); 17839bac055674d23770b9a724221b728e443196ea7Elliott Hughes } 17939bac055674d23770b9a724221b728e443196ea7Elliott Hughes 18039bac055674d23770b9a724221b728e443196ea7Elliott Hughes /* flags */ 18139bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 18239bac055674d23770b9a724221b728e443196ea7Elliott Hughes (kernel_ulong_t) 0xdefaced00000200); 18339bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, [UTIME_NOW, UTIME_OMIT]" 18439bac055674d23770b9a724221b728e443196ea7Elliott Hughes ", AT_REMOVEDIR) = %s\n", 18539bac055674d23770b9a724221b728e443196ea7Elliott Hughes qname, errstr); 18639bac055674d23770b9a724221b728e443196ea7Elliott Hughes 18739bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 18839bac055674d23770b9a724221b728e443196ea7Elliott Hughes (kernel_ulong_t) 0xdefaced00000600); 18939bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, [UTIME_NOW, UTIME_OMIT]" 19039bac055674d23770b9a724221b728e443196ea7Elliott Hughes ", AT_REMOVEDIR|AT_SYMLINK_FOLLOW) = %s\n", 19139bac055674d23770b9a724221b728e443196ea7Elliott Hughes qname, errstr); 19239bac055674d23770b9a724221b728e443196ea7Elliott Hughes 19339bac055674d23770b9a724221b728e443196ea7Elliott Hughes k_utimensat(kfdcwd, kfname, (uintptr_t) ts, (kernel_ulong_t) -1ULL); 19439bac055674d23770b9a724221b728e443196ea7Elliott Hughes printf("utimensat(AT_FDCWD, %s, [UTIME_NOW, UTIME_OMIT]" 19539bac055674d23770b9a724221b728e443196ea7Elliott Hughes ", AT_SYMLINK_NOFOLLOW|AT_REMOVEDIR|AT_SYMLINK_FOLLOW" 19639bac055674d23770b9a724221b728e443196ea7Elliott Hughes "|AT_NO_AUTOMOUNT|AT_EMPTY_PATH|0xffffe0ff) = %s\n", 19739bac055674d23770b9a724221b728e443196ea7Elliott Hughes qname, errstr); 198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes puts("+++ exited with 0 +++"); 200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return 0; 201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 202d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 203d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#else 204d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 20539bac055674d23770b9a724221b728e443196ea7Elliott HughesSKIP_MAIN_UNDEFINED("__NR_utimensat && UTIME_NOW && UTIME_OMIT") 206d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 207d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif 208