From: Eugene Syromyatnikov Date: Mon, 29 Jan 2018 17:50:09 +0000 (+0100) Subject: tests: check printing of block/char device numbers in -yy mode X-Git-Tag: v4.22~133 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=08b4355d9c16bda623c9c053b02b6c58e4462c09;p=strace tests: check printing of block/char device numbers in -yy mode * tests/dev-yy.c: New file. * tests/pure_executables.list: Add dev-yy. * tests/.gitignore: Likewise. * tests/gen_tests.in (dev-yy): New test. --- diff --git a/tests/.gitignore b/tests/.gitignore index 430adca4..dd0c8e12 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -40,6 +40,7 @@ copy_file_range count-f creat delete_module +dev-yy dup dup2 dup3 diff --git a/tests/dev-yy.c b/tests/dev-yy.c new file mode 100644 index 00000000..58a1e414 --- /dev/null +++ b/tests/dev-yy.c @@ -0,0 +1,101 @@ +/* + * Check printing of character/block device numbers in -yy mode. + * + * Copyright (c) 2018 The strace developers. + * 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 +#include + +#include + +#include + +#include + +#if defined __NR_openat && defined O_PATH + +int +main(void) +{ + static const struct { + const char *path; + unsigned int major; + unsigned int minor; + bool blk; + bool optional; + } checks[] = { + { "/dev/zero", 1, 5, false, false }, + { "/dev/full", 1, 7, false, false }, + { "/dev/sda", 8, 0, true, true }, + }; + + for (unsigned int i = 0; i < ARRAY_SIZE(checks); i++) { + /* + * We can't have nice things here and call openat() directly as + * some libcs (yes, musl, I'm looking at you now) are too + * frivolous in passing flags to the kernel. + */ + long fd = syscall(__NR_openat, AT_FDCWD, checks[i].path, + O_RDONLY|O_PATH); + + printf("openat(AT_FDCWD, \"%s\", O_RDONLY|O_PATH) = %s", + checks[i].path, sprintrc(fd)); + if (fd >= 0) + printf("<%s<%s %u:%u>>", + checks[i].path, + checks[i].blk ? "block" : "char", + checks[i].major, checks[i].minor); + puts(""); + + if (fd < 0) { + if (checks[i].optional) + continue; + else + perror_msg_and_fail("openat(\"%s\")", + checks[i].path); + } + + int rc = fsync(fd); + + printf("fsync(%ld<%s<%s %u:%u>>) = %s\n", + fd, checks[i].path, checks[i].blk ? "block" : "char", + checks[i].major, checks[i].minor, sprintrc(rc)); + + close(fd); + } + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_openat && O_PATH") + +#endif diff --git a/tests/gen_tests.in b/tests/gen_tests.in index 6215e3dd..55cc98de 100644 --- a/tests/gen_tests.in +++ b/tests/gen_tests.in @@ -49,6 +49,7 @@ clock_xettime -a36 -e trace=clock_getres,clock_gettime,clock_settime copy_file_range creat -a20 delete_module -a23 +dev-yy -a30 -e trace=openat,fsync -P "/dev/full" -P "/dev/zero" -P "/dev/sda" -yy dup -a8 dup2 -a13 dup3 -a24 diff --git a/tests/pure_executables.list b/tests/pure_executables.list index bf5f694c..18b5f1d8 100755 --- a/tests/pure_executables.list +++ b/tests/pure_executables.list @@ -23,6 +23,7 @@ clock_xettime copy_file_range creat delete_module +dev-yy dup dup2 dup3