1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdint.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <dirent.h> 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/ioctl.h> 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/inotify.h> 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/limits.h> 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/poll.h> 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <linux/input.h> 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/log.h> 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic struct pollfd *ufds; 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char **device_names; 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int nfds; 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int open_device(const char *device) 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int version; 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct pollfd *new_ufds; 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char **new_device_names; 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char name[80]; 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char location[80]; 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char idstr[80]; 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct input_id id; 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = open(device, O_RDWR); 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd < 0) { 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ioctl(fd, EVIOCGVERSION, &version)) { 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ioctl(fd, EVIOCGID, &id)) { 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name[sizeof(name) - 1] = '\0'; 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project location[sizeof(location) - 1] = '\0'; 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project idstr[sizeof(idstr) - 1] = '\0'; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) { 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //fprintf(stderr, "could not get device name for %s, %s\n", device, strerror(errno)); 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name[0] = '\0'; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ioctl(fd, EVIOCGPHYS(sizeof(location) - 1), &location) < 1) { 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //fprintf(stderr, "could not get location for %s, %s\n", device, strerror(errno)); 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project location[0] = '\0'; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ioctl(fd, EVIOCGUNIQ(sizeof(idstr) - 1), &idstr) < 1) { 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //fprintf(stderr, "could not get idstring for %s, %s\n", device, strerror(errno)); 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project idstr[0] = '\0'; 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new_ufds = realloc(ufds, sizeof(ufds[0]) * (nfds + 1)); 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(new_ufds == NULL) { 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "out of memory\n"); 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ufds = new_ufds; 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new_device_names = realloc(device_names, sizeof(device_names[0]) * (nfds + 1)); 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(new_device_names == NULL) { 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "out of memory\n"); 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project device_names = new_device_names; 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ufds[nfds].fd = fd; 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ufds[nfds].events = POLLIN; 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project device_names[nfds] = strdup(device); 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nfds++; 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint close_device(const char *device) 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = 1; i < nfds; i++) { 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(strcmp(device_names[i], device) == 0) { 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int count = nfds - i - 1; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(device_names[i]); 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memmove(device_names + i, device_names + i + 1, sizeof(device_names[0]) * count); 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memmove(ufds + i, ufds + i + 1, sizeof(ufds[0]) * count); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nfds--; 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int read_notify(const char *dirname, int nfd) 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int res; 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char devname[PATH_MAX]; 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *filename; 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char event_buf[512]; 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int event_size; 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int event_pos = 0; 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct inotify_event *event; 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = read(nfd, event_buf, sizeof(event_buf)); 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < (int)sizeof(*event)) { 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "could not get event, %s\n", strerror(errno)); 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("got %d bytes of event information\n", res); 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(devname, dirname); 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project filename = devname + strlen(devname); 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *filename++ = '/'; 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(res >= (int)sizeof(*event)) { 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project event = (struct inotify_event *)(event_buf + event_pos); 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : ""); 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(event->len) { 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(filename, event->name); 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(event->mask & IN_CREATE) { 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project open_device(devname); 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close_device(devname); 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project event_size = sizeof(*event) + event->len; 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res -= event_size; 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project event_pos += event_size; 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int scan_dir(const char *dirname) 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char devname[PATH_MAX]; 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *filename; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DIR *dir; 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct dirent *de; 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dir = opendir(dirname); 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(dir == NULL) 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(devname, dirname); 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project filename = devname + strlen(devname); 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *filename++ = '/'; 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((de = readdir(dir))) { 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(de->d_name[0] == '.' && 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (de->d_name[1] == '\0' || 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (de->d_name[1] == '.' && de->d_name[2] == '\0'))) 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(filename, de->d_name); 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project open_device(devname); 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project closedir(dir); 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint init_getevent() 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int res; 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *device_path = "/dev/input"; 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nfds = 1; 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ufds = calloc(1, sizeof(ufds[0])); 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ufds[0].fd = inotify_init(); 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ufds[0].events = POLLIN; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = inotify_add_watch(ufds[0].fd, device_path, IN_DELETE | IN_CREATE); 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = scan_dir(device_path); 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid uninit_getevent() 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = 0; i < nfds; i++) { 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(ufds[i].fd); 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(ufds); 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ufds = 0; 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nfds = 0; 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint get_event(struct input_event* event, int timeout) 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int res; 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pollres; 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *device_path = "/dev/input"; 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(1) { 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pollres = poll(ufds, nfds, timeout); 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (pollres == 0) { 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ufds[0].revents & POLLIN) { 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_notify(device_path, ufds[0].fd); 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = 1; i < nfds; i++) { 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ufds[i].revents) { 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ufds[i].revents & POLLIN) { 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = read(ufds[i].fd, event, sizeof(*event)); 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < (int)sizeof(event)) { 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "could not get event\n"); 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 220