diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2016-08-03 14:05:39 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2016-08-03 23:27:03 +0000 |
commit | 8d3743868ebce77fe03c5b1ff6435baa8d084293 (patch) | |
tree | 8db51ede8eade4de468618ac2a84c7c714ef2c5a /tests/mknodat.c | |
parent | c416ff5ffa63dd502e525b36c4614a5e4b7b05f0 (diff) | |
download | strace-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.c | 63 |
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; |