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

* defs.h (RVAL_FD): New macro.
* defs.h (RVAL_MASK, RVAL_STR, RVAL_NONE): Macro values modified.
* desc.c (sys_dup): New function.
* desc.c (sys_delete_module): New function.
* desc.c (sys_open, sys_dup2, sys_dup3, sys_creat): Modified to return
  RVAL_FD
* linux/dummy.h (sys_delete_module, sys_dup): Macros removed
* linux/syscall.h (sys_close, sys_delete_module, sys_dup): New prototype
* syscall.c (trace_syscall_exiting): Modified to handle RVAL_FD return
  value

Signed-off-by: Zubin Mithra <zubin.mit...@gmail.com>
---
 defs.h          |  7 ++++---
 desc.c          | 15 +++++++++++++--
 file.c          |  8 +++++++-
 linux/dummy.h   |  2 --
 linux/syscall.h |  2 ++
 syscall.c       |  8 ++++++++
 6 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/defs.h b/defs.h
index c862de5..99493b3 100644
--- a/defs.h
+++ b/defs.h
@@ -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 descriptors */
+#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. */
diff --git a/desc.c b/desc.c
index 0c9a817..5bb1b21 100644
--- a/desc.c
+++ b/desc.c
@@ -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)
 {
@@ -283,13 +292,15 @@ do_dup2(struct tcb *tcp, int flags_arg)
 int
 sys_dup2(struct tcb *tcp)
 {
-       return do_dup2(tcp, -1);
+       do_dup2(tcp, -1);
+       return RVAL_FD;
 }
 
 int
 sys_dup3(struct tcb *tcp)
 {
-       return do_dup2(tcp, 2);
+       do_dup2(tcp, 2);
+       return RVAL_FD;
 }
 
 #if defined(ALPHA)
diff --git a/file.c b/file.c
index c322242..92a5873 100644
--- a/file.c
+++ b/file.c
@@ -309,6 +309,12 @@ decode_open(struct tcb *tcp, int offset)
 int
 sys_open(struct tcb *tcp)
 {
+       decode_open(tcp, 0);
+       return RVAL_FD;
+}
+
+int sys_delete_module(struct tcb *tcp)
+{
        return decode_open(tcp, 0);
 }
 
@@ -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 4f3e920..6068666 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 1943297..38aa4bd 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();
diff --git a/syscall.c b/syscall.c
index c95eb6c..b0ad47e 100644
--- a/syscall.c
+++ b/syscall.c
@@ -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:
-- 
1.8.4


------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their 
applications. Written by three acclaimed leaders in the field, 
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to