]> granicus.if.org Git - strace/blobdiff - evdev.c
travis: add x86 musl
[strace] / evdev.c
diff --git a/evdev.c b/evdev.c
index 1ffad841d7c17ed01d23f4cdf5c6a14fc34b844e..b24f9d320b2dc4a0b8b5c7131403e844425d802f 100644 (file)
--- a/evdev.c
+++ b/evdev.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2015 Etienne Gemsa <etienne.gemsa@lse.epita.fr>
- * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 
 #ifdef HAVE_LINUX_INPUT_H
 
+#include DEF_MPERS_TYPE(struct_ff_effect)
+
 # include <linux/ioctl.h>
 # include <linux/input.h>
-# include "xlat/evdev_abs.h"
+
+typedef struct ff_effect struct_ff_effect;
+
+#endif /* HAVE_LINUX_INPUT_H */
+
+#include MPERS_DEFS
+
+#ifdef HAVE_LINUX_INPUT_H
+
 # include "xlat/evdev_autorepeat.h"
 # include "xlat/evdev_ff_status.h"
 # include "xlat/evdev_ff_types.h"
 # endif
 
 static void
-decode_envelope(const struct ff_envelope *envelope)
+decode_envelope(void *const data)
 {
+       const struct ff_envelope *const envelope = data;
+
        tprintf(", envelope={attack_length=%" PRIu16
                ", attack_level=%" PRIu16
                ", fade_length=%" PRIu16
@@ -68,7 +80,7 @@ ff_effect_ioctl(struct tcb *tcp, long arg)
 {
        tprints(", ");
 
-       struct ff_effect ffe;
+       struct_ff_effect ffe;
 
        if (umove_or_printaddr(tcp, arg, &ffe))
                return 1;
@@ -121,10 +133,10 @@ ff_effect_ioctl(struct tcb *tcp, long arg)
                                ffe.u.periodic.offset,
                                ffe.u.periodic.phase);
                        decode_envelope(&ffe.u.periodic.envelope);
-                       tprintf(", custom_len=%u"
-                               ", custom_data=%#lx}",
-                               ffe.u.periodic.custom_len,
-                               (unsigned long) ffe.u.periodic.custom_data);
+                       tprintf(", custom_len=%u, custom_data=",
+                               ffe.u.periodic.custom_len);
+                       printaddr((unsigned long) ffe.u.periodic.custom_data);
+                       tprints("}");
                        break;
                case FF_RUMBLE:
                        tprintf(", rumble={strong_magnitude=%" PRIu16
@@ -232,19 +244,20 @@ keycode_V2_ioctl(struct tcb *tcp, long arg)
 static int
 getid_ioctl(struct tcb *tcp, long arg)
 {
+       tprints(", ");
+
        struct input_id id;
 
-       if (!verbose(tcp) || umove(tcp, arg, &id) < 0)
-               return 0;
+       if (!umove_or_printaddr(tcp, arg, &id))
+               tprintf("{ID_BUS=%" PRIu16
+                       ", ID_VENDOR=%" PRIu16
+                       ", ID_PRODUCT=%" PRIu16
+                       ", ID_VERSION=%" PRIu16 "}",
+                       id.bustype,
+                       id.vendor,
+                       id.product,
+                       id.version);
 
-       tprintf(", {ID_BUS=%" PRIu16 ", ID_VENDOR=%" PRIu16,
-               id.bustype, id.vendor);
-       if (!abbrev(tcp)) {
-               tprintf(", ID_PRODUCT=%" PRIu16 ", ID_VERSION=%" PRIu16 "}",
-                       id.product, id.version);
-       } else {
-               tprints(", ...}");
-       }
        return 1;
 }
 
@@ -252,8 +265,7 @@ static int
 decode_bitset(struct tcb *tcp, long arg, const struct xlat decode_nr[],
              const unsigned int max_nr, const char *dflt)
 {
-       if (!verbose(tcp))
-               return 0;
+       tprints(", ");
 
        unsigned int size;
        if ((unsigned long) tcp->u_rval > max_nr)
@@ -262,10 +274,10 @@ decode_bitset(struct tcb *tcp, long arg, const struct xlat decode_nr[],
                size = tcp->u_rval;
        char decoded_arg[size];
 
-       if (umoven(tcp, arg, size, decoded_arg) < 0)
-               return 0;
+       if (umove_or_printaddr(tcp, arg, &decoded_arg))
+               return 1;
 
-       tprints("[");
+       tprints("[");
 
        int bit_displayed = 0;
        int i = next_set_bit(decoded_arg, 0, size);
@@ -294,25 +306,30 @@ decode_bitset(struct tcb *tcp, long arg, const struct xlat decode_nr[],
 static int
 mtslots_ioctl(struct tcb *tcp, const unsigned int code, long arg)
 {
-       const size_t size = _IOC_SIZE(code) / sizeof(int32_t);
-       if (!size)
-               return 0;
+       tprints(", ");
+
+       const size_t size = _IOC_SIZE(code) / sizeof(int);
+       if (!size) {
+               printaddr(arg);
+               return 1;
+       }
 
-       int32_t buffer[size];
+       int buffer[size];
 
-       if (!verbose(tcp) || umove(tcp, arg, &buffer) < 0)
-               return 0;
+       if (umove_or_printaddr(tcp, arg, &buffer))
+               return 1;
 
-       tprints("{code=");
+       tprints("{code=");
        printxval(evdev_mtslots, buffer[0], "ABS_MT_???");
 
-       unsigned int i;
        tprints(", values=[");
 
+       unsigned int i;
        for (i = 1; i < ARRAY_SIZE(buffer); i++)
                tprintf("%s%d", i > 1 ? ", " : "", buffer[i]);
 
        tprints("]}");
+
        return 1;
 }
 # endif /* EVIOCGMTSLOTS */
@@ -333,68 +350,68 @@ 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_???");
+                                            SYN_MAX, "SYN_???");
                case EV_KEY:
                        return decode_bitset(tcp, arg, evdev_keycode,
-                                       KEY_MAX, "KEY_???");
+                                            KEY_MAX, "KEY_???");
                case EV_REL:
                        return decode_bitset(tcp, arg, evdev_relative_axes,
-                                       REL_MAX, "REL_???");
+                                            REL_MAX, "REL_???");
                case EV_ABS:
-                       return decode_bitset(tcp, arg,
-                                       evdev_abs, ABS_MAX, "ABS_???");
+                       return decode_bitset(tcp, arg, evdev_abs,
+                                            ABS_MAX, "ABS_???");
                case EV_MSC:
-                       return decode_bitset(tcp, arg,
-                                       evdev_misc, MSC_MAX, "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_???");
+                       return decode_bitset(tcp, arg, evdev_switch,
+                                            SW_MAX, "SW_???");
 # endif
                case EV_LED:
-                       return decode_bitset(tcp, arg,
-                                       evdev_leds, LED_MAX, "LED_???");
+                       return decode_bitset(tcp, arg, evdev_leds,
+                                            LED_MAX, "LED_???");
                case EV_SND:
-                       return decode_bitset(tcp, arg,
-                                       evdev_snd, SND_MAX, "SND_???");
+                       return decode_bitset(tcp, arg, evdev_snd,
+                                            SND_MAX, "SND_???");
                case EV_REP:
                        return decode_bitset(tcp, arg, evdev_autorepeat,
-                                       REP_MAX, "REP_???");
+                                            REP_MAX, "REP_???");
                case EV_FF:
                        return decode_bitset(tcp, arg, evdev_ff_types,
-                                       FF_MAX, "FF_???");
+                                            FF_MAX, "FF_???");
                case EV_PWR:
+                       tprints(", ");
                        printnum_int(tcp, arg, "%d");
                        return 1;
                case EV_FF_STATUS:
                        return decode_bitset(tcp, arg, evdev_ff_status,
-                                       FF_STATUS_MAX, "FF_STATUS_???");
+                                            FF_STATUS_MAX, "FF_STATUS_???");
                default:
-                       return 0;
+                       tprints(", ");
+                       printaddr(arg);
+                       return 1;
        }
 }
 
 static int
 evdev_read_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
 {
-       if (syserror(tcp))
-               return 0;
-
        /* fixed-number fixed-length commands */
        switch (code) {
                case EVIOCGVERSION:
                        tprints(", ");
-                       printnum_int(tcp, arg, "%" PRIx32);
+                       printnum_int(tcp, arg, "%#x");
                        return 1;
                case EVIOCGEFFECTS:
                        tprints(", ");
-                       printnum_int(tcp, arg, "%" PRIu32);
+                       printnum_int(tcp, arg, "%u");
                        return 1;
                case EVIOCGID:
                        return getid_ioctl(tcp, arg);
 # ifdef EVIOCGREP
                case EVIOCGREP:
-                       return repeat_ioctl(tcp, arg);;
+                       return repeat_ioctl(tcp, arg);
 # endif
                case EVIOCGKEYCODE:
                        return keycode_ioctl(tcp, arg);
@@ -414,27 +431,30 @@ evdev_read_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
                case _IOC_NR(EVIOCGPHYS(0)):
                case _IOC_NR(EVIOCGUNIQ(0)):
                        tprints(", ");
-                       printstr(tcp, arg, tcp->u_rval - 1);
+                       if (syserror(tcp))
+                               printaddr(arg);
+                       else
+                               printstr(tcp, arg, tcp->u_rval);
                        return 1;
 # ifdef EVIOCGPROP
                case _IOC_NR(EVIOCGPROP(0)):
-                       return decode_bitset(tcp, arg,
-                                       evdev_prop, INPUT_PROP_MAX, "PROP_???");
+                       return decode_bitset(tcp, arg, evdev_prop,
+                                            INPUT_PROP_MAX, "PROP_???");
 # endif
                case _IOC_NR(EVIOCGSND(0)):
-                       return decode_bitset(tcp, arg,
-                                       evdev_snd, SND_MAX, "SND_???");
+                       return decode_bitset(tcp, arg, evdev_snd,
+                                            SND_MAX, "SND_???");
 # ifdef EVIOCGSW
                case _IOC_NR(EVIOCGSW(0)):
-                       return decode_bitset(tcp, arg,
-                                       evdev_switch, SW_MAX, "SW_???");
+                       return decode_bitset(tcp, arg, evdev_switch,
+                                            SW_MAX, "SW_???");
 # endif
                case _IOC_NR(EVIOCGKEY(0)):
-                       return decode_bitset(tcp, arg,
-                                       evdev_keycode, KEY_MAX, "KEY_???");
+                       return decode_bitset(tcp, arg, evdev_keycode,
+                                            KEY_MAX, "KEY_???");
                case _IOC_NR(EVIOCGLED(0)):
-                       return decode_bitset(tcp, arg,
-                                       evdev_leds, LED_MAX, "LED_???");
+                       return decode_bitset(tcp, arg, evdev_leds,
+                                            LED_MAX, "LED_???");
        }
 
        /* multi-number fixed-length commands */
@@ -489,8 +509,8 @@ evdev_write_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
        return 0;
 }
 
-int
-evdev_ioctl(struct tcb *tcp, const unsigned int code, long arg)
+MPERS_PRINTER_DECL(int, evdev_ioctl, struct tcb *tcp,
+                  const unsigned int code, const long arg)
 {
        switch(_IOC_DIR(code)) {
                case _IOC_READ: