diff options
author | Zubin Mithra <zubin.mithra@gmail.com> | 2014-06-04 08:30:41 +0530 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2014-06-04 16:28:04 +0000 |
commit | 64aa1b1e2dd14c5259bd349270f4d1e29d4fb421 (patch) | |
tree | c13761b26cbab8f78c3d657723f8c60db4c10d0d | |
parent | 327102c7f6a8d70a32f83280f897fc02da0a8810 (diff) | |
download | strace-64aa1b1e2dd14c5259bd349270f4d1e29d4fb421.tar.gz |
Decode paths associated with file descriptors returned by syscalls
* defs.h (RVAL_FD): New macro.
(RVAL_MASK, RVAL_STR, RVAL_NONE): Update.
* desc.c (sys_dup, sys_delete_module): New functions.
(do_dup2, decode_open, sys_creat): Change return value to RVAL_FD.
* linux/dummy.h (sys_delete_module, sys_dup): Remove.
* linux/syscall.h (sys_delete_module, sys_dup): New prototypes.
* syscall.c (trace_syscall_exiting): Handle RVAL_FD.
Signed-off-by: Zubin Mithra <zubin.mithra@gmail.com>
-rw-r--r-- | defs.h | 7 | ||||
-rw-r--r-- | desc.c | 11 | ||||
-rw-r--r-- | file.c | 10 | ||||
-rw-r--r-- | linux/dummy.h | 2 | ||||
-rw-r--r-- | linux/syscall.h | 2 | ||||
-rw-r--r-- | syscall.c | 8 |
6 files changed, 32 insertions, 8 deletions
@@ -533,10 +533,11 @@ extern const struct xlat whence_codes[]; # endif # define RVAL_LUDECIMAL 007 /* long unsigned decimal format */ #endif -#define RVAL_MASK 007 /* mask for these values */ +#define RVAL_FD 010 /* file descriptor */ +#define RVAL_MASK 017 /* mask for these values */ -#define RVAL_STR 010 /* Print `auxstr' field after return val */ -#define RVAL_NONE 020 /* Print nothing */ +#define RVAL_STR 020 /* Print `auxstr' field after return val */ +#define RVAL_NONE 040 /* Print nothing */ #define TRACE_FILE 001 /* Trace file-related syscalls. */ #define TRACE_IPC 002 /* Trace IPC-related syscalls. */ @@ -265,6 +265,15 @@ sys_close(struct tcb *tcp) return 0; } +int +sys_dup(struct tcb *tcp) +{ + if (entering(tcp)) { + printfd(tcp, tcp->u_arg[0]); + } + return RVAL_FD; +} + static int do_dup2(struct tcb *tcp, int flags_arg) { @@ -277,7 +286,7 @@ do_dup2(struct tcb *tcp, int flags_arg) printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); } } - return 0; + return RVAL_FD; } int @@ -303,7 +303,7 @@ decode_open(struct tcb *tcp, int offset) tprintf(", %#lo", tcp->u_arg[offset + 2]); } } - return 0; + return RVAL_FD; } int @@ -312,6 +312,12 @@ sys_open(struct tcb *tcp) return decode_open(tcp, 0); } +int sys_delete_module(struct tcb *tcp) +{ + decode_open(tcp, 0); + return RVAL_DECIMAL; +} + int sys_openat(struct tcb *tcp) { @@ -348,7 +354,7 @@ sys_creat(struct tcb *tcp) printpath(tcp, tcp->u_arg[0]); tprintf(", %#lo", tcp->u_arg[1]); } - return 0; + return RVAL_FD; } #include "xlat/access_flags.h" diff --git a/linux/dummy.h b/linux/dummy.h index 4f3e9202..60686667 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -57,8 +57,6 @@ #define sys_acct sys_chdir #define sys_chroot sys_chdir #define sys_clock_getres sys_clock_gettime -#define sys_delete_module sys_open -#define sys_dup sys_close #define sys_fchdir sys_close #define sys_fdatasync sys_close #define sys_fsync sys_close diff --git a/linux/syscall.h b/linux/syscall.h index 19432976..38aa4bd7 100644 --- a/linux/syscall.h +++ b/linux/syscall.h @@ -52,6 +52,8 @@ int sys_close(); int sys_connect(); int sys_creat(); int sys_create_module(); +int sys_delete_module(); +int sys_dup(); int sys_dup2(); int sys_dup3(); int sys_epoll_create(); @@ -2688,6 +2688,14 @@ trace_syscall_exiting(struct tcb *tcp) case RVAL_DECIMAL: tprintf("= %ld", tcp->u_rval); break; + case RVAL_FD: + if (show_fd_path) { + tprints("= "); + printfd(tcp, tcp->u_rval); + } + else + tprintf("= %ld", tcp->u_rval); + break; #if defined(LINUX_MIPSN32) || defined(X32) /* case RVAL_LHEX: |