]> granicus.if.org Git - strace/blobdiff - io.c
ioctl: print unrecognized ioctl codes in _IOC(dir,type,nr,size) format
[strace] / io.c
diff --git a/io.c b/io.c
index fea121886cc637e8fe76677efe1ba584cdb90aaa..2a36c000d001b5075d73ed9eadeea3ceb088dea2 100644 (file)
--- a/io.c
+++ b/io.c
@@ -30,9 +30,7 @@
 
 #include "defs.h"
 #include <fcntl.h>
-#if HAVE_SYS_UIO_H
-# include <sys/uio.h>
-#endif
+#include <sys/uio.h>
 
 int
 sys_read(struct tcb *tcp)
@@ -62,7 +60,6 @@ sys_write(struct tcb *tcp)
        return 0;
 }
 
-#if HAVE_SYS_UIO_H
 /*
  * data_size limits the cumulative size of printed data.
  * Example: recvmsg returing a short read.
@@ -174,7 +171,6 @@ sys_writev(struct tcb *tcp)
        }
        return 0;
 }
-#endif
 
 /* The SH4 ABI does allow long longs in odd-numbered registers, but
    does not allow them to be split between registers and memory - and
@@ -199,7 +195,7 @@ sys_pread(struct tcb *tcp)
                else
                        printstr(tcp, tcp->u_arg[1], tcp->u_rval);
                tprintf(", %lu, ", tcp->u_arg[2]);
-               printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG);
+               printllval(tcp, "%llu", PREAD_OFFSET_ARG);
        }
        return 0;
 }
@@ -212,12 +208,30 @@ sys_pwrite(struct tcb *tcp)
                tprints(", ");
                printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
                tprintf(", %lu, ", tcp->u_arg[2]);
-               printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG);
+               printllval(tcp, "%llu", PREAD_OFFSET_ARG);
        }
        return 0;
 }
 
-#if HAVE_SYS_UIO_H
+static void
+print_llu_from_low_high_val(struct tcb *tcp, int arg)
+{
+#if SIZEOF_LONG == SIZEOF_LONG_LONG
+       tprintf("%lu", (unsigned long) tcp->u_arg[arg]);
+#elif defined(LINUX_MIPSN32)
+       tprintf("%llu", (unsigned long long) tcp->ext_arg[arg]);
+#else
+# ifdef X32
+       if (current_personality == 0)
+               tprintf("%llu", (unsigned long long) tcp->ext_arg[arg]);
+       else
+# endif
+       tprintf("%llu",
+               ((unsigned long long) (unsigned long) tcp->u_arg[arg + 1] << sizeof(long) * 8)
+               | (unsigned long long) (unsigned long) tcp->u_arg[arg]);
+#endif
+}
+
 int
 sys_preadv(struct tcb *tcp)
 {
@@ -231,7 +245,7 @@ sys_preadv(struct tcb *tcp)
                }
                tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
                tprintf(", %lu, ", tcp->u_arg[2]);
-               printllval_unaligned(tcp, "%llu", 3);
+               print_llu_from_low_high_val(tcp, 3);
        }
        return 0;
 }
@@ -244,11 +258,10 @@ sys_pwritev(struct tcb *tcp)
                tprints(", ");
                tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1);
                tprintf(", %lu, ", tcp->u_arg[2]);
-               printllval_unaligned(tcp, "%llu", 3);
+               print_llu_from_low_high_val(tcp, 3);
        }
        return 0;
 }
-#endif /* HAVE_SYS_UIO_H */
 
 static void
 print_off_t(struct tcb *tcp, long addr)
@@ -391,7 +404,7 @@ sys_ioctl(struct tcb *tcp)
                        while ((iop = ioctl_next_match(iop)))
                                tprintf(" or %s", iop->symbol);
                } else
-                       tprintf("%#lx", tcp->u_arg[1]);
+                       ioctl_print_code(tcp->u_arg[1]);
                ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]);
        }
        else {