I was tracing an app that was trying to do dnotify calls, but this was
hard to deduce at first because all I got was:
fcntl(11, 0x402 /* F_??? */, 0x8000000e) = -1 EINVAL (Invalid argument)
Which made me think that the code was doing something broken (since the
fields we not being decoded).  Once I found out 0x402 is actually a valid
fcntl command for Linux, I took a stab at fixing strace.

F_DUPFD_CLOEXEC is just like F_DUPFD.  The LEASE funcs are easy becuase
we can reuse lockfcmds.  F_NOTIFY required a little more work as it has
its own array of unique flags.

Now I get a nicely decoded trace:
fcntl(11, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_DELETE|DN_MULTISHOT) = -1 EINVAL 
(Invalid argument)

Signed-off-by: Mike Frysinger <vap...@gentoo.org>
---
 desc.c |   70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/desc.c b/desc.c
index 139b1e6..7c441b7 100644
--- a/desc.c
+++ b/desc.c
@@ -148,6 +148,18 @@ static const struct xlat fcntlcmds[] = {
 #ifdef F_UNSHARE
        { F_UNSHARE,    "F_UNSHARE"     },
 #endif
+#ifdef F_SETLEASE
+       { F_SETLEASE,   "F_SETLEASE"    },
+#endif
+#ifdef F_GETLEASE
+       { F_GETLEASE,   "F_GETLEASE"    },
+#endif
+#ifdef F_NOTIFY
+       { F_NOTIFY,     "F_NOTIFY"      },
+#endif
+#ifdef F_DUPFD_CLOEXEC
+       { F_DUPFD_CLOEXEC,      "F_DUPFD_CLOEXEC"       },
+#endif
        { 0,            NULL            },
 };
 
@@ -183,6 +195,33 @@ static const struct xlat lockfcmds[] = {
        { 0,            NULL            },
 };
 
+#ifdef F_NOTIFY
+static const struct xlat notifyflags[] = {
+#ifdef DN_ACCESS
+       { DN_ACCESS,    "DN_ACCESS"     },
+#endif
+#ifdef DN_MODIFY
+       { DN_MODIFY,    "DN_MODIFY"     },
+#endif
+#ifdef DN_CREATE
+       { DN_CREATE,    "DN_CREATE"     },
+#endif
+#ifdef DN_DELETE
+       { DN_DELETE,    "DN_DELETE"     },
+#endif
+#ifdef DN_RENAME
+       { DN_RENAME,    "DN_RENAME"     },
+#endif
+#ifdef DN_ATTRIB
+       { DN_ATTRIB,    "DN_ATTRIB"     },
+#endif
+#ifdef DN_MULTISHOT
+       { DN_MULTISHOT, "DN_MULTISHOT"  },
+#endif
+       { 0,            NULL            },
+};
+#endif
+
 static const struct xlat whence[] = {
        { SEEK_SET,     "SEEK_SET"      },
        { SEEK_CUR,     "SEEK_CUR"      },
@@ -307,6 +346,9 @@ sys_fcntl(struct tcb *tcp)
                        printflags(fdflags, tcp->u_arg[2], "FD_???");
                        break;
                case F_SETOWN: case F_DUPFD:
+#ifdef F_DUPFD_CLOEXEC
+               case F_DUPFD_CLOEXEC:
+#endif
                        tprintf(", %ld", tcp->u_arg[2]);
                        break;
                case F_SETFL:
@@ -336,14 +378,35 @@ sys_fcntl(struct tcb *tcp)
                        printflock64(tcp, tcp->u_arg[2], 0);
                        break;
 #endif
+#ifdef F_NOTIFY
+               case F_NOTIFY:
+                       tprintf(", ");
+                       printflags(notifyflags, tcp->u_arg[2], "DN_???");
+                       break;
+#endif
+#ifdef F_SETLEASE
+               case F_SETLEASE:
+                       tprintf(", ");
+                       printxval(lockfcmds, tcp->u_arg[2], "F_???");
+                       break;
+#endif
                }
        }
        else {
                switch (tcp->u_arg[1]) {
                case F_DUPFD:
+#ifdef F_DUPFD_CLOEXEC
+               case F_DUPFD_CLOEXEC:
+#endif
                case F_SETFD: case F_SETFL:
                case F_SETLK: case F_SETLKW:
                case F_SETOWN: case F_GETOWN:
+#ifdef F_NOTIFY
+               case F_NOTIFY:
+#endif
+#ifdef F_SETLEASE
+               case F_SETLEASE:
+#endif
                        break;
                case F_GETFD:
                        if (syserror(tcp) || tcp->u_rval == 0)
@@ -368,6 +431,13 @@ sys_fcntl(struct tcb *tcp)
                        printflock64(tcp, tcp->u_arg[2], 1);
                        break;
 #endif
+#ifdef F_GETLEASE
+               case F_GETLEASE:
+                       if (syserror(tcp))
+                               return 0;
+                       tcp->auxstr = xlookup(lockfcmds, tcp->u_rval);
+                       return RVAL_HEX|RVAL_STR;
+#endif
                default:
                        tprintf(", %#lx", tcp->u_arg[2]);
                        break;
-- 
1.6.2


------------------------------------------------------------------------------
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to