2 * This file is part of ioctl_evdev strace test.
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
5 * Copyright (c) 2016-2019 The strace developers.
8 * SPDX-License-Identifier: GPL-2.0-or-later
13 #ifdef HAVE_LINUX_INPUT_H
16 # include <inttypes.h>
19 # include <sys/ioctl.h>
20 # include <linux/input.h>
25 # ifndef ABS_MT_TOOL_Y
26 # define ABS_MT_TOOL_Y 0x3d
30 # define UNK_CMD(val_, str_) val_
32 # define UNK_CMD(val_, str_) val_ " /* " str_ " */"
35 static const unsigned int magic = 0xdeadbeef;
36 static const unsigned long lmagic = (unsigned long) 0xdeadbeefbadc0dedULL;
40 print_envelope(const struct ff_envelope *const e)
42 printf(", envelope={attack_length=%hu, attack_level=%hu"
43 ", fade_length=%hu, fade_level=%#hx}",
44 e->attack_length, e->attack_level,
45 e->fade_length, e->fade_level);
50 print_ffe_common(const struct ff_effect *const ffe, const char *const type_str)
52 printf("ioctl(-1, %s", XLAT_STR(EVIOCSFF));
53 printf(", {type=%s, id=%" PRIu16
54 ", direction=%" PRIu16 ", ",
55 sprintxlat(type_str, ffe->type, NULL),
56 ffe->id, ffe->direction);
58 printf("trigger={button=%hu, interval=%hu}"
59 ", replay={length=%hu, delay=%hu}",
60 ffe->trigger.button, ffe->trigger.interval,
61 ffe->replay.length, ffe->replay.delay);
65 # define TEST_NULL_ARG_EX(cmd, str) \
68 printf("ioctl(-1, %s, NULL) = -1 EBADF (%m)\n", \
69 sprintxlat(str, cmd, NULL)); \
72 # define TEST_NULL_ARG(cmd) TEST_NULL_ARG_EX(cmd, #cmd)
77 TEST_NULL_ARG(EVIOCGVERSION);
78 TEST_NULL_ARG(EVIOCGEFFECTS);
79 TEST_NULL_ARG(EVIOCGID);
80 TEST_NULL_ARG(EVIOCGKEYCODE);
81 TEST_NULL_ARG(EVIOCSKEYCODE);
82 TEST_NULL_ARG(EVIOCSFF);
83 # ifdef EVIOCGKEYCODE_V2
84 TEST_NULL_ARG(EVIOCGKEYCODE_V2);
86 # ifdef EVIOCSKEYCODE_V2
87 TEST_NULL_ARG(EVIOCSKEYCODE_V2);
90 TEST_NULL_ARG(EVIOCGREP);
93 TEST_NULL_ARG(EVIOCSREP);
96 TEST_NULL_ARG(EVIOCSCLOCKID);
99 TEST_NULL_ARG(EVIOCGNAME(0));
100 TEST_NULL_ARG(EVIOCGPHYS(0));
101 TEST_NULL_ARG(EVIOCGUNIQ(0));
102 TEST_NULL_ARG(EVIOCGKEY(0));
103 TEST_NULL_ARG(EVIOCGLED(0));
104 # ifdef EVIOCGMTSLOTS
105 TEST_NULL_ARG(EVIOCGMTSLOTS(0));
106 TEST_NULL_ARG(EVIOCGMTSLOTS(8));
109 TEST_NULL_ARG(EVIOCGPROP(0));
111 TEST_NULL_ARG(EVIOCGSND(0));
113 TEST_NULL_ARG(EVIOCGSW(0));
116 TEST_NULL_ARG(EVIOCGABS(ABS_X));
117 TEST_NULL_ARG(EVIOCSABS(ABS_X));
119 TEST_NULL_ARG_EX(EVIOCGABS(0xe),
120 "EVIOCGABS(" UNK_CMD("0xe", "ABS_???") ")");
121 TEST_NULL_ARG_EX(EVIOCSABS(0xe),
122 "EVIOCSABS(" UNK_CMD("0xe", "ABS_???") ")");
124 TEST_NULL_ARG(EVIOCGABS(ABS_MT_TOOL_Y));
125 TEST_NULL_ARG(EVIOCSABS(ABS_MT_TOOL_Y));
127 TEST_NULL_ARG_EX(EVIOCGABS(0x3e),
128 "EVIOCGABS(" UNK_CMD("0x3e", "ABS_???") ")");
129 TEST_NULL_ARG_EX(EVIOCSABS(0x3e),
130 "EVIOCSABS(" UNK_CMD("0x3e", "ABS_???") ")");
132 TEST_NULL_ARG_EX(EVIOCGABS(0x3f),
133 "EVIOCGABS(" UNK_CMD("0x3f", "ABS_???") ")");
134 TEST_NULL_ARG_EX(EVIOCSABS(0x3f),
135 "EVIOCSABS(" UNK_CMD("0x3f", "ABS_???") ")");
137 TEST_NULL_ARG(EVIOCGBIT(0, 0));
138 TEST_NULL_ARG(EVIOCGBIT(EV_KEY, 1));
139 TEST_NULL_ARG(EVIOCGBIT(EV_REL, 2));
140 TEST_NULL_ARG(EVIOCGBIT(EV_ABS, 3));
141 TEST_NULL_ARG(EVIOCGBIT(EV_MSC, 4));
142 TEST_NULL_ARG(EVIOCGBIT(EV_SW, 5));
143 TEST_NULL_ARG(EVIOCGBIT(EV_LED, 6));
144 TEST_NULL_ARG(EVIOCGBIT(EV_SND, 7));
145 TEST_NULL_ARG(EVIOCGBIT(EV_REP, 8));
146 TEST_NULL_ARG(EVIOCGBIT(EV_FF, 9));
147 TEST_NULL_ARG(EVIOCGBIT(EV_PWR, 10));
148 TEST_NULL_ARG(EVIOCGBIT(EV_FF_STATUS, 11));
150 TEST_NULL_ARG_EX(EVIOCGBIT(0x6, 12),
151 "EVIOCGBIT(" UNK_CMD("0x6", "EV_???") ", 12)");
152 TEST_NULL_ARG_EX(EVIOCGBIT(0x18, 13),
153 "EVIOCGBIT(" UNK_CMD("0x18", "EV_???") ", 13)");
154 TEST_NULL_ARG_EX(EVIOCGBIT(0x1f, 14),
155 "EVIOCGBIT(" UNK_CMD("0x1f", "EV_???") ", 14)");
157 ioctl(-1, EVIOCGBIT(EV_MAX, 42), 0);
158 printf("ioctl(-1, ");
160 printf("%#x", EVIOCGBIT(EV_MAX, 42));
162 printf("%#x /* EVIOCGBIT(%#x, 42) */", EVIOCGBIT(EV_MAX, 42), EV_MAX);
164 printf("EVIOCGBIT(%#x /* EV_??? */, 42)", EV_MAX);
166 printf(", NULL) = -1 EBADF (%m)\n");
168 ioctl(-1, EVIOCRMFF, lmagic);
169 printf("ioctl(-1, %s, %d) = -1 EBADF (%m)\n",
170 XLAT_STR(EVIOCRMFF), (int) lmagic);
172 ioctl(-1, EVIOCGRAB, lmagic);
173 printf("ioctl(-1, %s, %lu) = -1 EBADF (%m)\n",
174 XLAT_STR(EVIOCGRAB), lmagic);
177 ioctl(-1, EVIOCREVOKE, lmagic);
178 printf("ioctl(-1, %s, %lu) = -1 EBADF (%m)\n",
179 XLAT_STR(EVIOCREVOKE), lmagic);
182 const unsigned int size = get_page_size();
183 void *const page = tail_alloc(size);
184 fill_memory(page, size);
186 TAIL_ALLOC_OBJECT_CONST_PTR(int, val_int);
189 # ifdef EVIOCSCLOCKID
190 ioctl(-1, EVIOCSCLOCKID, val_int);
191 printf("ioctl(-1, %s, [%u]) = -1 EBADF (%m)\n",
192 XLAT_STR(EVIOCSCLOCKID), *val_int);
195 int *pair_int = tail_alloc(sizeof(*pair_int) * 2);
196 pair_int[0] = 0xdeadbeef;
197 pair_int[1] = 0xbadc0ded;
200 ioctl(-1, EVIOCSREP, pair_int);
201 printf("ioctl(-1, %s, [%u, %u]) = -1 EBADF (%m)\n",
202 XLAT_STR(EVIOCSREP), pair_int[0], pair_int[1]);
206 ioctl(-1, EVIOCSKEYCODE, pair_int);
207 printf("ioctl(-1, %s, [%u, %s]) = -1 EBADF (%m)\n",
208 XLAT_STR(EVIOCSKEYCODE), pair_int[0],
209 XLAT_KNOWN(0x1, "KEY_ESC"));
211 # ifdef EVIOCSKEYCODE_V2
212 TAIL_ALLOC_OBJECT_CONST_PTR(struct input_keymap_entry, ike);
213 fill_memory(ike, sizeof(*ike));
216 ioctl(-1, EVIOCSKEYCODE_V2, ike);
217 printf("ioctl(-1, %s, {flags=%" PRIu8 ", len=%" PRIu8 ", ",
218 XLAT_STR(EVIOCSKEYCODE_V2), ike->flags, ike->len);
220 printf("index=%" PRIu16 ", keycode=%s, scancode=[",
221 ike->index, XLAT_STR(KEY_1));
223 for (i = 0; i < ARRAY_SIZE(ike->scancode); ++i) {
226 printf("%" PRIx8, ike->scancode[i]);
233 printf("}) = -1 EBADF (%m)\n");
236 TAIL_ALLOC_OBJECT_CONST_PTR(struct ff_effect, ffe);
237 fill_memory(ffe, sizeof(*ffe));
239 ffe->type = FF_CONSTANT;
240 ioctl(-1, EVIOCSFF, ffe);
241 print_ffe_common(ffe, "FF_CONSTANT");
244 printf(", constant={level=%hd", ffe->u.constant.level);
245 print_envelope(&ffe->u.constant.envelope);
251 printf("}) = -1 EBADF (%m)\n");
255 ioctl(-1, EVIOCSFF, ffe);
256 print_ffe_common(ffe, "FF_RAMP");
257 printf(", ramp={start_level=%hd, end_level=%hd",
258 ffe->u.ramp.start_level, ffe->u.ramp.end_level);
259 print_envelope(&ffe->u.ramp.envelope);
261 printf("}}) = -1 EBADF (%m)\n");
263 ffe->type = FF_PERIODIC;
264 ioctl(-1, EVIOCSFF, ffe);
265 print_ffe_common(ffe, "FF_PERIODIC");
266 printf(", periodic={waveform=%hu, period=%hu, magnitude=%hd"
267 ", offset=%hd, phase=%hu",
268 ffe->u.periodic.waveform, ffe->u.periodic.period,
269 ffe->u.periodic.magnitude, ffe->u.periodic.offset,
270 ffe->u.periodic.phase);
271 print_envelope(&ffe->u.periodic.envelope);
272 printf(", custom_len=%u, custom_data=%p}",
273 ffe->u.periodic.custom_len, ffe->u.periodic.custom_data);
275 printf("}) = -1 EBADF (%m)\n");
277 ffe->type = FF_RUMBLE;
278 ioctl(-1, EVIOCSFF, ffe);
279 print_ffe_common(ffe, "FF_RUMBLE");
280 printf(", rumble={strong_magnitude=%hu, weak_magnitude=%hu}",
281 ffe->u.rumble.strong_magnitude, ffe->u.rumble.weak_magnitude);
283 printf("}) = -1 EBADF (%m)\n");
286 ioctl(-1, EVIOCSFF, ffe);
287 print_ffe_common(ffe,
288 # if !XLAT_RAW && !XLAT_VERBOSE
300 printf("}) = -1 EBADF (%m)\n");
303 ioctl(-1, _IOC(_IOC_READ, 0x45, 0x1, 0xff), lmagic);
304 printf("ioctl(-1, %s, %#lx) = -1 EBADF (%m)\n",
305 XLAT_STR(_IOC(_IOC_READ, 0x45, 0x1, 0xff)), lmagic);
307 ioctl(-1, _IOC(_IOC_WRITE, 0x45, 0x1, 0xff), lmagic);
308 printf("ioctl(-1, %s, %#lx) = -1 EBADF (%m)\n",
309 XLAT_STR(_IOC(_IOC_WRITE, 0x45, 0x1, 0xff)), lmagic);
311 ioctl(-1, _IOC(_IOC_READ|_IOC_WRITE, 0x45, 0xfe, 0xff), lmagic);
312 printf("ioctl(-1, %s, %#lx) = -1 EBADF (%m)\n",
313 XLAT_STR(_IOC(_IOC_READ|_IOC_WRITE, 0x45, 0xfe, 0xff)), lmagic);
315 ioctl(-1, _IOC(_IOC_READ|_IOC_WRITE, 0x45, 0, 0), lmagic);
316 printf("ioctl(-1, %s, %#lx) = -1 EBADF (%m)\n",
317 XLAT_STR(_IOC(_IOC_READ|_IOC_WRITE, 0x45, 0, 0)), lmagic);
319 puts("+++ exited with 0 +++");
324 SKIP_MAIN_UNDEFINED("HAVE_LINUX_INPUT_H")