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