]> 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 2ed7fa50f92a9d146f6709a81588e433a72c6850..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
@@ -217,7 +213,25 @@ sys_pwrite(struct tcb *tcp)
        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(tcp, "%llu", PREAD_OFFSET_ARG);
+               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(tcp, "%llu", PREAD_OFFSET_ARG);
+               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)
@@ -317,21 +330,7 @@ sys_sendfile64(struct tcb *tcp)
        return 0;
 }
 
-static const struct xlat splice_flags[] = {
-#ifdef SPLICE_F_MOVE
-       XLAT(SPLICE_F_MOVE),
-#endif
-#ifdef SPLICE_F_NONBLOCK
-       XLAT(SPLICE_F_NONBLOCK),
-#endif
-#ifdef SPLICE_F_MORE
-       XLAT(SPLICE_F_MORE),
-#endif
-#ifdef SPLICE_F_GIFT
-       XLAT(SPLICE_F_GIFT),
-#endif
-       { 0,                 NULL                },
-};
+#include "xlat/splice_flags.h"
 
 int
 sys_tee(struct tcb *tcp)
@@ -405,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 {