]> granicus.if.org Git - strace/commitdiff
io.c: use printaddr and umove_or_printaddr
authorDmitry V. Levin <ldv@altlinux.org>
Mon, 20 Jul 2015 11:06:54 +0000 (11:06 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 20 Jul 2015 22:03:06 +0000 (22:03 +0000)
* io.c (sys_read, sys_pread): Use printaddr.
(tprint_iov_upto): Do not fetch data in case of syserror.
Use printaddr.
(sys_readv, sys_preadv): Remove redundant check for syserror.
(print_off_t): Use printnum_int and printnum_long.
(print_loff_t): Use umove_or_printaddr.

io.c

diff --git a/io.c b/io.c
index eec496ad70d97e70e2fc0fb59751d0819cc7c4fa..16ce229f11e1bf04d2d8469a06d8402056a01b68 100644 (file)
--- a/io.c
+++ b/io.c
@@ -39,7 +39,7 @@ SYS_FUNC(read)
                tprints(", ");
        } else {
                if (syserror(tcp))
-                       tprintf("%#lx", tcp->u_arg[1]);
+                       printaddr(tcp->u_arg[1]);
                else
                        printstr(tcp, tcp->u_arg[1], tcp->u_rval);
                tprintf(", %lu", tcp->u_arg[2]);
@@ -83,7 +83,6 @@ tprint_iov_upto(struct tcb *tcp, unsigned long len, unsigned long addr, int deco
 #define iov_iov_len iov.iov_len
 #endif
        unsigned long size, cur, end, abbrev_end;
-       int failed = 0;
 
        if (!len) {
                tprints("[]");
@@ -91,8 +90,9 @@ tprint_iov_upto(struct tcb *tcp, unsigned long len, unsigned long addr, int deco
        }
        size = len * sizeof_iov;
        end = addr + size;
-       if (!verbose(tcp) || size / sizeof_iov != len || end < addr) {
-               tprintf("%#lx", addr);
+       if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
+           !addr || size / sizeof_iov != len || end < addr) {
+               printaddr(addr);
                return;
        }
        if (abbrev(tcp)) {
@@ -110,11 +110,8 @@ tprint_iov_upto(struct tcb *tcp, unsigned long len, unsigned long addr, int deco
                        tprints("...");
                        break;
                }
-               if (umoven(tcp, cur, sizeof_iov, &iov) < 0) {
-                       tprints("?");
-                       failed = 1;
+               if (umoven_or_printaddr(tcp, cur, sizeof_iov, &iov))
                        break;
-               }
                tprints("{");
                if (decode_iov) {
                        unsigned long len = iov_iov_len;
@@ -123,12 +120,10 @@ tprint_iov_upto(struct tcb *tcp, unsigned long len, unsigned long addr, int deco
                        data_size -= len;
                        printstr(tcp, (long) iov_iov_base, len);
                } else
-                       tprintf("%#lx", (long) iov_iov_base);
+                       printaddr((long) iov_iov_base);
                tprintf(", %lu}", (unsigned long)iov_iov_len);
        }
        tprints("]");
-       if (failed)
-               tprintf(" %#lx", addr);
 #undef sizeof_iov
 #undef iov_iov_base
 #undef iov_iov_len
@@ -146,11 +141,6 @@ SYS_FUNC(readv)
                printfd(tcp, tcp->u_arg[0]);
                tprints(", ");
        } else {
-               if (syserror(tcp)) {
-                       tprintf("%#lx, %lu",
-                                       tcp->u_arg[1], tcp->u_arg[2]);
-                       return 0;
-               }
                tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
                tprintf(", %lu", tcp->u_arg[2]);
        }
@@ -186,7 +176,7 @@ SYS_FUNC(pread)
                tprints(", ");
        } else {
                if (syserror(tcp))
-                       tprintf("%#lx", tcp->u_arg[1]);
+                       printaddr(tcp->u_arg[1]);
                else
                        printstr(tcp, tcp->u_arg[1], tcp->u_rval);
                tprintf(", %lu, ", tcp->u_arg[2]);
@@ -239,10 +229,6 @@ SYS_FUNC(preadv)
                printfd(tcp, tcp->u_arg[0]);
                tprints(", ");
        } else {
-               if (syserror(tcp)) {
-                       tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]);
-                       return 0;
-               }
                tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
                tprintf(", %lu, ", tcp->u_arg[2]);
                print_llu_from_low_high_val(tcp, 3);
@@ -265,27 +251,10 @@ SYS_FUNC(pwritev)
 static void
 print_off_t(struct tcb *tcp, long addr)
 {
-       unsigned long offset;
-
-       if (!addr) {
-               tprints("NULL");
-               return;
-       }
-
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-       if (current_wordsize == 4) {
-               uint32_t off;
-
-               if (umove(tcp, addr, &off) < 0)
-                       tprintf("%#lx", addr);
-               else
-                       tprintf("[%u]", off);
-       } else
-#endif
-       if (umove(tcp, addr, &offset) < 0)
-               tprintf("%#lx", addr);
+       if (current_wordsize == sizeof(int))
+               printnum_int(tcp, addr, "%u");
        else
-               tprintf("[%lu]", offset);
+               printnum_long(tcp, addr, "%lu");
 }
 
 SYS_FUNC(sendfile)
@@ -306,11 +275,7 @@ print_loff_t(struct tcb *tcp, long addr)
 {
        loff_t offset;
 
-       if (!addr)
-               tprints("NULL");
-       else if (umove(tcp, addr, &offset) < 0)
-               tprintf("%#lx", addr);
-       else
+       if (!umove_or_printaddr(tcp, addr, &offset))
                tprintf("[%llu]", (unsigned long long int) offset);
 }