]> granicus.if.org Git - strace/commitdiff
Enhance *listxattr syscalls decoding
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 14 Mar 2012 16:34:32 +0000 (16:34 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 14 Mar 2012 16:34:32 +0000 (16:34 +0000)
* file.c (print_xattr_list): New function.
(sys_listxattr, sys_flistxattr): Use it.

file.c

diff --git a/file.c b/file.c
index 89abb84da5aaa429370ffcf223e071a1666c51b1..850cdcf9c07f78b79ab50a4c162818ff064ebcd4 100644 (file)
--- a/file.c
+++ b/file.c
@@ -2528,14 +2528,31 @@ sys_fgetxattr(struct tcb *tcp)
        return 0;
 }
 
+static void
+print_xattr_list(struct tcb *tcp, unsigned long addr, unsigned long size)
+{
+       if (syserror(tcp)) {
+               tprintf("%#lx", addr);
+       } else {
+               if (!addr) {
+                       tprints("NULL");
+               } else {
+                       unsigned long len =
+                               (size < tcp->u_rval) ? size : tcp->u_rval;
+                       printstr(tcp, addr, len);
+               }
+       }
+       tprintf(", %lu", size);
+}
+
 int
 sys_listxattr(struct tcb *tcp)
 {
        if (entering(tcp)) {
                printpath(tcp, tcp->u_arg[0]);
+               tprints(", ");
        } else {
-               /* XXX Print value in format */
-               tprintf(", %p, %lu", (void *) tcp->u_arg[1], tcp->u_arg[2]);
+               print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
        }
        return 0;
 }
@@ -2545,9 +2562,9 @@ sys_flistxattr(struct tcb *tcp)
 {
        if (entering(tcp)) {
                printfd(tcp, tcp->u_arg[0]);
+               tprints(", ");
        } else {
-               /* XXX Print value in format */
-               tprintf(", %p, %lu", (void *) tcp->u_arg[1], tcp->u_arg[2]);
+               print_xattr_list(tcp, tcp->u_arg[1], tcp->u_arg[2]);
        }
        return 0;
 }