summaryrefslogtreecommitdiff
path: root/tests/mknodat.c
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2016-08-03 14:05:39 +0000
committerDmitry V. Levin <ldv@altlinux.org>2016-08-03 23:27:03 +0000
commit8d3743868ebce77fe03c5b1ff6435baa8d084293 (patch)
tree8db51ede8eade4de468618ac2a84c7c714ef2c5a /tests/mknodat.c
parentc416ff5ffa63dd502e525b36c4614a5e4b7b05f0 (diff)
downloadstrace-8d3743868ebce77fe03c5b1ff6435baa8d084293.tar.gz
Fix printing of mode_t, umode_t, and umask types
Print numeric umode_t type using %#03ho format. Print return value of umask syscall using %#03lo format. When printing symbolic mode_t type, always print lower 9 bits, and print the numeric part using %#03o format. * defs.h (sprintmode): Remove. (print_symbolic_mode_t, print_numeric_umode_t, print_numeric_long_umask): New prototypes. * printmode.c (sprintmode): Remove. (print_symbolic_mode_t, print_numeric_umode_t, print_numeric_long_umask): New functions. * chmod.c (decode_chmod): Use print_numeric_umode_t. * ipc_msg.c (SYS_FUNC(msgget)): Likewise. * ipc_msgctl.c (print_msqid_ds): Likewise. * ipc_sem.c (SYS_FUNC(semget)): Likewise. * ipc_shm.c (SYS_FUNC(shmget)): Likewise. * ipc_shmctl.c (print_shmid_ds): Likewise. * mq.c (SYS_FUNC(mq_open)): Likewise. * open.c (decode_open, SYS_FUNC(creat)): Likewise. * umask.c (SYS_FUNC(umask)): Likewise. * mknod.c (decode_mknod): Use print_symbolic_mode_t. * printstat.h (DO_PRINTSTAT): Likewise. * syscall.c (trace_syscall_exiting): Use print_numeric_long_umask. * tests/umode_t.c: New file. * tests/Makefile.am (EXTRA_DIST): Add it. * tests/creat.c: Rewrite as a thin wrapper around umode_t.c * tests/mkdir.c: Likewise. * tests/mkdirat.c: Likewise. * tests/mknod.c: Extend test coverage of mknod syscall. * tests/mknodat.c: Extend test coverage of mknodat syscall. * tests/umask.c: Extend test coverage of umask syscall. * tests/creat.test: Update the value specified for strace -a parameter. * tests/mkdir.test: Likewise. * tests/mkdirat.test: Likewise. * tests/mknodat.test: Likewise.
Diffstat (limited to 'tests/mknodat.c')
-rw-r--r--tests/mknodat.c63
1 files changed, 51 insertions, 12 deletions
diff --git a/tests/mknodat.c b/tests/mknodat.c
index 2cdc47cf8..991bc4b2f 100644
--- a/tests/mknodat.c
+++ b/tests/mknodat.c
@@ -14,21 +14,60 @@
# include <sys/mkdev.h>
# endif
+static const char sample[] = "mknodat_sample";
+static const long int fd = (long int) 0xdeadbeefffffffff;
+
+static long
+call_mknodat(unsigned short mode, unsigned long dev)
+{
+ unsigned long lmode = (unsigned long) 0xffffffffffff0000 | mode;
+ return syscall(__NR_mknodat, fd, sample, lmode, dev);
+}
+
int
main(void)
{
- static const char sample[] = "mknokat_sample";
- const long int fd = (long int) 0xdeadbeefffffffff;
- long rc = syscall(__NR_mknodat, fd, sample, S_IFREG|0600, 0);
- printf("mknodat(%d, \"%s\", S_IFREG|0600) = %ld %s (%m)\n",
- (int) fd, sample, rc, errno2name());
-
- const unsigned long dev =
- (unsigned long) 0xdeadbeef00000000 | makedev(1, 7);
-
- rc = syscall(__NR_mknodat, fd, sample, S_IFCHR | 0400, dev);
- printf("mknodat(%d, \"%s\", S_IFCHR|0400, makedev(1, 7)) = %ld %s (%m)\n",
- (int) fd, sample, rc, errno2name());
+ unsigned long dev = (unsigned long) 0xdeadbeefbadc0ded;
+
+ long rc = call_mknodat(0, dev);
+ printf("mknodat(-1, \"%s\", 000) = %ld %s (%m)\n",
+ sample, rc, errno2name());
+
+ rc = call_mknodat(0xffff, dev);
+ printf("mknodat(-1, \"%s\", %#03ho) = %ld %s (%m)\n",
+ sample, (unsigned short) -1, rc, errno2name());
+
+ rc = call_mknodat(S_IFREG, 0);
+ printf("mknodat(-1, \"%s\", S_IFREG|000) = %ld %s (%m)\n",
+ sample, rc, errno2name());
+
+ rc = call_mknodat(S_IFDIR | 06, 0);
+ printf("mknodat(-1, \"%s\", S_IFDIR|006) = %ld %s (%m)\n",
+ sample, rc, errno2name());
+
+ rc = call_mknodat(S_IFLNK | 060, 0);
+ printf("mknodat(-1, \"%s\", S_IFLNK|060) = %ld %s (%m)\n",
+ sample, rc, errno2name());
+
+ rc = call_mknodat(S_IFIFO | 0600, 0);
+ printf("mknodat(-1, \"%s\", S_IFIFO|0600) = %ld %s (%m)\n",
+ sample, rc, errno2name());
+
+ dev = (unsigned long) 0xdeadbeef00000000 | makedev(1, 7);
+
+ rc = call_mknodat(S_IFCHR | 024, dev);
+ printf("mknodat(-1, \"%s\", S_IFCHR|024, makedev(1, 7)) = %ld %s (%m)\n",
+ sample, rc, errno2name());
+
+ const unsigned short mode = (0xffff & ~S_IFMT) | S_IFBLK;
+ dev = (unsigned long) 0xdeadbeefbadc0ded;
+
+ rc = call_mknodat(mode, dev);
+ printf("mknodat(-1, \"%s\", S_IFBLK|S_ISUID|S_ISGID|S_ISVTX|%#03ho"
+ ", makedev(%u, %u)) = %ld %s (%m)\n",
+ sample, mode & ~(S_IFMT|S_ISUID|S_ISGID|S_ISVTX),
+ major((unsigned) dev), minor((unsigned) dev),
+ rc, errno2name());
puts("+++ exited with 0 +++");
return 0;