1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
2d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Check decoding of futimesat 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 <asm/unistd.h>
32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef __NR_futimesat
34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <stdint.h>
36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <stdio.h>
37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <sys/time.h>
38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <unistd.h>
39d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
4039bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic void
4139bac055674d23770b9a724221b728e443196ea7Elliott Hughesprint_tv(const struct timeval *tv)
42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
4339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("{tv_sec=%lld, tv_usec=%llu}",
4439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       (long long) tv->tv_sec,
4539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tv->tv_usec));
4639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_time_t_usec(tv->tv_sec,
4739bac055674d23770b9a724221b728e443196ea7Elliott Hughes			  zero_extend_signed_to_ull(tv->tv_usec), 1);
4839bac055674d23770b9a724221b728e443196ea7Elliott Hughes}
49d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
5039bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic const char *errstr;
51d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
5239bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic long
5339bac055674d23770b9a724221b728e443196ea7Elliott Hughesk_futimesat(const kernel_ulong_t dirfd,
5439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	    const kernel_ulong_t pathname,
5539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	    const kernel_ulong_t times)
5639bac055674d23770b9a724221b728e443196ea7Elliott Hughes{
5739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	long rc = syscall(__NR_futimesat, dirfd, pathname, times);
5839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	errstr = sprintrc(rc);
5939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	return rc;
6039bac055674d23770b9a724221b728e443196ea7Elliott Hughes}
61d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
6239bac055674d23770b9a724221b728e443196ea7Elliott Hughesint
6339bac055674d23770b9a724221b728e443196ea7Elliott Hughesmain(void)
6439bac055674d23770b9a724221b728e443196ea7Elliott Hughes{
6539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	static const kernel_ulong_t bogus_fd =
6639bac055674d23770b9a724221b728e443196ea7Elliott Hughes		(kernel_ulong_t) 0xbadfaceddeadbeaf;
6739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	static const kernel_ulong_t kfdcwd =
6839bac055674d23770b9a724221b728e443196ea7Elliott Hughes		(kernel_ulong_t) 0xdefaced00000000 | -100U;
6939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	static const char proto_fname[] = "futimesat_sample";
7039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	static const char qname[] = "\"futimesat_sample\"";
71d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
7239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	char *const fname = tail_memdup(proto_fname, sizeof(proto_fname));
7339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	const kernel_ulong_t kfname = (uintptr_t) fname;
7439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	struct timeval *const tv = tail_alloc(sizeof(*tv) * 2);
75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	(void) close(0);
7739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
7839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	/* dirfd */
7939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(0, kfname, 0);
8039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(0, %s, NULL) = %s\n", qname, errstr);
8139bac055674d23770b9a724221b728e443196ea7Elliott Hughes
8239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(bogus_fd, kfname, 0);
8339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(%d, %s, NULL) = %s\n", (int) bogus_fd, qname, errstr);
8439bac055674d23770b9a724221b728e443196ea7Elliott Hughes
8539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(-100U, kfname, 0);
8639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, %s, NULL) = %s\n", qname, errstr);
8739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
8839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(kfdcwd, kfname, 0);
8939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, %s, NULL) = %s\n", qname, errstr);
9039bac055674d23770b9a724221b728e443196ea7Elliott Hughes
9139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	/* pathname */
9239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(kfdcwd, 0, 0);
9339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, NULL, NULL) = %s\n", errstr);
9439bac055674d23770b9a724221b728e443196ea7Elliott Hughes
9539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(kfdcwd, kfname + sizeof(proto_fname) - 1, 0);
9639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, \"\", NULL) = %s\n", errstr);
9739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
9839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	fname[sizeof(proto_fname) - 1] = '+';
9939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(kfdcwd, kfname, 0);
10039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	fname[sizeof(proto_fname) - 1] = '\0';
10139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, %p, NULL) = %s\n", fname, errstr);
10239bac055674d23770b9a724221b728e443196ea7Elliott Hughes
10339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	if (F8ILL_KULONG_SUPPORTED) {
10439bac055674d23770b9a724221b728e443196ea7Elliott Hughes		k_futimesat(kfdcwd, f8ill_ptr_to_kulong(fname), 0);
10539bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf("futimesat(AT_FDCWD, %#jx, NULL) = %s\n",
10639bac055674d23770b9a724221b728e443196ea7Elliott Hughes		       (uintmax_t) f8ill_ptr_to_kulong(fname), errstr);
10739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	}
10839bac055674d23770b9a724221b728e443196ea7Elliott Hughes
10939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	/* times */
11039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(kfdcwd, kfname, (uintptr_t) (tv + 1));
11139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, %s, %p) = %s\n",
11239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       qname, tv + 1, errstr);
11339bac055674d23770b9a724221b728e443196ea7Elliott Hughes
11439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(kfdcwd, kfname, (uintptr_t) (tv + 2));
11539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, %s, %p) = %s\n",
11639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       qname, tv + 2, errstr);
11739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
11839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_sec = 0xdeadbeefU;
11939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_usec = 0xfacefeedU;
12039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL;
12139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_usec = (long) 0xbadc0dedfacefeedLL;
12239bac055674d23770b9a724221b728e443196ea7Elliott Hughes
12339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
12439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, %s, [", qname);
12539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[0]);
12639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf(", ");
12739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[1]);
12839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("]) = %s\n", errstr);
12939bac055674d23770b9a724221b728e443196ea7Elliott Hughes
13039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_sec = 1492356708;
13139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_usec = 567891234;
13239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_sec = 1492357086;
13339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_usec = 678902345;
13439bac055674d23770b9a724221b728e443196ea7Elliott Hughes
13539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
13639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, %s, [", qname);
13739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[0]);
13839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf(", ");
13939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[1]);
14039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("]) = %s\n", errstr);
14139bac055674d23770b9a724221b728e443196ea7Elliott Hughes
14239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_usec = 567891;
14339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_usec = 678902;
14439bac055674d23770b9a724221b728e443196ea7Elliott Hughes
14539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
14639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futimesat(AT_FDCWD, %s, [", qname);
14739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[0]);
14839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf(", ");
14939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[1]);
15039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("]) = %s\n", errstr);
15139bac055674d23770b9a724221b728e443196ea7Elliott Hughes
15239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	if (F8ILL_KULONG_SUPPORTED) {
15339bac055674d23770b9a724221b728e443196ea7Elliott Hughes		k_futimesat(kfdcwd, kfname, f8ill_ptr_to_kulong(tv));
15439bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf("futimesat(AT_FDCWD, %s, %#jx) = %s\n",
15539bac055674d23770b9a724221b728e443196ea7Elliott Hughes		       qname, (uintmax_t) f8ill_ptr_to_kulong(tv), errstr);
15639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	}
157d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	puts("+++ exited with 0 +++");
159d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	return 0;
160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
161d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
162d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#else
163d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesSKIP_MAIN_UNDEFINED("__NR_futimesat")
165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
166d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
167