1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
/*
* Check decoding of futimesat syscall.
*
* Copyright (c) 2015-2018 Dmitry V. Levin <ldv@altlinux.org>
* All rights reserved.
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "tests.h"
#include <asm/unistd.h>
#ifdef __NR_futimesat
# include <stdint.h>
# include <stdio.h>
# include <sys/time.h>
# include <unistd.h>
static void
print_tv(const struct timeval *tv)
{
printf("{tv_sec=%lld, tv_usec=%llu}",
(long long) tv->tv_sec,
zero_extend_signed_to_ull(tv->tv_usec));
print_time_t_usec(tv->tv_sec,
zero_extend_signed_to_ull(tv->tv_usec), 1);
}
static const char *errstr;
static long
k_futimesat(const kernel_ulong_t dirfd,
const kernel_ulong_t pathname,
const kernel_ulong_t times)
{
long rc = syscall(__NR_futimesat, dirfd, pathname, times);
errstr = sprintrc(rc);
return rc;
}
int
main(void)
{
static const kernel_ulong_t bogus_fd =
(kernel_ulong_t) 0xbadfaceddeadbeaf;
static const kernel_ulong_t kfdcwd =
(kernel_ulong_t) 0xdefaced00000000 | -100U;
static const char proto_fname[] = "futimesat_sample";
static const char qname[] = "\"futimesat_sample\"";
char *const fname = tail_memdup(proto_fname, sizeof(proto_fname));
const kernel_ulong_t kfname = (uintptr_t) fname;
struct timeval *const tv = tail_alloc(sizeof(*tv) * 2);
(void) close(0);
/* dirfd */
k_futimesat(0, kfname, 0);
printf("futimesat(0, %s, NULL) = %s\n", qname, errstr);
k_futimesat(bogus_fd, kfname, 0);
printf("futimesat(%d, %s, NULL) = %s\n", (int) bogus_fd, qname, errstr);
k_futimesat(-100U, kfname, 0);
printf("futimesat(AT_FDCWD, %s, NULL) = %s\n", qname, errstr);
k_futimesat(kfdcwd, kfname, 0);
printf("futimesat(AT_FDCWD, %s, NULL) = %s\n", qname, errstr);
/* pathname */
k_futimesat(kfdcwd, 0, 0);
printf("futimesat(AT_FDCWD, NULL, NULL) = %s\n", errstr);
k_futimesat(kfdcwd, kfname + sizeof(proto_fname) - 1, 0);
printf("futimesat(AT_FDCWD, \"\", NULL) = %s\n", errstr);
fname[sizeof(proto_fname) - 1] = '+';
k_futimesat(kfdcwd, kfname, 0);
fname[sizeof(proto_fname) - 1] = '\0';
printf("futimesat(AT_FDCWD, %p, NULL) = %s\n", fname, errstr);
if (F8ILL_KULONG_SUPPORTED) {
k_futimesat(kfdcwd, f8ill_ptr_to_kulong(fname), 0);
printf("futimesat(AT_FDCWD, %#jx, NULL) = %s\n",
(uintmax_t) f8ill_ptr_to_kulong(fname), errstr);
}
/* times */
k_futimesat(kfdcwd, kfname, (uintptr_t) (tv + 1));
printf("futimesat(AT_FDCWD, %s, %p) = %s\n",
qname, tv + 1, errstr);
k_futimesat(kfdcwd, kfname, (uintptr_t) (tv + 2));
printf("futimesat(AT_FDCWD, %s, %p) = %s\n",
qname, tv + 2, errstr);
tv[0].tv_sec = 0xdeadbeefU;
tv[0].tv_usec = 0xfacefeedU;
tv[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL;
tv[1].tv_usec = (suseconds_t) 0xbadc0dedfacefeedLL;
k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
printf("futimesat(AT_FDCWD, %s, [", qname);
print_tv(&tv[0]);
printf(", ");
print_tv(&tv[1]);
printf("]) = %s\n", errstr);
tv[0].tv_sec = 1492356708;
tv[0].tv_usec = 567891234;
tv[1].tv_sec = 1492357086;
tv[1].tv_usec = 678902345;
k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
printf("futimesat(AT_FDCWD, %s, [", qname);
print_tv(&tv[0]);
printf(", ");
print_tv(&tv[1]);
printf("]) = %s\n", errstr);
tv[0].tv_usec = 567891;
tv[1].tv_usec = 678902;
k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
printf("futimesat(AT_FDCWD, %s, [", qname);
print_tv(&tv[0]);
printf(", ");
print_tv(&tv[1]);
printf("]) = %s\n", errstr);
if (F8ILL_KULONG_SUPPORTED) {
k_futimesat(kfdcwd, kfname, f8ill_ptr_to_kulong(tv));
printf("futimesat(AT_FDCWD, %s, %#jx) = %s\n",
qname, (uintmax_t) f8ill_ptr_to_kulong(tv), errstr);
}
puts("+++ exited with 0 +++");
return 0;
}
#else
SKIP_MAIN_UNDEFINED("__NR_futimesat")
#endif
|