]> granicus.if.org Git - strace/commitdiff
evdev.c: move handling of EVIOCGBIT to a separate function
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 27 May 2016 00:40:18 +0000 (00:40 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sat, 28 May 2016 00:37:05 +0000 (00:37 +0000)
* evdev.c (evdev_read_ioctl): Move EVIOCGBIT handling to ...
(bit_ioctl): ... new function.

evdev.c

diff --git a/evdev.c b/evdev.c
index dda8f54e9b1bd5522619e2cfca7f116237d77d02..97a856a90055d56d8fac96ecd5107ed10f58374b 100644 (file)
--- a/evdev.c
+++ b/evdev.c
@@ -307,6 +307,53 @@ repeat_ioctl(struct tcb *tcp, long arg)
 }
 # endif /* EVIOCGREP || EVIOCSREP */
 
+static int
+bit_ioctl(struct tcb *tcp, const unsigned int ev_nr, const long arg)
+{
+       switch (ev_nr) {
+               case EV_SYN:
+                       return decode_bitset(tcp, arg, evdev_sync,
+                                       SYN_MAX, "SYN_???");
+               case EV_KEY:
+                       return decode_bitset(tcp, arg, evdev_keycode,
+                                       KEY_MAX, "KEY_???");
+               case EV_REL:
+                       return decode_bitset(tcp, arg, evdev_relative_axes,
+                                       REL_MAX, "REL_???");
+               case EV_ABS:
+                       return decode_bitset(tcp, arg,
+                                       evdev_abs, ABS_MAX, "ABS_???");
+               case EV_MSC:
+                       return decode_bitset(tcp, arg,
+                                       evdev_misc, MSC_MAX, "MSC_???");
+# ifdef EV_SW
+               case EV_SW:
+                       return decode_bitset(tcp, arg,
+                                       evdev_switch, SW_MAX, "SW_???");
+# endif
+               case EV_LED:
+                       return decode_bitset(tcp, arg,
+                                       evdev_leds, LED_MAX, "LED_???");
+               case EV_SND:
+                       return decode_bitset(tcp, arg,
+                                       evdev_snd, SND_MAX, "SND_???");
+               case EV_REP:
+                       return decode_bitset(tcp, arg, evdev_autorepeat,
+                                       REP_MAX, "REP_???");
+               case EV_FF:
+                       return decode_bitset(tcp, arg, evdev_ff_types,
+                                       FF_MAX, "FF_???");
+               case EV_PWR:
+                       printnum_int(tcp, arg, "%d");
+                       return 1;
+               case EV_FF_STATUS:
+                       return decode_bitset(tcp, arg, evdev_ff_status,
+                                       FF_STATUS_MAX, "FF_STATUS_???");
+               default:
+                       return 0;
+       }
+}
+
 static int
 evdev_read_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
 {
@@ -375,50 +422,8 @@ evdev_read_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
                return abs_ioctl(tcp, arg);
 
        /* multi-number variable-length commands */
-       if ((_IOC_NR(code) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) {
-               switch (_IOC_NR(code) - 0x20) {
-                       case EV_SYN:
-                               return decode_bitset(tcp, arg, evdev_sync,
-                                               SYN_MAX, "SYN_???");
-                       case EV_KEY:
-                               return decode_bitset(tcp, arg, evdev_keycode,
-                                               KEY_MAX, "KEY_???");
-                       case EV_REL:
-                               return decode_bitset(tcp, arg, evdev_relative_axes,
-                                               REL_MAX, "REL_???");
-                       case EV_ABS:
-                               return decode_bitset(tcp, arg,
-                                               evdev_abs, ABS_MAX, "ABS_???");
-                       case EV_MSC:
-                               return decode_bitset(tcp, arg,
-                                               evdev_misc, MSC_MAX, "MSC_???");
-# ifdef EV_SW
-                       case EV_SW:
-                               return decode_bitset(tcp, arg,
-                                               evdev_switch, SW_MAX, "SW_???");
-# endif
-                       case EV_LED:
-                               return decode_bitset(tcp, arg,
-                                               evdev_leds, LED_MAX, "LED_???");
-                       case EV_SND:
-                               return decode_bitset(tcp, arg,
-                                               evdev_snd, SND_MAX, "SND_???");
-                       case EV_REP:
-                               return decode_bitset(tcp, arg, evdev_autorepeat,
-                                               REP_MAX, "REP_???");
-                       case EV_FF:
-                               return decode_bitset(tcp, arg, evdev_ff_types,
-                                               FF_MAX, "FF_???");
-                       case EV_PWR:
-                               printnum_int(tcp, arg, "%d");
-                               return 1;
-                       case EV_FF_STATUS:
-                               return decode_bitset(tcp, arg, evdev_ff_status,
-                                               FF_STATUS_MAX, "FF_STATUS_???");
-                       default:
-                               return 0;
-               }
-       }
+       if ((_IOC_NR(code) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0)))
+               return bit_ioctl(tcp, _IOC_NR(code) & EV_MAX, arg);
 
        return 0;
 }