14f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa/*
24f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * Copyright (c) 2015 Etienne Gemsa <etienne.gemsa@lse.epita.fr>
34f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
44f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * All rights reserved.
54f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa *
64f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * Redistribution and use in source and binary forms, with or without
74f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * modification, are permitted provided that the following conditions
84f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * are met:
94f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * 1. Redistributions of source code must retain the above copyright
104f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa *    notice, this list of conditions and the following disclaimer.
114f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * 2. Redistributions in binary form must reproduce the above copyright
124f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa *    notice, this list of conditions and the following disclaimer in the
134f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa *    documentation and/or other materials provided with the distribution.
144f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * 3. The name of the author may not be used to endorse or promote products
154f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa *    derived from this software without specific prior written permission.
164f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa *
174f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
184f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
194f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
204f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
214f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
224f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
264f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa */
284f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
294f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "defs.h"
304f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
313460dc486d333231998de0f19918204aacee9ae3Felix Janda#include <linux/ioctl.h>
323460dc486d333231998de0f19918204aacee9ae3Felix Janda
334f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#ifdef HAVE_LINUX_INPUT_H
344f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include <linux/input.h>
354f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_abs.h"
364f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_autorepeat.h"
374f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_ff_status.h"
384f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_ff_types.h"
394f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_keycode.h"
404f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_leds.h"
414f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_misc.h"
424f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_mtslots.h"
434f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_prop.h"
444f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_relative_axes.h"
454f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_snd.h"
464f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_switch.h"
474f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#include "xlat/evdev_sync.h"
484f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
4919dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifndef SYN_MAX
5019dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin# define SYN_MAX 0xf
5119dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
5219dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin
534f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic void
544f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsadecode_envelope(struct ff_envelope *envelope)
554f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
564f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprintf(", envelope={attack_length=%" PRIu16 ", attack_level=%" PRIu16
574f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		", fade_length=%" PRIu16 ", fade_level=%" PRIx32 "}",
584f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		envelope->attack_length,
594f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		envelope->attack_level,
604f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		envelope->fade_length,
614f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		envelope->fade_level);
624f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
634f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
644f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
654f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsaff_effect_ioctl(struct tcb *tcp, long arg)
664f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
674f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	struct ff_effect ffe;
684f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
694f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!verbose(tcp) || umove(tcp, arg, &ffe) < 0)
704f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
714f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
724f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprints(", {type=");
734f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	printxval(evdev_ff_types, ffe.type, "FF_???");
744f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprintf(", id=%" PRIu16 ", direction=%" PRIu16,
754f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		ffe.id, ffe.direction);
764f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
774f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!abbrev(tcp)) {
784f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprintf(", trigger={button=%" PRIu16 ", interval=%" PRIu16 "}",
794f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			ffe.trigger.button, ffe.trigger.interval);
804f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprintf(", replay={lenght=%" PRIu16 ", delay=%" PRIu16 "}",
814f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			ffe.replay.length, ffe.replay.delay);
824f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		switch (ffe.type) {
834f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case FF_CONSTANT:
844f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				tprintf(", constant_ef={%" PRIi16,
854f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.constant.level);
864f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				decode_envelope(&ffe.u.constant.envelope);
874f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				tprints("}");
884f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return 1;
894f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case FF_RAMP:
904f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				tprintf(", ramp={start_level=%" PRIi16
914f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					", end_level=%" PRIi16,
924f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.ramp.start_level,
934f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.ramp.end_level);
944f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				decode_envelope(&ffe.u.ramp.envelope);
954f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				tprints("}");
964f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return 1;
974f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case FF_PERIODIC:
984f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				tprintf(", periodic_ef={waveform=%" PRIu16
994f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					", period=%" PRIu16
1004f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					", magnitude=%" PRIi16
1014f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					", offset=%" PRIi16
1024f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					", phase=%" PRIu16,
1034f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.periodic.waveform,
1044f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.periodic.period,
1054f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.periodic.magnitude,
1064f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.periodic.offset,
1074f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.periodic.phase);
1084f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				decode_envelope(&ffe.u.periodic.envelope);
1094f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				tprintf(", custom_len=%" PRIu32
1104f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					", *custom_data=%#lx}",
1114f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.periodic.custom_len,
1124f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					(unsigned long)ffe.u.periodic.custom_data);
1134f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return 1;
1144f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case FF_RUMBLE:
1154f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				tprintf(", rumble={strong_magnitude=%" PRIu16
1164f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					", weak_magnitude=%" PRIu16 "}",
1174f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.rumble.strong_magnitude,
1184f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					ffe.u.rumble.weak_magnitude);
1194f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return 1;
1204f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case FF_SPRING:
1214f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case FF_FRICTION:
1224f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case FF_DAMPER:
1234f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case FF_INERTIA:
1244f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case FF_CUSTOM:
1254f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				break;
1264f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			default :
1274f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				break;
1284f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		}
1294f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
1304f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1314f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprints(", ...}");
1324f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	return 1;
1334f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
1344f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1354f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
1364f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsaabs_ioctl(struct tcb *tcp, long arg)
1374f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
1384f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	struct input_absinfo absinfo;
1394f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1404f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!verbose(tcp) || umove(tcp, arg, &absinfo) < 0)
1414f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
1424f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1434f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprintf(", {value=%" PRIu32 ", minimum=%" PRIu32,
1444f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		absinfo.value, absinfo.minimum);
1454f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!abbrev(tcp)) {
1464f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprintf(", maximum=%" PRIu32 ", fuzz=%" PRIu32,
1474f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			absinfo.maximum, absinfo.fuzz);
14819dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin		tprintf(", flat=%" PRIu32, absinfo.flat);
14919dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef HAVE_STRUCT_INPUT_ABSINFO_RESOLUTION
15019dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin		tprintf(", resolution=%" PRIu32, absinfo.resolution);
15119dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
1524f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprints("}");
1534f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	} else {
1544f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprints(", ...}");
1554f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
1564f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	return 1;
1574f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
1584f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1594f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
1604f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsakeycode_ioctl(struct tcb *tcp, long arg)
1614f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
1624f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	unsigned int keycode[2];
1634f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1644f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!arg) {
1654f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprints(", NULL");
1664f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 1;
1674f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
1684f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1694f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!verbose(tcp) || umove(tcp, arg, &keycode) < 0)
1704f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
1714f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1724f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprintf(", [%u, ", keycode[0]);
1734f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	printxval(evdev_keycode, keycode[1], "KEY_???");
1744f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprints("]");
1754f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	return 1;
1764f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
1774f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
17819dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCGKEYCODE_V2
1794f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
1804f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsakeycode_V2_ioctl(struct tcb *tcp, long arg)
1814f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
1824f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	struct input_keymap_entry ike;
1834f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1844f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!arg) {
1854f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprints(", NULL");
1864f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 1;
1874f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
1884f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1894f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!verbose(tcp) || umove(tcp, arg, &ike) < 0)
1904f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
1914f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
1927d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin	tprintf(", {flags=%" PRIu8 ", len=%" PRIu8, ike.flags, ike.len);
1934f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!abbrev(tcp)) {
1947d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin		unsigned int i;
1957d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin
1967d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin		tprintf(", index=%" PRIu16 ", keycode=", ike.index);
1977d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin		printxval(evdev_keycode, ike.keycode, "KEY_???");
1987d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin		tprints(", scancode=[");
1997d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin		for (i = 0; i < ARRAY_SIZE(ike.scancode); i++) {
2007d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin			if (i > 0)
2017d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin				tprints(", ");
2027d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin			tprintf("%" PRIx8, ike.scancode[i]);
2037d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin		}
2047d8b41a4f76762228cd1a0a71f642348a7a540c6Dmitry V. Levin		tprints("]}");
2054f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	} else {
2064f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprints(", ...}");
2074f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
2084f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	return 1;
2094f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
21019dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif /* EVIOCGKEYCODE_V2 */
2114f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2124f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
2134f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsagetid_ioctl(struct tcb *tcp, long arg)
2144f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
2154f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	struct input_id id;
2164f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2174f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!verbose(tcp) || umove(tcp, arg, &id) < 0)
2184f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
2194f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2204f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprintf(", {ID_BUS=%" PRIu16 ", ID_VENDOR=%" PRIu16,
2214f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		id.bustype, id.vendor);
2224f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!abbrev(tcp)) {
2234f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprintf(", ID_PRODUCT=%" PRIu16 ", ID_VERSION=%" PRIu16 "}",
2244f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			id.product, id.version);
2254f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	} else {
2264f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprints(", ...}");
2274f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
2284f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	return 1;
2294f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
2304f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2314f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
2324f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsadecode_bitset(struct tcb *tcp, long arg, const struct xlat decode_nr[],
2334f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	      const unsigned int max_nr, const char *dflt)
2344f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
2354f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!verbose(tcp))
2364f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
2374f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2384f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	unsigned int size;
2394f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if ((unsigned long) tcp->u_rval > max_nr)
2404f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		size = max_nr;
2414f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	else
2424f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		size = tcp->u_rval;
2434f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	char decoded_arg[size];
2444f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2454f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (umoven(tcp, arg, size, decoded_arg) < 0)
2464f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
2474f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2484f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprints(", [");
2494f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2504f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	int bit_displayed = 0;
2514f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	int i = next_set_bit(decoded_arg, 0, size);
2524f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (i < 0) {
2534f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprints(" 0 ");
2544f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	} else {
2554f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		printxval(decode_nr, i, dflt);
2564f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2574f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		while ((i = next_set_bit(decoded_arg, i + 1, size)) > 0) {
2584f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			if (abbrev(tcp) && bit_displayed >= 3) {
2594f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				tprints(", ...");
2604f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				break;
2614f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			}
2624f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			tprints(", ");
2634f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			printxval(decode_nr, i, dflt);
2644f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			bit_displayed++;
2654f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		}
2664f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
2674f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2684f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprints("]");
2694f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2704f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	return 1;
2714f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
2724f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
27319dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCGMTSLOTS
2744f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
2754f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsamtslots_ioctl(struct tcb *tcp, const unsigned int code, long arg)
2764f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
2774f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	const size_t size = _IOC_SIZE(code) / sizeof(int32_t);
2784f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!size)
2794f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
2804f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2814f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	int32_t buffer[size];
2824f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2834f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!verbose(tcp) || umove(tcp, arg, &buffer) < 0)
2844f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
2854f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2864f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprints(", {code=");
2874f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	printxval(evdev_mtslots, buffer[0], "ABS_MT_???");
2884f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2894f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	unsigned int i;
2904f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprints(", values=[");
2914f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2924f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	for (i = 1; i < ARRAY_SIZE(buffer); i++)
2934f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		tprintf("%s%d", i > 1 ? ", " : "", buffer[i]);
2944f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
2954f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprints("]}");
2964f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	return 1;
2974f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
29819dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif /* EVIOCGMTSLOTS */
2994f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
30019dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCGREP
3014f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
3024f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsarepeat_ioctl(struct tcb *tcp, long arg)
3034f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
3044f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	unsigned int val[2];
3054f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
3064f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (!verbose(tcp) || umove(tcp, arg, &val) < 0)
3074f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
3084f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
3094f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	tprintf(", [%" PRIu32 " %" PRIu32 "]", val[0], val[1]);
3104f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	return 1;
3114f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
31219dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif /* EVIOCGREP */
3134f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
3144f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
3154f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsaevdev_read_ioctl(struct tcb *tcp, const unsigned int code, long arg)
3164f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
3174f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (entering(tcp))
3184f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 1;
3194f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
3204f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (syserror(tcp))
3214f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 0;
3224f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
3234f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if ((_IOC_NR(code) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) {
3244f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		switch (_IOC_NR(code) - 0x20) {
3254f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_SYN:
3264f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg, evdev_sync,
3274f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						SYN_MAX, "SYN_???");
3284f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_KEY:
3294f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg, evdev_keycode,
3304f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						KEY_MAX, "KEY_???");
3314f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_REL:
3324f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg, evdev_relative_axes,
3334f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						REL_MAX, "REL_???");
3344f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_ABS:
3354f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg,
3364f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						evdev_abs, ABS_MAX, "ABS_???");
3374f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_MSC:
3384f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg,
3394f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						evdev_misc, MSC_MAX, "MSC_???");
34019dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EV_SW
3414f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_SW:
3424f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg,
3434f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						evdev_switch, SW_MAX, "SW_???");
34419dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
3454f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_LED:
3464f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg,
3474f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						evdev_leds, LED_MAX, "LED_???");
3484f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_SND:
3494f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg,
3504f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						evdev_snd, SND_MAX, "SND_???");
3514f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_REP:
3524f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg, evdev_autorepeat,
3534f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						REP_MAX, "REP_???");
3544f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_FF:
3554f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg, evdev_ff_types,
3564f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						FF_MAX, "FF_???");
3574f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_PWR:
3584f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				printnum_int(tcp, arg, "%d");
3594f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return 1;
3604f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			case EV_FF_STATUS:
3614f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return decode_bitset(tcp, arg, evdev_ff_status,
3624f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa						FF_STATUS_MAX, "FF_STATUS_???");
3634f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			default:
3644f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				return 0;
3654f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		}
3664f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
3674f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
3684f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if ((_IOC_NR(code) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0)))
3694f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return abs_ioctl(tcp, arg);
3704f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
3714f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	switch (code) {
3724f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCGVERSION:
3734f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			tprints(", ");
3744f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			printnum_int(tcp, arg, "%" PRIx32);
3754f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return 1;
3764f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCGEFFECTS:
3774f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			tprints(", ");
3784f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			printnum_int(tcp, arg, "%" PRIu32);
3794f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return 1;
3804f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCGID:
3814f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return getid_ioctl(tcp, arg);
38219dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCGREP
3834f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCGREP:
3844f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return repeat_ioctl(tcp, arg);;
38519dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
3864f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCGKEYCODE:
3874f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return keycode_ioctl(tcp, arg);
38819dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCGKEYCODE_V2
3894f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCGKEYCODE_V2:
3904f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return keycode_V2_ioctl(tcp, arg);
39119dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
3924f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
3934f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
3944f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	switch (_IOC_NR(code)) {
39519dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCGMTSLOTS
3964f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_NR(EVIOCGMTSLOTS(0)):
3974f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return mtslots_ioctl(tcp, code, arg);
39819dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
3994f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_NR(EVIOCGNAME(0)):
4004f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_NR(EVIOCGPHYS(0)):
4014f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_NR(EVIOCGUNIQ(0)):
4024f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			tprints(", ");
4034f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			printstr(tcp, arg, tcp->u_rval - 1);
4044f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return 1;
40519dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCGPROP
4064f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_NR(EVIOCGPROP(0)):
4074f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return decode_bitset(tcp, arg,
4084f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					evdev_prop, INPUT_PROP_MAX, "PROP_???");
40919dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
4104f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_NR(EVIOCGSND(0)):
4114f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return decode_bitset(tcp, arg,
4124f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					evdev_snd, SND_MAX, "SND_???");
41319dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCGSW
4144f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_NR(EVIOCGSW(0)):
4154f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return decode_bitset(tcp, arg,
4164f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					evdev_switch, SW_MAX, "SW_???");
41719dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
4184f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_NR(EVIOCGKEY(0)):
4194f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return decode_bitset(tcp, arg,
4204f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					evdev_keycode, KEY_MAX, "KEY_???");
4214f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_NR(EVIOCGLED(0)):
4224f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return decode_bitset(tcp, arg,
4234f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa					evdev_leds, LED_MAX, "LED_???");
4244f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		default:
4254f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return 0;
4264f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
4274f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
4284f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
4294f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsastatic int
4304f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsaevdev_write_ioctl(struct tcb *tcp, const unsigned int code, long arg)
4314f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
4324f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if (exiting(tcp))
4334f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return 1;
4344f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
4354f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	if ((_IOC_NR(code) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0)))
4364f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		return abs_ioctl(tcp, arg);
4374f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
4384f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	switch (code) {
43919dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCSREP
4404f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCSREP:
4414f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return repeat_ioctl(tcp, arg);
44219dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
4434f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCSKEYCODE:
4444f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return keycode_ioctl(tcp, arg);
44519dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCSKEYCODE_V2
4464f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCSKEYCODE_V2:
4474f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return keycode_V2_ioctl(tcp, arg);
44819dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
4494f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCSFF:
4504f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return ff_effect_ioctl(tcp, arg);
4514f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCRMFF:
45219dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCSCLOCKID
4534f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCSCLOCKID:
45419dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
4554f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCGRAB:
45619dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#ifdef EVIOCREVOKE
4574f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case EVIOCREVOKE:
45819dadf94015523c6b8b7a2a0a8daff4151dafb07Dmitry V. Levin#endif
4594f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			tprints(", ");
4604f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			printnum_int(tcp, arg, "%u");
4614f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return 1;
4624f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		default:
4634f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return 0;
4644f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
4654f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
4664f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
4674f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsaint
4684f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsaevdev_ioctl(struct tcb *tcp, const unsigned int code, long arg)
4694f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa{
4704f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	switch(_IOC_DIR(code)) {
4714f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_READ:
4724f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return evdev_read_ioctl(tcp, code, arg);
4734f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		case _IOC_WRITE:
4744f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			if (!evdev_write_ioctl(tcp, code, arg))
4754f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa				tprintf(", %lx", arg);
4764f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return 1;
4774f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa		default:
4784f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa			return 0;
4794f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa	}
4804f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa}
4814f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa
4824f750b9ad1bb870337395355047ac2f89f340febEtienne Gemsa#endif /* HAVE_LINUX_INPUT_H */
483