From: Dmitry V. Levin Date: Mon, 17 Apr 2017 00:17:00 +0000 (+0000) Subject: tests: parametrize utimes.c X-Git-Tag: v4.17~81 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=39fcedfd24aa9e8e9999aafb38467e5892843394;p=strace tests: parametrize utimes.c * tests/xutimes.c: New file, based on utimes.c. * tests/utimes.c [__NR_utimes] (TEST_SYSCALL_NR, TEST_SYSCALL_STR, TEST_STRUCT): New macros. [__NR_utimes]: Replace all the rest with include "xutimes.c". * tests/Makefile.am (EXTRA_DIST): Add xutimes.c. --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 739d3f1b..7ae4646e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -667,6 +667,7 @@ EXTRA_DIST = gen_tests.in gen_tests.sh init.sh run.sh match.awk \ xstatfs64.c \ xstatfsx.c \ xstatx.c \ + xutimes.c \ $(TESTS) ksysent.h: $(srcdir)/ksysent.sed diff --git a/tests/utimes.c b/tests/utimes.c index 1bea0074..4bef1a61 100644 --- a/tests/utimes.c +++ b/tests/utimes.c @@ -32,99 +32,10 @@ #ifdef __NR_utimes -# include -# include -# include -# include - -static void -print_tv(const struct timeval *tv) -{ - printf("{tv_sec=%ju, tv_usec=%ju}", - (uintmax_t) tv->tv_sec, (uintmax_t) tv->tv_usec); -} - -static const char *errstr; - -static long -k_utimes(const kernel_ulong_t pathname, const kernel_ulong_t times) -{ - long rc = syscall(__NR_utimes, pathname, times); - errstr = sprintrc(rc); - return rc; -} - -int -main(void) -{ - static const char proto_fname[] = "utimes_sample"; - static const char qname[] = "\"utimes_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); - - /* pathname */ - k_utimes(0, 0); - printf("utimes(NULL, NULL) = %s\n", errstr); - - k_utimes(kfname + sizeof(proto_fname) - 1, 0); - printf("utimes(\"\", NULL) = %s\n", errstr); - - k_utimes(kfname, 0); - printf("utimes(%s, NULL) = %s\n", qname, errstr); - - fname[sizeof(proto_fname) - 1] = '+'; - k_utimes(kfname, 0); - fname[sizeof(proto_fname) - 1] = '\0'; - printf("utimes(%p, NULL) = %s\n", fname, errstr); - - if (F8ILL_KULONG_SUPPORTED) { - k_utimes(f8ill_ptr_to_kulong(fname), 0); - printf("utimes(%#jx, NULL) = %s\n", - (uintmax_t) f8ill_ptr_to_kulong(fname), errstr); - } - - /* times */ - k_utimes(kfname, (uintptr_t) (tv + 1)); - printf("utimes(%s, %p) = %s\n", - qname, tv + 1, errstr); - - k_utimes(kfname, (uintptr_t) (tv + 2)); - printf("utimes(%s, %p) = %s\n", - qname, tv + 2, errstr); - - tv[0].tv_sec = 1492358607; - tv[0].tv_usec = 345678912; - tv[1].tv_sec = 1492356078; - tv[1].tv_usec = 456789023; - - k_utimes(kfname, (uintptr_t) tv); - printf("utimes(%s, [", qname); - print_tv(&tv[0]); - printf(", "); - print_tv(&tv[1]); - printf("]) = %s\n", errstr); - - tv[0].tv_usec = 345678; - tv[1].tv_usec = 456789; - - k_utimes(kfname, (uintptr_t) tv); - printf("utimes(%s, [", qname); - print_tv(&tv[0]); - printf(", "); - print_tv(&tv[1]); - printf("]) = %s\n", errstr); - - if (F8ILL_KULONG_SUPPORTED) { - k_utimes(kfname, f8ill_ptr_to_kulong(tv)); - printf("utimes(%s, %#jx) = %s\n", - qname, (uintmax_t) f8ill_ptr_to_kulong(tv), errstr); - } - - puts("+++ exited with 0 +++"); - return 0; -} +# define TEST_SYSCALL_NR __NR_utimes +# define TEST_SYSCALL_STR "utimes" +# define TEST_STRUCT struct timeval +# include "xutimes.c" #else diff --git a/tests/xutimes.c b/tests/xutimes.c new file mode 100644 index 00000000..251fb2e4 --- /dev/null +++ b/tests/xutimes.c @@ -0,0 +1,134 @@ +/* + * Check decoding of utimes/osf_utimes syscall. + * + * Copyright (c) 2015-2017 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TEST_SYSCALL_NR +# error TEST_SYSCALL_NR must be defined +#endif + +#ifndef TEST_SYSCALL_STR +# error TEST_SYSCALL_STR must be defined +#endif + +#ifndef TEST_STRUCT +# error TEST_STRUCT must be defined +#endif + +#include +#include +#include +#include + +static void +print_tv(const TEST_STRUCT *const tv) +{ + printf("{tv_sec=%ju, tv_usec=%ju}", + (uintmax_t) tv->tv_sec, (uintmax_t) tv->tv_usec); +} + +static const char *errstr; + +static long +k_utimes(const kernel_ulong_t pathname, const kernel_ulong_t times) +{ + long rc = syscall(TEST_SYSCALL_NR, pathname, times); + errstr = sprintrc(rc); + return rc; +} + +int +main(void) +{ + static const char proto_fname[] = TEST_SYSCALL_STR "_sample"; + static const char qname[] = "\"" TEST_SYSCALL_STR "_sample\""; + + char *const fname = tail_memdup(proto_fname, sizeof(proto_fname)); + const kernel_ulong_t kfname = (uintptr_t) fname; + TEST_STRUCT *const tv = tail_alloc(sizeof(*tv) * 2); + + /* pathname */ + k_utimes(0, 0); + printf("%s(NULL, NULL) = %s\n", TEST_SYSCALL_STR, errstr); + + k_utimes(kfname + sizeof(proto_fname) - 1, 0); + printf("%s(\"\", NULL) = %s\n", TEST_SYSCALL_STR, errstr); + + k_utimes(kfname, 0); + printf("%s(%s, NULL) = %s\n", TEST_SYSCALL_STR, qname, errstr); + + fname[sizeof(proto_fname) - 1] = '+'; + k_utimes(kfname, 0); + fname[sizeof(proto_fname) - 1] = '\0'; + printf("%s(%p, NULL) = %s\n", TEST_SYSCALL_STR, fname, errstr); + + if (F8ILL_KULONG_SUPPORTED) { + k_utimes(f8ill_ptr_to_kulong(fname), 0); + printf("%s(%#jx, NULL) = %s\n", TEST_SYSCALL_STR, + (uintmax_t) f8ill_ptr_to_kulong(fname), errstr); + } + + /* times */ + k_utimes(kfname, (uintptr_t) (tv + 1)); + printf("%s(%s, %p) = %s\n", TEST_SYSCALL_STR, + qname, tv + 1, errstr); + + k_utimes(kfname, (uintptr_t) (tv + 2)); + printf("%s(%s, %p) = %s\n", TEST_SYSCALL_STR, + qname, tv + 2, errstr); + + tv[0].tv_sec = 1492358607; + tv[0].tv_usec = 345678912; + tv[1].tv_sec = 1492356078; + tv[1].tv_usec = 456789023; + + k_utimes(kfname, (uintptr_t) tv); + printf("%s(%s, [", TEST_SYSCALL_STR, qname); + print_tv(&tv[0]); + printf(", "); + print_tv(&tv[1]); + printf("]) = %s\n", errstr); + + tv[0].tv_usec = 345678; + tv[1].tv_usec = 456789; + + k_utimes(kfname, (uintptr_t) tv); + printf("%s(%s, [", TEST_SYSCALL_STR, qname); + print_tv(&tv[0]); + printf(", "); + print_tv(&tv[1]); + printf("]) = %s\n", errstr); + + if (F8ILL_KULONG_SUPPORTED) { + k_utimes(kfname, f8ill_ptr_to_kulong(tv)); + printf("%s(%s, %#jx) = %s\n", TEST_SYSCALL_STR, + qname, (uintmax_t) f8ill_ptr_to_kulong(tv), errstr); + } + + puts("+++ exited with 0 +++"); + return 0; +}