move away from syscall counts towards operation counts
[trinity.git] / ioctls / input.c
blob9e8fe71c3ca55cad0a3b8fde296f7c8467fe8120
1 #include <linux/ioctl.h>
2 #include <linux/input.h>
4 #include "ioctls.h"
5 #include "shm.h"
6 #include "utils.h"
8 static const struct ioctl input_ioctls[] = {
9 IOCTL(EVIOCGVERSION),
10 IOCTL(EVIOCGID),
11 IOCTL(EVIOCGREP),
12 IOCTL(EVIOCSREP),
13 IOCTL(EVIOCGKEYCODE),
14 #ifdef EVIOCGKEYCODE_V2
15 IOCTL(EVIOCGKEYCODE_V2),
16 #endif
17 IOCTL(EVIOCSKEYCODE),
18 #ifdef EVIOCSKEYCODE_V2
19 IOCTL(EVIOCSKEYCODE_V2),
20 #endif
21 IOCTL(EVIOCGNAME(0)),
22 IOCTL(EVIOCGPHYS(0)),
23 IOCTL(EVIOCGUNIQ(0)),
24 #ifdef EVIOCGPROP
25 IOCTL(EVIOCGPROP(0)),
26 #endif
27 #ifdef EVIOCGMTSLOTS
28 IOCTL(EVIOCGMTSLOTS(0)),
29 #endif
30 IOCTL(EVIOCGKEY(0)),
31 IOCTL(EVIOCGLED(0)),
32 IOCTL(EVIOCGSND(0)),
33 IOCTL(EVIOCGSW(0)),
34 IOCTL(EVIOCGBIT(0,0)),
35 IOCTL(EVIOCGABS(0)),
36 IOCTL(EVIOCSABS(0)),
37 IOCTL(EVIOCSFF),
38 IOCTL(EVIOCRMFF),
39 IOCTL(EVIOCGEFFECTS),
40 IOCTL(EVIOCGRAB),
41 #ifdef EVIOCSCLOCKID
42 IOCTL(EVIOCSCLOCKID),
43 #endif
46 static const char *const input_devs[] = {
47 "input",
50 static void input_sanitise(const struct ioctl_group *grp, int childno)
52 unsigned int u, r;
54 pick_random_ioctl(grp, childno);
56 switch (shm->syscall[childno].a2) {
57 case EVIOCGNAME(0):
58 u = rand();
59 shm->syscall[childno].a2 = EVIOCGNAME(u);
60 break;
61 case EVIOCGPHYS(0):
62 u = rand();
63 shm->syscall[childno].a2 = EVIOCGPHYS(u);
64 break;
65 case EVIOCGUNIQ(0):
66 u = rand();
67 shm->syscall[childno].a2 = EVIOCGUNIQ(u);
68 break;
69 #ifdef EVIOCGPROP
70 case EVIOCGPROP(0):
71 u = rand();
72 shm->syscall[childno].a2 = EVIOCGPROP(u);
73 break;
74 #endif
75 #ifdef EVIOCGMTSLOTS
76 case EVIOCGMTSLOTS(0):
77 u = rand();
78 shm->syscall[childno].a2 = EVIOCGMTSLOTS(u);
79 break;
80 #endif
81 case EVIOCGKEY(0):
82 u = rand();
83 shm->syscall[childno].a2 = EVIOCGKEY(u);
84 break;
85 case EVIOCGLED(0):
86 u = rand();
87 shm->syscall[childno].a2 = EVIOCGLED(u);
88 break;
89 case EVIOCGSND(0):
90 u = rand();
91 shm->syscall[childno].a2 = EVIOCGSND(u);
92 break;
93 case EVIOCGSW(0):
94 u = rand();
95 shm->syscall[childno].a2 = EVIOCGSW(u);
96 break;
97 case EVIOCGBIT(0,0):
98 u = rand();
99 r = rand();
100 if (u % 10) u %= EV_CNT;
101 if (r % 10) r /= 4;
102 shm->syscall[childno].a2 = EVIOCGBIT(u, r);
103 break;
104 case EVIOCGABS(0):
105 u = rand();
106 if (u % 10) u %= ABS_CNT;
107 shm->syscall[childno].a2 = EVIOCGABS(u);
108 break;
109 case EVIOCSABS(0):
110 u = rand();
111 if (u % 10) u %= ABS_CNT;
112 shm->syscall[childno].a2 = EVIOCSABS(u);
113 break;
114 default:
115 break;
119 static const struct ioctl_group input_grp = {
120 .devtype = DEV_MISC,
121 .devs = input_devs,
122 .devs_cnt = ARRAY_SIZE(input_devs),
123 .sanitise = input_sanitise,
124 .ioctls = input_ioctls,
125 .ioctls_cnt = ARRAY_SIZE(input_ioctls),
128 REG_IOCTL_GROUP(input_grp)