xref: /aosp_15_r20/external/strace/tests-mx32/ioctl_evdev.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * This file is part of ioctl_evdev strace test.
3*cf84ac9aSAndroid Build Coastguard Worker  *
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016-2018 The strace developers.
6*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
7*cf84ac9aSAndroid Build Coastguard Worker  *
8*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker  * are met:
11*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker  *
19*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker  */
30*cf84ac9aSAndroid Build Coastguard Worker 
31*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
32*cf84ac9aSAndroid Build Coastguard Worker 
33*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_INPUT_H
34*cf84ac9aSAndroid Build Coastguard Worker 
35*cf84ac9aSAndroid Build Coastguard Worker # include <errno.h>
36*cf84ac9aSAndroid Build Coastguard Worker # include <inttypes.h>
37*cf84ac9aSAndroid Build Coastguard Worker # include <stdio.h>
38*cf84ac9aSAndroid Build Coastguard Worker # include <string.h>
39*cf84ac9aSAndroid Build Coastguard Worker # include <sys/ioctl.h>
40*cf84ac9aSAndroid Build Coastguard Worker # include <linux/input.h>
41*cf84ac9aSAndroid Build Coastguard Worker 
42*cf84ac9aSAndroid Build Coastguard Worker # ifndef EV_SW
43*cf84ac9aSAndroid Build Coastguard Worker #  define EV_SW 5
44*cf84ac9aSAndroid Build Coastguard Worker # endif
45*cf84ac9aSAndroid Build Coastguard Worker # ifndef ABS_MT_TOOL_Y
46*cf84ac9aSAndroid Build Coastguard Worker #  define ABS_MT_TOOL_Y 0x3d
47*cf84ac9aSAndroid Build Coastguard Worker # endif
48*cf84ac9aSAndroid Build Coastguard Worker 
49*cf84ac9aSAndroid Build Coastguard Worker static const unsigned int magic = 0xdeadbeef;
50*cf84ac9aSAndroid Build Coastguard Worker static const unsigned long lmagic = (unsigned long) 0xdeadbeefbadc0dedULL;
51*cf84ac9aSAndroid Build Coastguard Worker 
52*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
53*cf84ac9aSAndroid Build Coastguard Worker static void
print_envelope(const struct ff_envelope * const e)54*cf84ac9aSAndroid Build Coastguard Worker print_envelope(const struct ff_envelope *const e)
55*cf84ac9aSAndroid Build Coastguard Worker {
56*cf84ac9aSAndroid Build Coastguard Worker 	printf(", envelope={attack_length=%hu, attack_level=%hu"
57*cf84ac9aSAndroid Build Coastguard Worker 	       ", fade_length=%hu, fade_level=%#hx}",
58*cf84ac9aSAndroid Build Coastguard Worker 	       e->attack_length, e->attack_level,
59*cf84ac9aSAndroid Build Coastguard Worker 	       e->fade_length, e->fade_level);
60*cf84ac9aSAndroid Build Coastguard Worker }
61*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
62*cf84ac9aSAndroid Build Coastguard Worker 
63*cf84ac9aSAndroid Build Coastguard Worker static void
print_ffe_common(const struct ff_effect * const ffe,const char * const type_str)64*cf84ac9aSAndroid Build Coastguard Worker print_ffe_common(const struct ff_effect *const ffe, const char *const type_str)
65*cf84ac9aSAndroid Build Coastguard Worker {
66*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, EVIOCSFF, {type=%s, id=%" PRIu16
67*cf84ac9aSAndroid Build Coastguard Worker 	       ", direction=%" PRIu16 ", ",
68*cf84ac9aSAndroid Build Coastguard Worker 	       type_str, ffe->id, ffe->direction);
69*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
70*cf84ac9aSAndroid Build Coastguard Worker 	printf("trigger={button=%hu, interval=%hu}"
71*cf84ac9aSAndroid Build Coastguard Worker 	       ", replay={length=%hu, delay=%hu}",
72*cf84ac9aSAndroid Build Coastguard Worker 	       ffe->trigger.button, ffe->trigger.interval,
73*cf84ac9aSAndroid Build Coastguard Worker 	       ffe->replay.length, ffe->replay.delay);
74*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
75*cf84ac9aSAndroid Build Coastguard Worker }
76*cf84ac9aSAndroid Build Coastguard Worker 
77*cf84ac9aSAndroid Build Coastguard Worker # define TEST_NULL_ARG_EX(cmd, str)						\
78*cf84ac9aSAndroid Build Coastguard Worker 	do {								\
79*cf84ac9aSAndroid Build Coastguard Worker 		ioctl(-1, cmd, 0);					\
80*cf84ac9aSAndroid Build Coastguard Worker 		printf("ioctl(-1, %s, NULL) = -1 EBADF (%m)\n", str);	\
81*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
82*cf84ac9aSAndroid Build Coastguard Worker 
83*cf84ac9aSAndroid Build Coastguard Worker # define TEST_NULL_ARG(cmd) TEST_NULL_ARG_EX(cmd, #cmd)
84*cf84ac9aSAndroid Build Coastguard Worker 
85*cf84ac9aSAndroid Build Coastguard Worker int
main(void)86*cf84ac9aSAndroid Build Coastguard Worker main(void)
87*cf84ac9aSAndroid Build Coastguard Worker {
88*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGVERSION);
89*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGEFFECTS);
90*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGID);
91*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGKEYCODE);
92*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCSKEYCODE);
93*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCSFF);
94*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCGKEYCODE_V2
95*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGKEYCODE_V2);
96*cf84ac9aSAndroid Build Coastguard Worker # endif
97*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCSKEYCODE_V2
98*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCSKEYCODE_V2);
99*cf84ac9aSAndroid Build Coastguard Worker # endif
100*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCGREP
101*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGREP);
102*cf84ac9aSAndroid Build Coastguard Worker # endif
103*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCSREP
104*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCSREP);
105*cf84ac9aSAndroid Build Coastguard Worker # endif
106*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCSCLOCKID
107*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCSCLOCKID);
108*cf84ac9aSAndroid Build Coastguard Worker # endif
109*cf84ac9aSAndroid Build Coastguard Worker 
110*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGNAME(0));
111*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGPHYS(0));
112*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGUNIQ(0));
113*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGKEY(0));
114*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGLED(0));
115*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCGMTSLOTS
116*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGMTSLOTS(0));
117*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGMTSLOTS(8));
118*cf84ac9aSAndroid Build Coastguard Worker # endif
119*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCGPROP
120*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGPROP(0));
121*cf84ac9aSAndroid Build Coastguard Worker # endif
122*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGSND(0));
123*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCGSW
124*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGSW(0));
125*cf84ac9aSAndroid Build Coastguard Worker # endif
126*cf84ac9aSAndroid Build Coastguard Worker 
127*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGABS(ABS_X));
128*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCSABS(ABS_X));
129*cf84ac9aSAndroid Build Coastguard Worker 
130*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG_EX(EVIOCGABS(0xe), "EVIOCGABS(0xe /* ABS_??? */)");
131*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG_EX(EVIOCSABS(0xe), "EVIOCSABS(0xe /* ABS_??? */)");
132*cf84ac9aSAndroid Build Coastguard Worker 
133*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGABS(ABS_MT_TOOL_Y));
134*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCSABS(ABS_MT_TOOL_Y));
135*cf84ac9aSAndroid Build Coastguard Worker 
136*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG_EX(EVIOCGABS(0x3e), "EVIOCGABS(0x3e /* ABS_??? */)");
137*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG_EX(EVIOCSABS(0x3e), "EVIOCSABS(0x3e /* ABS_??? */)");
138*cf84ac9aSAndroid Build Coastguard Worker 
139*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG_EX(EVIOCGABS(0x3f), "EVIOCGABS(0x3f /* ABS_??? */)");
140*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG_EX(EVIOCSABS(0x3f), "EVIOCSABS(0x3f /* ABS_??? */)");
141*cf84ac9aSAndroid Build Coastguard Worker 
142*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(0, 0));
143*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_KEY, 1));
144*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_REL, 2));
145*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_ABS, 3));
146*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_MSC, 4));
147*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_SW, 5));
148*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_LED, 6));
149*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_SND, 7));
150*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_REP, 8));
151*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_FF, 9));
152*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_PWR, 10));
153*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG(EVIOCGBIT(EV_FF_STATUS, 11));
154*cf84ac9aSAndroid Build Coastguard Worker 
155*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG_EX(EVIOCGBIT(0x6, 12), "EVIOCGBIT(0x6 /* EV_??? */, 12)");
156*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG_EX(EVIOCGBIT(0x18, 13),
157*cf84ac9aSAndroid Build Coastguard Worker 			 "EVIOCGBIT(0x18 /* EV_??? */, 13)");
158*cf84ac9aSAndroid Build Coastguard Worker 	TEST_NULL_ARG_EX(EVIOCGBIT(0x1f, 14),
159*cf84ac9aSAndroid Build Coastguard Worker 			 "EVIOCGBIT(0x1f /* EV_??? */, 14)");
160*cf84ac9aSAndroid Build Coastguard Worker 
161*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCGBIT(EV_MAX, 42), 0);
162*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, EVIOCGBIT(%#x /* EV_??? */, 42), NULL)"
163*cf84ac9aSAndroid Build Coastguard Worker 	       " = -1 EBADF (%m)\n", EV_MAX);
164*cf84ac9aSAndroid Build Coastguard Worker 
165*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCRMFF, lmagic);
166*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, EVIOCRMFF, %d) = -1 EBADF (%m)\n", (int) lmagic);
167*cf84ac9aSAndroid Build Coastguard Worker 
168*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCGRAB, lmagic);
169*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, EVIOCGRAB, %lu) = -1 EBADF (%m)\n", lmagic);
170*cf84ac9aSAndroid Build Coastguard Worker 
171*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCREVOKE
172*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCREVOKE, lmagic);
173*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, EVIOCREVOKE, %lu) = -1 EBADF (%m)\n", lmagic);
174*cf84ac9aSAndroid Build Coastguard Worker # endif
175*cf84ac9aSAndroid Build Coastguard Worker 
176*cf84ac9aSAndroid Build Coastguard Worker 	const unsigned int size = get_page_size();
177*cf84ac9aSAndroid Build Coastguard Worker 	void *const page = tail_alloc(size);
178*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory(page, size);
179*cf84ac9aSAndroid Build Coastguard Worker 
180*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(int, val_int);
181*cf84ac9aSAndroid Build Coastguard Worker 	*val_int = magic;
182*cf84ac9aSAndroid Build Coastguard Worker 
183*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCSCLOCKID
184*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCSCLOCKID, val_int);
185*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, EVIOCSCLOCKID, [%u]) = -1 EBADF (%m)\n", *val_int);
186*cf84ac9aSAndroid Build Coastguard Worker # endif
187*cf84ac9aSAndroid Build Coastguard Worker 
188*cf84ac9aSAndroid Build Coastguard Worker 	int *pair_int = tail_alloc(sizeof(*pair_int) * 2);
189*cf84ac9aSAndroid Build Coastguard Worker 	pair_int[0] = 0xdeadbeef;
190*cf84ac9aSAndroid Build Coastguard Worker 	pair_int[1] = 0xbadc0ded;
191*cf84ac9aSAndroid Build Coastguard Worker 
192*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOSGREP
193*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCSREP, pair_int);
194*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, EVIOCSREP, [%u, %u]) = -1 EBADF (%m)\n",
195*cf84ac9aSAndroid Build Coastguard Worker 	       pair_int[0], pair_int[1]);
196*cf84ac9aSAndroid Build Coastguard Worker # endif
197*cf84ac9aSAndroid Build Coastguard Worker 
198*cf84ac9aSAndroid Build Coastguard Worker 	pair_int[1] = 1;
199*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCSKEYCODE, pair_int);
200*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, EVIOCSKEYCODE, [%u, %s]) = -1 EBADF (%m)\n",
201*cf84ac9aSAndroid Build Coastguard Worker 	       pair_int[0], "KEY_ESC");
202*cf84ac9aSAndroid Build Coastguard Worker 
203*cf84ac9aSAndroid Build Coastguard Worker # ifdef EVIOCSKEYCODE_V2
204*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(struct input_keymap_entry, ike);
205*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory(ike, sizeof(*ike));
206*cf84ac9aSAndroid Build Coastguard Worker 	ike->keycode = 2;
207*cf84ac9aSAndroid Build Coastguard Worker 
208*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCSKEYCODE_V2, ike);
209*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, EVIOCSKEYCODE_V2, {flags=%" PRIu8
210*cf84ac9aSAndroid Build Coastguard Worker 	       ", len=%" PRIu8 ", ", ike->flags, ike->len);
211*cf84ac9aSAndroid Build Coastguard Worker #  if VERBOSE
212*cf84ac9aSAndroid Build Coastguard Worker 	printf("index=%" PRIu16 ", keycode=%s, scancode=[",
213*cf84ac9aSAndroid Build Coastguard Worker 	       ike->index, "KEY_1");
214*cf84ac9aSAndroid Build Coastguard Worker 	unsigned int i;
215*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(ike->scancode); ++i) {
216*cf84ac9aSAndroid Build Coastguard Worker 		if (i > 0)
217*cf84ac9aSAndroid Build Coastguard Worker 			printf(", ");
218*cf84ac9aSAndroid Build Coastguard Worker 		printf("%" PRIx8, ike->scancode[i]);
219*cf84ac9aSAndroid Build Coastguard Worker 	}
220*cf84ac9aSAndroid Build Coastguard Worker 	printf("]");
221*cf84ac9aSAndroid Build Coastguard Worker #  else
222*cf84ac9aSAndroid Build Coastguard Worker 	printf("...");
223*cf84ac9aSAndroid Build Coastguard Worker #  endif
224*cf84ac9aSAndroid Build Coastguard Worker 	errno = EBADF;
225*cf84ac9aSAndroid Build Coastguard Worker 	printf("}) = -1 EBADF (%m)\n");
226*cf84ac9aSAndroid Build Coastguard Worker # endif
227*cf84ac9aSAndroid Build Coastguard Worker 
228*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(struct ff_effect, ffe);
229*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory(ffe, sizeof(*ffe));
230*cf84ac9aSAndroid Build Coastguard Worker 
231*cf84ac9aSAndroid Build Coastguard Worker 	ffe->type = FF_CONSTANT;
232*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCSFF, ffe);
233*cf84ac9aSAndroid Build Coastguard Worker 	print_ffe_common(ffe, "FF_CONSTANT");
234*cf84ac9aSAndroid Build Coastguard Worker 
235*cf84ac9aSAndroid Build Coastguard Worker #  if VERBOSE
236*cf84ac9aSAndroid Build Coastguard Worker 	printf(", constant={level=%hd", ffe->u.constant.level);
237*cf84ac9aSAndroid Build Coastguard Worker 	print_envelope(&ffe->u.constant.envelope);
238*cf84ac9aSAndroid Build Coastguard Worker 	printf("}");
239*cf84ac9aSAndroid Build Coastguard Worker #  else
240*cf84ac9aSAndroid Build Coastguard Worker 	printf("...");
241*cf84ac9aSAndroid Build Coastguard Worker #  endif
242*cf84ac9aSAndroid Build Coastguard Worker 	errno = EBADF;
243*cf84ac9aSAndroid Build Coastguard Worker 	printf("}) = -1 EBADF (%m)\n");
244*cf84ac9aSAndroid Build Coastguard Worker 
245*cf84ac9aSAndroid Build Coastguard Worker #  if VERBOSE
246*cf84ac9aSAndroid Build Coastguard Worker 	ffe->type = FF_RAMP;
247*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCSFF, ffe);
248*cf84ac9aSAndroid Build Coastguard Worker 	print_ffe_common(ffe, "FF_RAMP");
249*cf84ac9aSAndroid Build Coastguard Worker 	printf(", ramp={start_level=%hd, end_level=%hd",
250*cf84ac9aSAndroid Build Coastguard Worker 	       ffe->u.ramp.start_level, ffe->u.ramp.end_level);
251*cf84ac9aSAndroid Build Coastguard Worker 	print_envelope(&ffe->u.ramp.envelope);
252*cf84ac9aSAndroid Build Coastguard Worker 	errno = EBADF;
253*cf84ac9aSAndroid Build Coastguard Worker 	printf("}}) = -1 EBADF (%m)\n");
254*cf84ac9aSAndroid Build Coastguard Worker 
255*cf84ac9aSAndroid Build Coastguard Worker 	ffe->type = FF_PERIODIC;
256*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCSFF, ffe);
257*cf84ac9aSAndroid Build Coastguard Worker 	print_ffe_common(ffe, "FF_PERIODIC");
258*cf84ac9aSAndroid Build Coastguard Worker 	printf(", periodic={waveform=%hu, period=%hu, magnitude=%hd"
259*cf84ac9aSAndroid Build Coastguard Worker 	       ", offset=%hd, phase=%hu",
260*cf84ac9aSAndroid Build Coastguard Worker 	       ffe->u.periodic.waveform, ffe->u.periodic.period,
261*cf84ac9aSAndroid Build Coastguard Worker 	       ffe->u.periodic.magnitude, ffe->u.periodic.offset,
262*cf84ac9aSAndroid Build Coastguard Worker 	       ffe->u.periodic.phase);
263*cf84ac9aSAndroid Build Coastguard Worker 	print_envelope(&ffe->u.periodic.envelope);
264*cf84ac9aSAndroid Build Coastguard Worker 	printf(", custom_len=%u, custom_data=%p}",
265*cf84ac9aSAndroid Build Coastguard Worker 	       ffe->u.periodic.custom_len, ffe->u.periodic.custom_data);
266*cf84ac9aSAndroid Build Coastguard Worker 	errno = EBADF;
267*cf84ac9aSAndroid Build Coastguard Worker 	printf("}) = -1 EBADF (%m)\n");
268*cf84ac9aSAndroid Build Coastguard Worker 
269*cf84ac9aSAndroid Build Coastguard Worker 	ffe->type = FF_RUMBLE;
270*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCSFF, ffe);
271*cf84ac9aSAndroid Build Coastguard Worker 	print_ffe_common(ffe, "FF_RUMBLE");
272*cf84ac9aSAndroid Build Coastguard Worker 	printf(", rumble={strong_magnitude=%hu, weak_magnitude=%hu}",
273*cf84ac9aSAndroid Build Coastguard Worker 	       ffe->u.rumble.strong_magnitude, ffe->u.rumble.weak_magnitude);
274*cf84ac9aSAndroid Build Coastguard Worker 	errno = EBADF;
275*cf84ac9aSAndroid Build Coastguard Worker 	printf("}) = -1 EBADF (%m)\n");
276*cf84ac9aSAndroid Build Coastguard Worker 
277*cf84ac9aSAndroid Build Coastguard Worker 	ffe->type = 0xff;
278*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, EVIOCSFF, ffe);
279*cf84ac9aSAndroid Build Coastguard Worker 	print_ffe_common(ffe, "0xff /* FF_??? */");
280*cf84ac9aSAndroid Build Coastguard Worker 	errno = EBADF;
281*cf84ac9aSAndroid Build Coastguard Worker 	printf("}) = -1 EBADF (%m)\n");
282*cf84ac9aSAndroid Build Coastguard Worker #  endif
283*cf84ac9aSAndroid Build Coastguard Worker 
284*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, _IOC(_IOC_READ, 0x45, 0x1, 0xff), lmagic);
285*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, %s, %#lx) = -1 EBADF (%m)\n",
286*cf84ac9aSAndroid Build Coastguard Worker 	       "_IOC(_IOC_READ, 0x45, 0x1, 0xff)", lmagic);
287*cf84ac9aSAndroid Build Coastguard Worker 
288*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, _IOC(_IOC_WRITE, 0x45, 0x1, 0xff), lmagic);
289*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, %s, %#lx) = -1 EBADF (%m)\n",
290*cf84ac9aSAndroid Build Coastguard Worker 	       "_IOC(_IOC_WRITE, 0x45, 0x1, 0xff)", lmagic);
291*cf84ac9aSAndroid Build Coastguard Worker 
292*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, _IOC(_IOC_READ|_IOC_WRITE, 0x45, 0xfe, 0xff), lmagic);
293*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, %s, %#lx) = -1 EBADF (%m)\n",
294*cf84ac9aSAndroid Build Coastguard Worker 	       "_IOC(_IOC_READ|_IOC_WRITE, 0x45, 0xfe, 0xff)", lmagic);
295*cf84ac9aSAndroid Build Coastguard Worker 
296*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, _IOC(_IOC_READ|_IOC_WRITE, 0x45, 0, 0), lmagic);
297*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, %s, %#lx) = -1 EBADF (%m)\n",
298*cf84ac9aSAndroid Build Coastguard Worker 	       "_IOC(_IOC_READ|_IOC_WRITE, 0x45, 0, 0)", lmagic);
299*cf84ac9aSAndroid Build Coastguard Worker 
300*cf84ac9aSAndroid Build Coastguard Worker 	puts("+++ exited with 0 +++");
301*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
302*cf84ac9aSAndroid Build Coastguard Worker }
303*cf84ac9aSAndroid Build Coastguard Worker #else
304*cf84ac9aSAndroid Build Coastguard Worker 
305*cf84ac9aSAndroid Build Coastguard Worker SKIP_MAIN_UNDEFINED("HAVE_LINUX_INPUT_H")
306*cf84ac9aSAndroid Build Coastguard Worker 
307*cf84ac9aSAndroid Build Coastguard Worker #endif
308