139bac055674d23770b9a724221b728e443196ea7Elliott Hughes/*
239bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Check decoding of utimes/osf_utimes syscall.
339bac055674d23770b9a724221b728e443196ea7Elliott Hughes *
439bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org>
539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * All rights reserved.
639bac055674d23770b9a724221b728e443196ea7Elliott Hughes *
739bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Redistribution and use in source and binary forms, with or without
839bac055674d23770b9a724221b728e443196ea7Elliott Hughes * modification, are permitted provided that the following conditions
939bac055674d23770b9a724221b728e443196ea7Elliott Hughes * are met:
1039bac055674d23770b9a724221b728e443196ea7Elliott Hughes * 1. Redistributions of source code must retain the above copyright
1139bac055674d23770b9a724221b728e443196ea7Elliott Hughes *    notice, this list of conditions and the following disclaimer.
1239bac055674d23770b9a724221b728e443196ea7Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright
1339bac055674d23770b9a724221b728e443196ea7Elliott Hughes *    notice, this list of conditions and the following disclaimer in the
1439bac055674d23770b9a724221b728e443196ea7Elliott Hughes *    documentation and/or other materials provided with the distribution.
1539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * 3. The name of the author may not be used to endorse or promote products
1639bac055674d23770b9a724221b728e443196ea7Elliott Hughes *    derived from this software without specific prior written permission.
1739bac055674d23770b9a724221b728e443196ea7Elliott Hughes *
1839bac055674d23770b9a724221b728e443196ea7Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1939bac055674d23770b9a724221b728e443196ea7Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2039bac055674d23770b9a724221b728e443196ea7Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2139bac055674d23770b9a724221b728e443196ea7Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2239bac055674d23770b9a724221b728e443196ea7Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2339bac055674d23770b9a724221b728e443196ea7Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2439bac055674d23770b9a724221b728e443196ea7Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2539bac055674d23770b9a724221b728e443196ea7Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2639bac055674d23770b9a724221b728e443196ea7Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2739bac055674d23770b9a724221b728e443196ea7Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2839bac055674d23770b9a724221b728e443196ea7Elliott Hughes */
2939bac055674d23770b9a724221b728e443196ea7Elliott Hughes
3039bac055674d23770b9a724221b728e443196ea7Elliott Hughes#ifndef TEST_SYSCALL_NR
3139bac055674d23770b9a724221b728e443196ea7Elliott Hughes# error TEST_SYSCALL_NR must be defined
3239bac055674d23770b9a724221b728e443196ea7Elliott Hughes#endif
3339bac055674d23770b9a724221b728e443196ea7Elliott Hughes
3439bac055674d23770b9a724221b728e443196ea7Elliott Hughes#ifndef TEST_SYSCALL_STR
3539bac055674d23770b9a724221b728e443196ea7Elliott Hughes# error TEST_SYSCALL_STR must be defined
3639bac055674d23770b9a724221b728e443196ea7Elliott Hughes#endif
3739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
3839bac055674d23770b9a724221b728e443196ea7Elliott Hughes#ifndef TEST_STRUCT
3939bac055674d23770b9a724221b728e443196ea7Elliott Hughes# error TEST_STRUCT must be defined
4039bac055674d23770b9a724221b728e443196ea7Elliott Hughes#endif
4139bac055674d23770b9a724221b728e443196ea7Elliott Hughes
4239bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <stdint.h>
4339bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <stdio.h>
4439bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <sys/time.h>
4539bac055674d23770b9a724221b728e443196ea7Elliott Hughes#include <unistd.h>
4639bac055674d23770b9a724221b728e443196ea7Elliott Hughes
4739bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic void
4839bac055674d23770b9a724221b728e443196ea7Elliott Hughesprint_tv(const TEST_STRUCT *const tv)
4939bac055674d23770b9a724221b728e443196ea7Elliott Hughes{
5039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("{tv_sec=%lld, tv_usec=%llu}",
5139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       (long long) tv->tv_sec,
5239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tv->tv_usec));
5339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_time_t_usec(tv->tv_sec,
5439bac055674d23770b9a724221b728e443196ea7Elliott Hughes			  zero_extend_signed_to_ull(tv->tv_usec), 1);
5539bac055674d23770b9a724221b728e443196ea7Elliott Hughes}
5639bac055674d23770b9a724221b728e443196ea7Elliott Hughes
5739bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic const char *errstr;
5839bac055674d23770b9a724221b728e443196ea7Elliott Hughes
5939bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic long
6039bac055674d23770b9a724221b728e443196ea7Elliott Hughesk_utimes(const kernel_ulong_t pathname, const kernel_ulong_t times)
6139bac055674d23770b9a724221b728e443196ea7Elliott Hughes{
6239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	long rc = syscall(TEST_SYSCALL_NR, pathname, times);
6339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	errstr = sprintrc(rc);
6439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	return rc;
6539bac055674d23770b9a724221b728e443196ea7Elliott Hughes}
6639bac055674d23770b9a724221b728e443196ea7Elliott Hughes
6739bac055674d23770b9a724221b728e443196ea7Elliott Hughesint
6839bac055674d23770b9a724221b728e443196ea7Elliott Hughesmain(void)
6939bac055674d23770b9a724221b728e443196ea7Elliott Hughes{
7039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	static const char proto_fname[] = TEST_SYSCALL_STR "_sample";
7139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	static const char qname[] = "\"" TEST_SYSCALL_STR "_sample\"";
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	TEST_STRUCT *const tv = tail_alloc(sizeof(*tv) * 2);
7639bac055674d23770b9a724221b728e443196ea7Elliott Hughes
7739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	/* pathname */
7839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_utimes(0, 0);
7939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("%s(NULL, NULL) = %s\n", TEST_SYSCALL_STR, errstr);
8039bac055674d23770b9a724221b728e443196ea7Elliott Hughes
8139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_utimes(kfname + sizeof(proto_fname) - 1, 0);
8239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("%s(\"\", NULL) = %s\n", TEST_SYSCALL_STR, errstr);
8339bac055674d23770b9a724221b728e443196ea7Elliott Hughes
8439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_utimes(kfname, 0);
8539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("%s(%s, NULL) = %s\n", TEST_SYSCALL_STR, qname, errstr);
8639bac055674d23770b9a724221b728e443196ea7Elliott Hughes
8739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	fname[sizeof(proto_fname) - 1] = '+';
8839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_utimes(kfname, 0);
8939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	fname[sizeof(proto_fname) - 1] = '\0';
9039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("%s(%p, NULL) = %s\n", TEST_SYSCALL_STR, fname, errstr);
9139bac055674d23770b9a724221b728e443196ea7Elliott Hughes
9239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	if (F8ILL_KULONG_SUPPORTED) {
9339bac055674d23770b9a724221b728e443196ea7Elliott Hughes		k_utimes(f8ill_ptr_to_kulong(fname), 0);
9439bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf("%s(%#jx, NULL) = %s\n", TEST_SYSCALL_STR,
9539bac055674d23770b9a724221b728e443196ea7Elliott Hughes		       (uintmax_t) f8ill_ptr_to_kulong(fname), errstr);
9639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	}
9739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
9839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	/* times */
9939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_utimes(kfname, (uintptr_t) (tv + 1));
10039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("%s(%s, %p) = %s\n", TEST_SYSCALL_STR,
10139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       qname, tv + 1, errstr);
10239bac055674d23770b9a724221b728e443196ea7Elliott Hughes
10339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_utimes(kfname, (uintptr_t) (tv + 2));
10439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("%s(%s, %p) = %s\n", TEST_SYSCALL_STR,
10539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       qname, tv + 2, errstr);
10639bac055674d23770b9a724221b728e443196ea7Elliott Hughes
10739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_sec = 0xdeadbeefU;
10839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_usec = 0xfacefeedU;
10939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL;
11039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_usec = (long) 0xbadc0dedfacefeedLL;
11139bac055674d23770b9a724221b728e443196ea7Elliott Hughes
11239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_utimes(kfname, (uintptr_t) tv);
11339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("%s(%s, [", TEST_SYSCALL_STR, qname);
11439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[0]);
11539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf(", ");
11639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[1]);
11739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("]) = %s\n", errstr);
11839bac055674d23770b9a724221b728e443196ea7Elliott Hughes
11939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_sec = 1492358607;
12039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_usec = 1000000;
12139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_sec = 1492356078;
12239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_usec = 1000001;
12339bac055674d23770b9a724221b728e443196ea7Elliott Hughes
12439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_utimes(kfname, (uintptr_t) tv);
12539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("%s(%s, [", TEST_SYSCALL_STR, qname);
12639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[0]);
12739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf(", ");
12839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[1]);
12939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("]) = %s\n", errstr);
13039bac055674d23770b9a724221b728e443196ea7Elliott Hughes
13139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[0].tv_usec = 345678;
13239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tv[1].tv_usec = 456789;
13339bac055674d23770b9a724221b728e443196ea7Elliott Hughes
13439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	k_utimes(kfname, (uintptr_t) tv);
13539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("%s(%s, [", TEST_SYSCALL_STR, qname);
13639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[0]);
13739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf(", ");
13839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	print_tv(&tv[1]);
13939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("]) = %s\n", errstr);
14039bac055674d23770b9a724221b728e443196ea7Elliott Hughes
14139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	if (F8ILL_KULONG_SUPPORTED) {
14239bac055674d23770b9a724221b728e443196ea7Elliott Hughes		k_utimes(kfname, f8ill_ptr_to_kulong(tv));
14339bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf("%s(%s, %#jx) = %s\n", TEST_SYSCALL_STR,
14439bac055674d23770b9a724221b728e443196ea7Elliott Hughes		       qname, (uintmax_t) f8ill_ptr_to_kulong(tv), errstr);
14539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	}
14639bac055674d23770b9a724221b728e443196ea7Elliott Hughes
14739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	puts("+++ exited with 0 +++");
14839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	return 0;
14939bac055674d23770b9a724221b728e443196ea7Elliott Hughes}
150