1 /*
2  * Copyright 2002 Red Hat Inc., Durham, North Carolina.
3  *
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation on the rights to use, copy, modify, merge,
10  * publish, distribute, sublicense, and/or sell copies of the Software,
11  * and to permit persons to whom the Software is furnished to do so,
12  * subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial
16  * portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21  * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
22  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25  * SOFTWARE.
26  *
27  * This is a simple test program that reads from /dev/input/event*,
28  * decoding events into a human readable form.
29  */
30 
31 /*
32  * Authors:
33  *   Rickard E. (Rik) Faith <faith@redhat.com>
34  *
35  */
36 
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <unistd.h>
40 #include <string.h>
41 #include <sys/types.h>
42 #include <fcntl.h>
43 #include <errno.h>
44 #include <time.h>
45 #include <linux/input.h>
46 
47 struct input_event event;
48 
49 int
main(int argc,char ** argv)50 main(int argc, char **argv)
51 {
52     char name[64];              /* RATS: Use ok, but could be better */
53     char buf[256] = { 0, };     /* RATS: Use ok */
54     unsigned char mask[EV_MAX / 8 + 1]; /* RATS: Use ok */
55     int version;
56     int fd = 0;
57     int rc;
58     int i, j;
59     const char *tmp;
60 
61 #define test_bit(bit) (mask[(bit)/8] & (1 << ((bit)%8)))
62 
63     for (i = 0; i < 32; i++) {
64         snprintf(name, sizeof(name), "/dev/input/event%d", i);
65         if ((fd = open(name, O_RDONLY, 0)) >= 0) {
66             ioctl(fd, EVIOCGVERSION, &version);
67             ioctl(fd, EVIOCGNAME(sizeof(buf)), buf);
68             ioctl(fd, EVIOCGBIT(0, sizeof(mask)), mask);
69             printf("%s\n", name);
70             printf("    evdev version: %d.%d.%d\n",
71                    version >> 16, (version >> 8) & 0xff, version & 0xff);
72             printf("    name: %s\n", buf);
73             printf("    features:");
74             for (j = 0; j < EV_MAX; j++) {
75                 if (test_bit(j)) {
76                     const char *type = "unknown";
77 
78                     switch (j) {
79                     case EV_KEY:
80                         type = "keys/buttons";
81                         break;
82                     case EV_REL:
83                         type = "relative";
84                         break;
85                     case EV_ABS:
86                         type = "absolute";
87                         break;
88                     case EV_MSC:
89                         type = "reserved";
90                         break;
91                     case EV_LED:
92                         type = "leds";
93                         break;
94                     case EV_SND:
95                         type = "sound";
96                         break;
97                     case EV_REP:
98                         type = "repeat";
99                         break;
100                     case EV_FF:
101                         type = "feedback";
102                         break;
103                     }
104                     printf(" %s", type);
105                 }
106             }
107             printf("\n");
108             close(fd);
109         }
110     }
111 
112     if (argc > 1) {
113         snprintf(name, sizeof(name), "/dev/input/event%d", atoi(argv[1]));
114         if ((fd = open(name, O_RDWR, 0)) >= 0) {
115             printf("%s: open, fd = %d\n", name, fd);
116             for (i = 0; i < LED_MAX; i++) {
117                 event.time.tv_sec = time(0);
118                 event.time.tv_usec = 0;
119                 event.type = EV_LED;
120                 event.code = i;
121                 event.value = 0;
122                 write(fd, &event, sizeof(event));
123             }
124 
125             while ((rc = read(fd, &event, sizeof(event))) > 0) {
126                 printf("%-24.24s.%06lu type 0x%04x; code 0x%04x;"
127                        " value 0x%08x; ",
128                        ctime(&event.time.tv_sec),
129                        event.time.tv_usec, event.type, event.code, event.value);
130                 switch (event.type) {
131                 case EV_KEY:
132                     if (event.code > BTN_MISC) {
133                         printf("Button %d %s",
134                                event.code & 0xff,
135                                event.value ? "press" : "release");
136                     }
137                     else {
138                         printf("Key %d (0x%x) %s",
139                                event.code & 0xff,
140                                event.code & 0xff,
141                                event.value ? "press" : "release");
142                     }
143                     break;
144                 case EV_REL:
145                     switch (event.code) {
146                     case REL_X:
147                         tmp = "X";
148                         break;
149                     case REL_Y:
150                         tmp = "Y";
151                         break;
152                     case REL_HWHEEL:
153                         tmp = "HWHEEL";
154                         break;
155                     case REL_DIAL:
156                         tmp = "DIAL";
157                         break;
158                     case REL_WHEEL:
159                         tmp = "WHEEL";
160                         break;
161                     case REL_MISC:
162                         tmp = "MISC";
163                         break;
164                     default:
165                         tmp = "UNKNOWN";
166                         break;
167                     }
168                     printf("Relative %s %d", tmp, event.value);
169                     break;
170                 case EV_ABS:
171                     switch (event.code) {
172                     case ABS_X:
173                         tmp = "X";
174                         break;
175                     case ABS_Y:
176                         tmp = "Y";
177                         break;
178                     case ABS_Z:
179                         tmp = "Z";
180                         break;
181                     case ABS_RX:
182                         tmp = "RX";
183                         break;
184                     case ABS_RY:
185                         tmp = "RY";
186                         break;
187                     case ABS_RZ:
188                         tmp = "RZ";
189                         break;
190                     case ABS_THROTTLE:
191                         tmp = "THROTTLE";
192                         break;
193                     case ABS_RUDDER:
194                         tmp = "RUDDER";
195                         break;
196                     case ABS_WHEEL:
197                         tmp = "WHEEL";
198                         break;
199                     case ABS_GAS:
200                         tmp = "GAS";
201                         break;
202                     case ABS_BRAKE:
203                         tmp = "BRAKE";
204                         break;
205                     case ABS_HAT0X:
206                         tmp = "HAT0X";
207                         break;
208                     case ABS_HAT0Y:
209                         tmp = "HAT0Y";
210                         break;
211                     case ABS_HAT1X:
212                         tmp = "HAT1X";
213                         break;
214                     case ABS_HAT1Y:
215                         tmp = "HAT1Y";
216                         break;
217                     case ABS_HAT2X:
218                         tmp = "HAT2X";
219                         break;
220                     case ABS_HAT2Y:
221                         tmp = "HAT2Y";
222                         break;
223                     case ABS_HAT3X:
224                         tmp = "HAT3X";
225                         break;
226                     case ABS_HAT3Y:
227                         tmp = "HAT3Y";
228                         break;
229                     case ABS_PRESSURE:
230                         tmp = "PRESSURE";
231                         break;
232                     case ABS_DISTANCE:
233                         tmp = "DISTANCE";
234                         break;
235                     case ABS_TILT_X:
236                         tmp = "TILT_X";
237                         break;
238                     case ABS_TILT_Y:
239                         tmp = "TILT_Y";
240                         break;
241                     case ABS_MISC:
242                         tmp = "MISC";
243                         break;
244                     default:
245                         tmp = "UNKNOWN";
246                         break;
247                     }
248                     printf("Absolute %s %d", tmp, event.value);
249                     break;
250                 case EV_MSC:
251                     printf("Misc");
252                     break;
253                 case EV_LED:
254                     printf("Led");
255                     break;
256                 case EV_SND:
257                     printf("Snd");
258                     break;
259                 case EV_REP:
260                     printf("Rep");
261                     break;
262                 case EV_FF:
263                     printf("FF");
264                     break;
265                     break;
266                 }
267                 printf("\n");
268             }
269             printf("rc = %d, (%s)\n", rc, strerror(errno));
270             close(fd);
271         }
272     }
273     return 0;
274 }
275