diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2018-01-29 18:50:09 +0100 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2018-03-01 01:00:24 +0000 |
commit | 08b4355d9c16bda623c9c053b02b6c58e4462c09 (patch) | |
tree | c0d64f004cfb00f71dffba49c0c1798b3a978ea5 | |
parent | 48feeb3723d8d5e6230f447a4b8fd5f0a6fef164 (diff) | |
download | strace-08b4355d9c16bda623c9c053b02b6c58e4462c09.tar.gz |
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.
-rw-r--r-- | tests/.gitignore | 1 | ||||
-rw-r--r-- | tests/dev-yy.c | 101 | ||||
-rw-r--r-- | tests/gen_tests.in | 1 | ||||
-rwxr-xr-x | tests/pure_executables.list | 1 |
4 files changed, 104 insertions, 0 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index 430adca4e..dd0c8e12a 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 000000000..58a1e414f --- /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 <stdio.h> +#include <unistd.h> + +#include <asm/unistd.h> + +#include <linux/fcntl.h> + +#include <sys/sysmacros.h> + +#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 6215e3dd5..55cc98def 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 bf5f694ce..18b5f1d8b 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 |