/*
* 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
}
static int
-ff_effect_ioctl(struct tcb *tcp, long arg)
+ff_effect_ioctl(struct tcb *const tcp, const kernel_ulong_t arg)
{
tprints(", ");
- struct ff_effect ffe;
+ struct_ff_effect ffe;
if (umove_or_printaddr(tcp, arg, &ffe))
return 1;
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(ptr_to_kulong(ffe.u.periodic.custom_data));
+ tprints("}");
break;
case FF_RUMBLE:
tprintf(", rumble={strong_magnitude=%" PRIu16
}
static int
-abs_ioctl(struct tcb *tcp, long arg)
+abs_ioctl(struct tcb *const tcp, const kernel_ulong_t arg)
{
tprints(", ");
}
static int
-keycode_ioctl(struct tcb *tcp, long arg)
+keycode_ioctl(struct tcb *const tcp, const kernel_ulong_t arg)
{
tprints(", ");
# ifdef EVIOCGKEYCODE_V2
static int
-keycode_V2_ioctl(struct tcb *tcp, long arg)
+keycode_V2_ioctl(struct tcb *const tcp, const kernel_ulong_t arg)
{
tprints(", ");
# endif /* EVIOCGKEYCODE_V2 */
static int
-getid_ioctl(struct tcb *tcp, long arg)
+getid_ioctl(struct tcb *const tcp, const kernel_ulong_t arg)
{
tprints(", ");
}
static int
-decode_bitset(struct tcb *tcp, long arg, const struct xlat decode_nr[],
- const unsigned int max_nr, const char *dflt)
+decode_bitset(struct tcb *const tcp, const kernel_ulong_t arg,
+ const struct xlat decode_nr[], const unsigned int max_nr,
+ const char *const dflt)
{
tprints(", ");
unsigned int size;
- if ((unsigned long) tcp->u_rval > max_nr)
+ if ((kernel_ulong_t) tcp->u_rval > max_nr)
size = max_nr;
else
size = tcp->u_rval;
# ifdef EVIOCGMTSLOTS
static int
-mtslots_ioctl(struct tcb *tcp, const unsigned int code, long arg)
+mtslots_ioctl(struct tcb *const tcp, const unsigned int code,
+ const kernel_ulong_t arg)
{
- const size_t size = _IOC_SIZE(code) / sizeof(int32_t);
- if (!size)
- return 0;
+ tprints(", ");
- int32_t buffer[size];
+ const size_t size = _IOC_SIZE(code) / sizeof(int);
+ if (!size) {
+ printaddr(arg);
+ return 1;
+ }
- if (!verbose(tcp) || umove(tcp, arg, &buffer) < 0)
- return 0;
+ int buffer[size];
- tprints(", {code=");
+ if (umove_or_printaddr(tcp, arg, &buffer))
+ return 1;
+
+ 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 */
# if defined EVIOCGREP || defined EVIOCSREP
static int
-repeat_ioctl(struct tcb *tcp, long arg)
+repeat_ioctl(struct tcb *const tcp, const kernel_ulong_t arg)
{
tprints(", ");
printpair_int(tcp, arg, "%u");
# endif /* EVIOCGREP || EVIOCSREP */
static int
-bit_ioctl(struct tcb *tcp, const unsigned int ev_nr, const long arg)
+bit_ioctl(struct tcb *const tcp, const unsigned int ev_nr,
+ const kernel_ulong_t 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)
+evdev_read_ioctl(struct tcb *const tcp, const unsigned int code,
+ const kernel_ulong_t 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);
case _IOC_NR(EVIOCGPHYS(0)):
case _IOC_NR(EVIOCGUNIQ(0)):
tprints(", ");
- printstr(tcp, arg, tcp->u_rval - 1);
+ if (syserror(tcp))
+ printaddr(arg);
+ else
+ printstrn(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 */
}
static int
-evdev_write_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
+evdev_write_ioctl(struct tcb *const tcp, const unsigned int code,
+ const kernel_ulong_t arg)
{
/* fixed-number fixed-length commands */
switch (code) {
# ifdef EVIOCREVOKE
case EVIOCREVOKE:
# endif
- tprintf(", %lu", arg);
+ tprintf(", %" PRI_klu, arg);
return 1;
# ifdef EVIOCSCLOCKID
case EVIOCSCLOCKID:
return 0;
}
-int
-evdev_ioctl(struct tcb *tcp, const unsigned int code, long arg)
+MPERS_PRINTER_DECL(int, evdev_ioctl, struct tcb *const tcp,
+ const unsigned int code, const kernel_ulong_t arg)
{
- switch(_IOC_DIR(code)) {
+ switch (_IOC_DIR(code)) {
case _IOC_READ:
if (entering(tcp))
return 0;