]> granicus.if.org Git - strace/blob - tests/ioctl_evdev.c
Remove XLAT_END
[strace] / tests / ioctl_evdev.c
1 /*
2  * This file is part of ioctl_evdev strace test.
3  *
4  * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
5  * Copyright (c) 2016-2019 The strace developers.
6  * All rights reserved.
7  *
8  * SPDX-License-Identifier: GPL-2.0-or-later
9  */
10
11 #include "tests.h"
12
13 #ifdef HAVE_LINUX_INPUT_H
14
15 # include <errno.h>
16 # include <inttypes.h>
17 # include <stdio.h>
18 # include <string.h>
19 # include <sys/ioctl.h>
20 # include <linux/input.h>
21
22 # ifndef EV_SW
23 #  define EV_SW 5
24 # endif
25 # ifndef ABS_MT_TOOL_Y
26 #  define ABS_MT_TOOL_Y 0x3d
27 # endif
28
29 # if XLAT_VERBOSE
30 #  define UNK_CMD(val_, str_) val_
31 # else
32 #  define UNK_CMD(val_, str_) val_ " /* " str_ " */"
33 # endif
34
35 static const unsigned int magic = 0xdeadbeef;
36 static const unsigned long lmagic = (unsigned long) 0xdeadbeefbadc0dedULL;
37
38 # if VERBOSE
39 static void
40 print_envelope(const struct ff_envelope *const e)
41 {
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);
46 }
47 # endif /* VERBOSE */
48
49 static void
50 print_ffe_common(const struct ff_effect *const ffe, const char *const type_str)
51 {
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);
57 # if VERBOSE
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);
62 # endif /* VERBOSE */
63 }
64
65 # define TEST_NULL_ARG_EX(cmd, str)                                     \
66         do {                                                            \
67                 ioctl(-1, cmd, 0);                                      \
68                 printf("ioctl(-1, %s, NULL) = -1 EBADF (%m)\n",         \
69                        sprintxlat(str, cmd, NULL));                     \
70         } while (0)
71
72 # define TEST_NULL_ARG(cmd) TEST_NULL_ARG_EX(cmd, #cmd)
73
74 int
75 main(void)
76 {
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);
85 # endif
86 # ifdef EVIOCSKEYCODE_V2
87         TEST_NULL_ARG(EVIOCSKEYCODE_V2);
88 # endif
89 # ifdef EVIOCGREP
90         TEST_NULL_ARG(EVIOCGREP);
91 # endif
92 # ifdef EVIOCSREP
93         TEST_NULL_ARG(EVIOCSREP);
94 # endif
95 # ifdef EVIOCSCLOCKID
96         TEST_NULL_ARG(EVIOCSCLOCKID);
97 # endif
98
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));
107 # endif
108 # ifdef EVIOCGPROP
109         TEST_NULL_ARG(EVIOCGPROP(0));
110 # endif
111         TEST_NULL_ARG(EVIOCGSND(0));
112 # ifdef EVIOCGSW
113         TEST_NULL_ARG(EVIOCGSW(0));
114 # endif
115
116         TEST_NULL_ARG(EVIOCGABS(ABS_X));
117         TEST_NULL_ARG(EVIOCSABS(ABS_X));
118
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_???") ")");
123
124         TEST_NULL_ARG(EVIOCGABS(ABS_MT_TOOL_Y));
125         TEST_NULL_ARG(EVIOCSABS(ABS_MT_TOOL_Y));
126
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_???") ")");
131
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_???") ")");
136
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));
149
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)");
156
157         ioctl(-1, EVIOCGBIT(EV_MAX, 42), 0);
158         printf("ioctl(-1, ");
159 # if XLAT_RAW
160         printf("%#x", EVIOCGBIT(EV_MAX, 42));
161 # elif XLAT_VERBOSE
162         printf("%#x /* EVIOCGBIT(%#x, 42) */", EVIOCGBIT(EV_MAX, 42), EV_MAX);
163 # else
164         printf("EVIOCGBIT(%#x /* EV_??? */, 42)", EV_MAX);
165 # endif
166         printf(", NULL) = -1 EBADF (%m)\n");
167
168         ioctl(-1, EVIOCRMFF, lmagic);
169         printf("ioctl(-1, %s, %d) = -1 EBADF (%m)\n",
170                XLAT_STR(EVIOCRMFF), (int) lmagic);
171
172         ioctl(-1, EVIOCGRAB, lmagic);
173         printf("ioctl(-1, %s, %lu) = -1 EBADF (%m)\n",
174                XLAT_STR(EVIOCGRAB), lmagic);
175
176 # ifdef EVIOCREVOKE
177         ioctl(-1, EVIOCREVOKE, lmagic);
178         printf("ioctl(-1, %s, %lu) = -1 EBADF (%m)\n",
179                XLAT_STR(EVIOCREVOKE), lmagic);
180 # endif
181
182         const unsigned int size = get_page_size();
183         void *const page = tail_alloc(size);
184         fill_memory(page, size);
185
186         TAIL_ALLOC_OBJECT_CONST_PTR(int, val_int);
187         *val_int = magic;
188
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);
193 # endif
194
195         int *pair_int = tail_alloc(sizeof(*pair_int) * 2);
196         pair_int[0] = 0xdeadbeef;
197         pair_int[1] = 0xbadc0ded;
198
199 # ifdef EVIOSGREP
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]);
203 # endif
204
205         pair_int[1] = 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"));
210
211 # ifdef EVIOCSKEYCODE_V2
212         TAIL_ALLOC_OBJECT_CONST_PTR(struct input_keymap_entry, ike);
213         fill_memory(ike, sizeof(*ike));
214         ike->keycode = 2;
215
216         ioctl(-1, EVIOCSKEYCODE_V2, ike);
217         printf("ioctl(-1, %s, {flags=%" PRIu8 ", len=%" PRIu8 ", ",
218                XLAT_STR(EVIOCSKEYCODE_V2), ike->flags, ike->len);
219 #  if VERBOSE
220         printf("index=%" PRIu16 ", keycode=%s, scancode=[",
221                ike->index, XLAT_STR(KEY_1));
222         unsigned int i;
223         for (i = 0; i < ARRAY_SIZE(ike->scancode); ++i) {
224                 if (i > 0)
225                         printf(", ");
226                 printf("%" PRIx8, ike->scancode[i]);
227         }
228         printf("]");
229 #  else
230         printf("...");
231 #  endif
232         errno = EBADF;
233         printf("}) = -1 EBADF (%m)\n");
234 # endif
235
236         TAIL_ALLOC_OBJECT_CONST_PTR(struct ff_effect, ffe);
237         fill_memory(ffe, sizeof(*ffe));
238
239         ffe->type = FF_CONSTANT;
240         ioctl(-1, EVIOCSFF, ffe);
241         print_ffe_common(ffe, "FF_CONSTANT");
242
243 # if VERBOSE
244         printf(", constant={level=%hd", ffe->u.constant.level);
245         print_envelope(&ffe->u.constant.envelope);
246         printf("}");
247 # else
248         printf("...");
249 # endif
250         errno = EBADF;
251         printf("}) = -1 EBADF (%m)\n");
252
253 # if VERBOSE
254         ffe->type = FF_RAMP;
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);
260         errno = EBADF;
261         printf("}}) = -1 EBADF (%m)\n");
262
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);
274         errno = EBADF;
275         printf("}) = -1 EBADF (%m)\n");
276
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);
282         errno = EBADF;
283         printf("}) = -1 EBADF (%m)\n");
284
285         ffe->type = 0xff;
286         ioctl(-1, EVIOCSFF, ffe);
287         print_ffe_common(ffe,
288 #  if !XLAT_RAW && !XLAT_VERBOSE
289                 "0xff"
290 #  endif
291 #  if !XLAT_VERBOSE
292                 " /* "
293 #  endif
294                 "FF_???"
295 #  if !XLAT_VERBOSE
296                 " */"
297 #  endif
298                 );
299         errno = EBADF;
300         printf("}) = -1 EBADF (%m)\n");
301 # endif
302
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);
306
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);
310
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);
314
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);
318
319         puts("+++ exited with 0 +++");
320         return 0;
321 }
322 #else
323
324 SKIP_MAIN_UNDEFINED("HAVE_LINUX_INPUT_H")
325
326 #endif