* ustat.c: New file. * Makefile.am (strace_SOURCES): Add it. * linux/dummy.h: Remove. * 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.
Co-authored-by: Dmitry V. Levin <l...@altlinux.org> --- Sorry, I can not write test the case when ustat succeeds. travis-CI result: 3c3 < ustat(makedev(8, 1), {f_tfree=4294967295, f_tinode=4294967295}) = -1 EFAULT (Bad address) > ustat(makedev(8, 1), NULL) = -1 EFAULT (Bad address) Thank you. Makefile.am | 1 + linux/dummy.h | 1 - tests/.gitignore | 1 + tests/Makefile.am | 2 ++ tests/ustat.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/ustat.test | 21 +++++++++++++++++ ustat.c | 49 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 142 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 0e157db..37c9ff7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -247,6 +247,7 @@ strace_SOURCES = \ umount.c \ uname.c \ userfaultfd.c \ + ustat.c \ util.c \ utime.c \ utimes.c \ diff --git a/linux/dummy.h b/linux/dummy.h index 0aee35b..2758cfb 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 3270176..49061b2 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -351,6 +351,7 @@ unlink unlinkat unshare userfaultfd +ustat utime utimensat utimes diff --git a/tests/Makefile.am b/tests/Makefile.am index 57dd8b9..ceeccd8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -414,6 +414,7 @@ check_PROGRAMS = \ utime \ utimensat \ utimes \ + ustat \ vfork-f \ vhangup \ vmsplice \ @@ -796,6 +797,7 @@ DECODER_TESTS = \ utime.test \ utimensat.test \ utimes.test \ + ustat.test \ vhangup.test \ vmsplice.test \ wait4.test \ diff --git a/tests/ustat.c b/tests/ustat.c new file mode 100644 index 0000000..ffc69b4 --- /dev/null +++ b/tests/ustat.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017 JingPiao Chen <chenjingp...@gmail.com> + * 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 <asm/unistd.h> + +#ifdef __NR_ustat + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <ustat.h> + +int +main(int argc, char *argv[]) +{ + unsigned int ma = atoi(argv[1]); + unsigned int mi = atoi(argv[2]); + dev_t dev = makedev(ma, mi); + kernel_ulong_t magic = (kernel_ulong_t) 0xfacefeedffffffff; + struct ustat *ust = tail_alloc(sizeof(*ust)); + + long rc = syscall(__NR_ustat, magic, 0); + printf("ustat(makedev(%u, %u), NULL) = %s\n", major((unsigned int) magic), + minor((unsigned int) magic), sprintrc(rc)); + + rc = syscall(__NR_ustat, magic, ust); + printf("ustat(makedev(%u, %u), %p) = %s\n", major((unsigned int) magic), + minor((unsigned int) magic), ust, sprintrc(rc)); + + rc = syscall(__NR_ustat, dev, ust); + printf("ustat(makedev(%u, %u), {f_tfree=%llu, f_tinode=%llu}) = %s\n", + ma, mi, zero_extend_signed_to_ull(ust->f_tfree), + zero_extend_signed_to_ull(ust->f_tinode), 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 0000000..e7f2867 --- /dev/null +++ b/tests/ustat.test @@ -0,0 +1,21 @@ +#!/bin/sh + +# Check ustat syscall decoding. + +. "${srcdir=.}/init.sh" + +get_fs_dev_t() +{ + name=$(ls /proc/fs/ext4/ | awk '{print $1}') + fs_info=$(grep "$name" /proc/diskstats) + major=$(echo $fs_info | awk '{print $1}') + minor=$(echo $fs_info | awk '{print $2}') +} + +check_prog awk +check_prog grep +get_fs_dev_t +run_prog ./ustat $major $minor > /dev/null +run_strace -a25 -eustat ./ustat $major $minor > "$EXP" +match_diff "$LOG" "$EXP" +rm -f "$EXP" "$LOG" diff --git a/ustat.c b/ustat.c new file mode 100644 index 0000000..988692c --- /dev/null +++ b/ustat.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017 JingPiao Chen <chenjingp...@gmail.com> + * 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" +#include DEF_MPERS_TYPE(struct_ustat) +#include <ustat.h> +typedef struct ustat struct_ustat; +#include MPERS_DEFS + +SYS_FUNC(ustat) +{ + struct_ustat ust; + + if (entering(tcp)) + print_dev_t((unsigned int) tcp->u_arg[0]); + else { + tprints(", "); + 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)); + } + + return 0; +} -- 2.7.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel