]> granicus.if.org Git - strace/commitdiff
renameat2: add decoding support
authorMike Frysinger <vapier@gentoo.org>
Thu, 14 Aug 2014 08:05:41 +0000 (04:05 -0400)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 15 Aug 2014 00:06:06 +0000 (00:06 +0000)
* file.c (decode_renameat, sys_renameat2): New functions.
(sys_renameat): Use decode_renameat.
* pathtrace.c (pathtrace_match): Handle sys_renameat2.
* linux/syscall.h (sys_renameat2): New prototype.
* xlat/rename_flags.in: New file.

file.c
linux/syscall.h
pathtrace.c
xlat/rename_flags.in [new file with mode: 0644]

diff --git a/file.c b/file.c
index 360408f39725acbdd741ee51b4e63183a8909dd0..986f4465546103a7f4d0d134600b8ea4fcf8189a 100644 (file)
--- a/file.c
+++ b/file.c
@@ -1767,15 +1767,34 @@ sys_readlinkat(struct tcb *tcp)
        return decode_readlink(tcp, 1);
 }
 
+static void
+decode_renameat(struct tcb *tcp)
+{
+       print_dirfd(tcp, tcp->u_arg[0]);
+       printpath(tcp, tcp->u_arg[1]);
+       tprints(", ");
+       print_dirfd(tcp, tcp->u_arg[2]);
+       printpath(tcp, tcp->u_arg[3]);
+}
+
 int
 sys_renameat(struct tcb *tcp)
 {
        if (entering(tcp)) {
-               print_dirfd(tcp, tcp->u_arg[0]);
-               printpath(tcp, tcp->u_arg[1]);
+               decode_renameat(tcp);
+       }
+       return 0;
+}
+
+#include "xlat/rename_flags.h"
+
+int
+sys_renameat2(struct tcb *tcp)
+{
+       if (entering(tcp)) {
+               decode_renameat(tcp);
                tprints(", ");
-               print_dirfd(tcp, tcp->u_arg[2]);
-               printpath(tcp, tcp->u_arg[3]);
+               printflags(rename_flags, tcp->u_arg[4], "RENAME_??");
        }
        return 0;
 }
index 38aa4bd7e8eb893abc1e1c76f0a123da6808a860..0e6959897d7352fdc958a1b633a924ea19a41a7a 100644 (file)
@@ -207,6 +207,7 @@ int sys_recvmsg();
 int sys_remap_file_pages();
 int sys_removexattr();
 int sys_renameat();
+int sys_renameat2();
 int sys_request_key();
 int sys_restart_syscall();
 int sys_rt_sigaction();
index 9fb99c42ff240d067180d2a6406edbee53a62d06..ccfb3c27369a063cfcda0d3355f933b5a3b7c7b9 100644 (file)
@@ -211,6 +211,7 @@ pathtrace_match(struct tcb *tcp)
        }
 
        if (s->sys_func == sys_renameat ||
+           s->sys_func == sys_renameat2 ||
            s->sys_func == sys_linkat)
        {
                /* fd, path, fd, path */
diff --git a/xlat/rename_flags.in b/xlat/rename_flags.in
new file mode 100644 (file)
index 0000000..324bded
--- /dev/null
@@ -0,0 +1,2 @@
+RENAME_NOREPLACE
+RENAME_EXCHANGE