From 8b7be09c7b1165b30216ad4f18dfb24da24321f8 Mon Sep 17 00:00:00 2001 From: JingPiao Chen Date: Tue, 17 Jan 2017 15:55:58 +0800 Subject: [PATCH] Implement decoding of ustat syscall * configure.ac (AC_CHECK_HEADERS): Add ustat.h. * ustat.c: New file. * Makefile.am (strace_SOURCES): Add it. * linux/dummy.h: Remove sys_ustat. * tests/ustat.c: New file. * tests/ustat.test: New test. * tests/.gitignore: Add ustat. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add ustat.test. --- Makefile.am | 1 + configure.ac | 1 + linux/dummy.h | 1 - tests/.gitignore | 1 + tests/Makefile.am | 2 ++ tests/ustat.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++ tests/ustat.test | 6 ++++ ustat.c | 56 +++++++++++++++++++++++++++++++ 8 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 tests/ustat.c create mode 100755 tests/ustat.test create mode 100644 ustat.c diff --git a/Makefile.am b/Makefile.am index a7d70066..9b00481d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -250,6 +250,7 @@ strace_SOURCES = \ umount.c \ uname.c \ userfaultfd.c \ + ustat.c \ util.c \ utime.c \ utimes.c \ diff --git a/configure.ac b/configure.ac index 793d74ef..c439d5a9 100644 --- a/configure.ac +++ b/configure.ac @@ -394,6 +394,7 @@ AC_CHECK_HEADERS(m4_normalize([ sys/shm.h sys/signalfd.h sys/xattr.h + ustat.h ])) AC_CHECK_HEADERS([asm/sigcontext.h],,, [#include ]) diff --git a/linux/dummy.h b/linux/dummy.h index 0aee35b5..2758cfb2 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -156,7 +156,6 @@ #define sys_timerfd printargs #define sys_tuxcall printargs #define sys_ulimit printargs -#define sys_ustat printargs #define sys_vserver printargs /* deprecated */ diff --git a/tests/.gitignore b/tests/.gitignore index d06e3a51..fb063d61 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -360,6 +360,7 @@ unlink unlinkat unshare userfaultfd +ustat utime utimensat utimes diff --git a/tests/Makefile.am b/tests/Makefile.am index 135a694e..b06abb60 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -417,6 +417,7 @@ check_PROGRAMS = \ unlinkat \ unshare \ userfaultfd \ + ustat \ utime \ utimensat \ utimes \ @@ -806,6 +807,7 @@ DECODER_TESTS = \ unlinkat.test \ unshare.test \ userfaultfd.test \ + ustat.test \ utime.test \ utimensat.test \ utimes.test \ diff --git a/tests/ustat.c b/tests/ustat.c new file mode 100644 index 00000000..57bb29c2 --- /dev/null +++ b/tests/ustat.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2017 JingPiao Chen + * 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. + */ + +#include "tests.h" +#include + +#ifdef __NR_ustat + +# include +# include +# include +# include +# ifdef HAVE_USTAT_H +# include +# endif + +int +main(void) +{ + const kernel_ulong_t magic = (kernel_ulong_t) 0xfacefeedffffffff; + unsigned long long buf[4]; + unsigned int dev; + long rc; + +# ifdef HAVE_USTAT_H + struct ustat *const ust = tail_alloc(sizeof(*ust)); + struct stat st; + if (stat(".", &st)) + perror_msg_and_fail("stat"); + + dev = (unsigned int) st.st_dev; + rc = syscall(__NR_ustat, dev, ust); + if (rc) + printf("ustat(makedev(%u, %u), %p) = %s\n", + major(dev), minor(dev), ust, sprintrc(rc)); + else + printf("ustat(makedev(%u, %u)" + ", {f_tfree=%llu, f_tinode=%llu}) = 0\n", + major(dev), minor(dev), + zero_extend_signed_to_ull(ust->f_tfree), + zero_extend_signed_to_ull(ust->f_tinode)); +# endif /* HAVE_USTAT_H */ + + dev = (unsigned int) magic; + rc = syscall(__NR_ustat, magic, 0); + printf("ustat(makedev(%u, %u), NULL) = %s\n", + major(dev), minor(dev), sprintrc(rc)); + + rc = syscall(__NR_ustat, magic, buf); + printf("ustat(makedev(%u, %u), %p) = %s\n", + major(dev), minor(dev), buf, sprintrc(rc)); + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_ustat") + +#endif diff --git a/tests/ustat.test b/tests/ustat.test new file mode 100755 index 00000000..60a88e0a --- /dev/null +++ b/tests/ustat.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check ustat syscall decoding. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a33 diff --git a/ustat.c b/ustat.c new file mode 100644 index 00000000..76550632 --- /dev/null +++ b/ustat.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2017 JingPiao Chen + * 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. + */ + +#include "defs.h" +#ifdef HAVE_USTAT_H +# include DEF_MPERS_TYPE(struct_ustat) +# include +typedef struct ustat struct_ustat; +#endif /* HAVE_USTAT_H */ + +#include MPERS_DEFS + +SYS_FUNC(ustat) +{ + if (entering(tcp)) + print_dev_t((unsigned int) tcp->u_arg[0]); + else { + tprints(", "); +#ifdef HAVE_USTAT_H + struct_ustat ust; + + if (!umove_or_printaddr(tcp, tcp->u_arg[1], &ust)) + tprintf("{f_tfree=%llu, f_tinode=%llu}", + zero_extend_signed_to_ull(ust.f_tfree), + zero_extend_signed_to_ull(ust.f_tinode)); +#else /* !HAVE_USTAT_H */ + printaddr(tcp->u_arg[1]); +#endif /* HAVE_USTAT_H */ + } + + return 0; +} -- 2.40.0