From: Zubin Mithra <zubin.mit...@gmail.com>

* Type of `show_fd_path` changed from `bool` to `unsigned int` to
  support the `-yy` flag.
* util.c (returns_fd): New function that checks if the tcb refers
  to a function that returns a file descriptor.
* (trace_syscall_exiting): Use returns_fd to determine whether
  tcp->u_rval is a file descriptor.

Signed-off-by: Zubin Mithra <zubin.mit...@gmail.com>
---
 defs.h    |  3 ++-
 strace.c  |  4 ++--
 syscall.c |  7 ++++++-
 util.c    | 13 +++++++++++++
 4 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/defs.h b/defs.h
index 4e06a92..5381e60 100644
--- a/defs.h
+++ b/defs.h
@@ -550,7 +550,7 @@ extern bool Tflag;
 extern bool iflag;
 extern unsigned int qflag;
 extern bool not_failing_only;
-extern bool show_fd_path;
+extern unsigned int show_fd_path;
 extern bool hide_log_until_execve;
 /* are we filtering traces based on paths? */
 extern const char **paths_selected;
@@ -625,6 +625,7 @@ extern long getrval2(struct tcb *);
  */
 extern int setbpt(struct tcb *);
 extern int clearbpt(struct tcb *);
+extern bool returns_fd(struct tcb *);
 
 extern const char *signame(int);
 extern void pathtrace_select(const char *);
diff --git a/strace.c b/strace.c
index 8a49340..4e7868d 100644
--- a/strace.c
+++ b/strace.c
@@ -124,7 +124,7 @@ static int post_attach_sigstop = TCB_IGNORE_ONE_SIGSTOP;
 bool not_failing_only = 0;
 
 /* Show path associated with fd arguments */
-bool show_fd_path = 0;
+unsigned int show_fd_path = 0;
 
 static bool detach_on_execve = 0;
 /* Are we "strace PROG" and need to skip detach on first execve? */
@@ -1706,7 +1706,7 @@ init(int argc, char *argv[])
                        xflag++;
                        break;
                case 'y':
-                       show_fd_path = 1;
+                       show_fd_path++;
                        break;
                case 'v':
                        qualify("abbrev=none");
diff --git a/syscall.c b/syscall.c
index 28bdb66..d059130 100644
--- a/syscall.c
+++ b/syscall.c
@@ -2669,7 +2669,12 @@ trace_syscall_exiting(struct tcb *tcp)
                                tprintf("= %lu", tcp->u_rval);
                                break;
                        case RVAL_DECIMAL:
-                               tprintf("= %ld", tcp->u_rval);
+                               if ( show_fd_path == 2 && returns_fd(tcp) ) {
+                                       tprintf("= ");
+                                       printfd(tcp, tcp->u_rval);
+                               }
+                               else
+                                       tprintf("= %ld", tcp->u_rval);
                                break;
 #if defined(LINUX_MIPSN32) || defined(X32)
                        /*
diff --git a/util.c b/util.c
index ff18b87..b1f1e90 100644
--- a/util.c
+++ b/util.c
@@ -1549,3 +1549,16 @@ clearbpt(struct tcb *tcp)
        tcp->flags &= ~TCB_BPTSET;
        return 0;
 }
+
+bool
+returns_fd(struct tcb *tcp)
+{
+       if ( tcp->s_ent->sys_func == sys_open   ||
+            tcp->s_ent->sys_func == sys_openat ||
+            tcp->s_ent->sys_func == sys_creat  ||
+            tcp->s_ent->sys_func == sys_dup    ||
+            tcp->s_ent->sys_func == sys_dup2   ||
+            tcp->s_ent->sys_func == sys_dup3 )
+               return 1;
+       return 0;
+}
-- 
1.8.4


------------------------------------------------------------------------------
The best possible search technologies are now affordable for all companies.
Download your FREE open source Enterprise Search Engine today!
Our experts will assist you in its installation for $59/mo, no commitment.
Test it for FREE on our Cloud platform anytime!
http://pubads.g.doubleclick.net/gampad/clk?id=145328191&iu=/4140/ostg.clktrk
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to