Some ioctls from evdev, hiddev, mixer, uinput, spi and joystick are
parametered by a size or a number that is variable. These changes add
the display of these ones, and their parameters.

* defs.h: Declare new function ioctl_decode_number.
* io.c (sys_ioctl): Add call to ioctl_decode_number.
* ioctl.c (ioctl_decode_number): Implement this new function.

Signed-off-by: Gabriel Laskar <[email protected]>
---
 defs.h  |   1 +
 io.c    |  19 +++++++----
 ioctl.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 128 insertions(+), 7 deletions(-)

diff --git a/defs.h b/defs.h
index d0acb19..501464e 100644
--- a/defs.h
+++ b/defs.h
@@ -733,6 +733,7 @@ extern void print_loff_t(struct tcb *, long);
 extern const struct_ioctlent *ioctl_lookup(unsigned long);
 extern const struct_ioctlent *ioctl_next_match(const struct_ioctlent *);
 extern int ioctl_decode(struct tcb *, long, long);
+extern int ioctl_decode_number(unsigned long);
 extern int term_ioctl(struct tcb *, long, long);
 extern int sock_ioctl(struct tcb *, long, long);
 extern int proc_ioctl(struct tcb *, int, int);
diff --git a/io.c b/io.c
index 87bdbba..b7526bb 100644
--- a/io.c
+++ b/io.c
@@ -398,13 +398,18 @@ sys_ioctl(struct tcb *tcp)
        if (entering(tcp)) {
                printfd(tcp, tcp->u_arg[0]);
                tprints(", ");
-               iop = ioctl_lookup(tcp->u_arg[1]);
-               if (iop) {
-                       tprints(iop->symbol);
-                       while ((iop = ioctl_next_match(iop)))
-                               tprintf(" or %s", iop->symbol);
-               } else
-                       tprintf("%#lx", tcp->u_arg[1]);
+
+               int ret = ioctl_decode_number(tcp->u_arg[1]);
+               if (!ret) {
+                       iop = ioctl_lookup(tcp->u_arg[1]);
+                       if (iop) {
+                               tprints(iop->symbol);
+                               while ((iop = ioctl_next_match(iop)))
+                                       tprintf(" or %s", iop->symbol);
+                       } else {
+                               tprintf("%#lx", tcp->u_arg[1]);
+                       }
+               }
                ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]);
        }
        else {
diff --git a/ioctl.c b/ioctl.c
index cfd5a24..050ec28 100644
--- a/ioctl.c
+++ b/ioctl.c
@@ -70,6 +70,121 @@ ioctl_next_match(const struct_ioctlent *iop)
 }
 
 int
+evdev_decode_number(unsigned long arg)
+{
+       unsigned long nr = _IOC_NR(arg);
+
+       if (nr >= 0x20 && nr <= 0x20 + 0x1f) {
+               tprintf("EVIOCGBIT(ev=%lu, len=%lu)", nr - 0x20, 
_IOC_SIZE(arg));
+               return 1;
+       } else if (nr >= 0x40 && nr <= 0x40 + 0x3f) {
+               tprintf("EVIOCGABS(abs=%lu)", nr - 0x40);
+               return 1;
+       } else if (nr >= 0xc0 && nr <= 0xc0 + 0x3f) {
+               tprintf("EVIOCSABS(abs=%lu)", nr - 0xc0);
+               return 1;
+       }
+
+       switch (_IOC_NR(nr)) {
+               case 0x06:
+                       tprintf("EVIOCGNAME(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x07:
+                       tprintf("EVIOCGPHYS(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x08:
+                       tprintf("EVIOCGUNIQ(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x09:
+                       tprintf("EVIOCGPROP(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x0a:
+                       tprintf("EVIOCGMTSLOTS(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x18:
+                       tprintf("EVIOCGKEY(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x19:
+                       tprintf("EVIOCGLED(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x1a:
+                       tprintf("EVIOCGSND(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x1b:
+                       tprintf("EVIOCGSW(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               default:
+                       return 0;
+       }
+}
+
+int
+hiddev_decode_number(unsigned long arg)
+{
+       switch (_IOC_NR(arg)) {
+               case 0x04:
+                       tprintf("HIDIOCGRAWNAME(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x05:
+                       tprintf("HIDIOCGRAWPHYS(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x06:
+                       if (_IOC_DIR(arg) == IOC_IN) {
+                               tprintf("HIDIOCSFEATURE(len=%lu)", 
_IOC_SIZE(arg));
+                       } else {
+                               tprintf("HIDIOCGNAME(len=%lu)", _IOC_SIZE(arg));
+                       }
+                       return 1;
+               case 0x07:
+                       tprintf("HIDIOCGFEATURE(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               case 0x12:
+                       tprintf("HIDIOCGPHYS(len=%lu)", _IOC_SIZE(arg));
+                       return 1;
+               default:
+                       return 0;
+       }
+}
+
+int
+ioctl_decode_number(unsigned long arg)
+{
+       switch (_IOC_TYPE(arg)) {
+               case 'E':
+                       return evdev_decode_number(arg);
+               case 'H':
+                       return hiddev_decode_number(arg);
+               case 'M':
+                       if (_IOC_DIR(arg) == IOC_IN) {
+                               tprintf("MIXER_WRITE(dev=%lu)", _IOC_NR(arg));
+                       } else {
+                               tprintf("MIXER_READ(dev=%lu)", _IOC_NR(arg));
+                       }
+                       return 1;
+               case 'U':
+                       if (_IOC_NR(arg) == 0x2c) {
+                               tprintf("UI_GET_SYSNAME(len=%lu)", 
_IOC_SIZE(arg));
+                               return 1;
+                       }
+                       return 0;
+               case 'j':
+                       if (_IOC_NR(arg) == 0x13) {
+                               tprintf("JSIOCGNAME(len=%lu)", _IOC_SIZE(arg));
+                               return 1;
+                       }
+                       return 0;
+               case 'k':
+                       if (_IOC_NR(arg) == 0) {
+                               tprintf("SPI_IOC_MESSAGE(N=%lu)", 
_IOC_SIZE(arg));
+                               return 1;
+                       }
+                       return 0;
+               default:
+                       return 0;
+       }
+}
+
+int
 ioctl_decode(struct tcb *tcp, long code, long arg)
 {
        switch ((code >> 8) & 0xff) {
-- 
2.2.2


------------------------------------------------------------------------------
New Year. New Location. New Benefits. New Data Center in Ashburn, VA.
GigeNET is offering a free month of service with a new server in Ashburn.
Choose from 2 high performing configs, both with 100TB of bandwidth.
Higher redundancy.Lower latency.Increased capacity.Completely compliant.
http://p.sf.net/sfu/gigenet
_______________________________________________
Strace-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to