18e947fe7161e65625e879a34daf0fc16307e8670Elliott Hughes#include <errno.h>
28e947fe7161e65625e879a34daf0fc16307e8670Elliott Hughes#include <fcntl.h>
38e947fe7161e65625e879a34daf0fc16307e8670Elliott Hughes#include <linux/input.h>
48e947fe7161e65625e879a34daf0fc16307e8670Elliott Hughes#include <stdint.h>
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/ioctl.h>
90badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <unistd.h>
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint sendevent_main(int argc, char *argv[])
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int fd;
14aa907768af7ba9e29901d356cdcac6a436970323Mark Salyzyn    ssize_t ret;
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int version;
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct input_event event;
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(argc != 5) {
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "use: %s device type code value\n", argv[0]);
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    fd = open(argv[1], O_RDWR);
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(fd < 0) {
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "could not open %s, %s\n", argv[optind], strerror(errno));
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (ioctl(fd, EVIOCGVERSION, &version)) {
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "could not get driver version for %s, %s\n", argv[optind], strerror(errno));
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    memset(&event, 0, sizeof(event));
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    event.type = atoi(argv[2]);
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    event.code = atoi(argv[3]);
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    event.value = atoi(argv[4]);
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ret = write(fd, &event, sizeof(event));
37aa907768af7ba9e29901d356cdcac6a436970323Mark Salyzyn    if(ret < (ssize_t) sizeof(event)) {
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "write event failed, %s\n", strerror(errno));
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return -1;
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
43