From e091ba587ee393e7d66149e59a05fd58bdef4337 Mon Sep 17 00:00:00 2001 From: Romain Perier Date: Fri, 20 Jul 2012 17:29:17 +0200 Subject: reverts commit ac70763974e9ba20e6d87c1db7981b4da9cc2456 which breaks the daemon on android. --- Android.mk | 2 +- aib.c | 2 +- aibd.c | 167 +++++++++++++++++++++---------------------------------------- common.h | 3 -- 4 files changed, 59 insertions(+), 115 deletions(-) diff --git a/Android.mk b/Android.mk index 40e3409..60ca990 100644 --- a/Android.mk +++ b/Android.mk @@ -6,7 +6,7 @@ LOCAL_SRC_FILES:= \ common.c \ aibd.c LOCAL_MODULE := aibd -LOCAL_CFLAGS += -fno-strict-aliasing -DAPPNAME=\"aidb\" -std=c99 +LOCAL_CFLAGS += -fno-strict-aliasing -DAPPNAME=\"aidb\" include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) diff --git a/aib.c b/aib.c index 9492bb9..0f6129d 100644 --- a/aib.c +++ b/aib.c @@ -100,7 +100,7 @@ static void wait_evdev_input(int aibd_sock, int inputdev) while (1) { read(inputdev, ev + i, sizeof(struct input_event)); - D("[%lu.%04lu] type 0x%x, code 0x%x, value %d\n", ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type, ev[i].code, ev[i].value); + D("[%lu.%04lu] type %u, code %u, value %d\n", ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type, ev[i].code, ev[i].value); if (ev[i].type == EV_MSC) continue; diff --git a/aibd.c b/aibd.c index 8a3bac9..2cf04ac 100644 --- a/aibd.c +++ b/aibd.c @@ -18,9 +18,7 @@ #include #include #include -#include #include -#include #include #include #include @@ -37,35 +35,9 @@ #define NO_EXTRA_ARGUMENT -1 #define LISTENING_QUEUE_SIZE 4 -static uint16_t evbits[] = { - EV_KEY, - EV_REL, - EV_ABS -}; -static uint16_t relbits[] = { - REL_X, - REL_Y, - REL_WHEEL -}; -static uint16_t keybits[] = { - BTN_LEFT, - BTN_RIGHT, - BTN_MIDDLE, - BTN_TOOL_FINGER, - BTN_TOUCH, - BTN_STYLUS, - BTN_TOOL_DOUBLETAP -}; -static uint16_t absbits[] = { - ABS_MT_TRACKING_ID, - ABS_PRESSURE, - ABS_TOOL_WIDTH, - ABS_MT_POSITION_X, - ABS_MT_POSITION_Y, - ABS_X, - ABS_Y, - ABS_MT_SLOT -}; +static int remote_socks[LISTENING_QUEUE_SIZE]; +static struct input_event events[EVENTS_QUEUE_SIZE]; +static uint32_t buffer[EVENTS_QUEUE_SIZE * 2]; static void usage(char *progname) { @@ -80,12 +52,12 @@ static int forward_events(int uinput, struct input_event *ev) for(i = 0; i < EVENTS_QUEUE_SIZE; i++) { - D("Forwarding event type = 0x%x, code = 0x%x, value = %d to input subsystem\n", ev[i].type, ev[i].code, ev[i].value); + D("Forwarding event type = %u, code = %u, value = %d to input subsystem\n", ev[i].type, ev[i].code, ev[i].value); gettimeofday(&ev[i].time, NULL); ret = write(uinput, ev + i, sizeof(struct input_event)); - if (unlikely(ret != sizeof(struct input_event))) { + if (ret != sizeof(struct input_event)) { fprintf(stderr, "Unable to forward event %u to uinput (ret = %lu)\n", i, ret); } @@ -95,45 +67,41 @@ static int forward_events(int uinput, struct input_event *ev) return 0; } -static void registering_client(int sock, int *remote_socks) +static void connection_closed_by_peer(int sock) { int i; - for (i = 0; i < LISTENING_QUEUE_SIZE; i++) { - if (remote_socks[i] == 0) { - remote_socks[i] = sock; - break; - } - } -} - -static bool unregistering_client(int sock, int *remote_socks) -{ - int i = 0, free_slots = 0; - - for (i = 0; i < LISTENING_QUEUE_SIZE; i++) { - if (remote_socks[i] == sock) { + for (i = 0; i < LISTENING_QUEUE_SIZE; i++) + if (remote_socks[i] == sock) remote_socks[i] = 0; - } else { - free_slots++; - } - } D("Connection closed by peer for sock %d\n", sock); close(sock); - return free_slots == (LISTENING_QUEUE_SIZE - 1); } -static int receive_input_events(int sock, struct input_event *ev, uint32_t size) +static int receive_input_events(int sock, struct input_event *ev) { - int j = 1; - static uint32_t buffer[EVENTS_QUEUE_SIZE * 2]; + int i = 0, j = 1; + uint32_t size; + ssize_t ret; bzero(ev, sizeof(struct input_event) * EVENTS_QUEUE_SIZE); bzero(buffer, sizeof(uint32_t) * EVENTS_QUEUE_SIZE * 2); - recv(sock, buffer, sizeof(uint32_t) * (size + 1), MSG_WAITALL); + ret = recv(sock, &size, sizeof(uint32_t), MSG_PEEK); + if (ret == 0) { + connection_closed_by_peer(sock); + return -1; + } + + size = ntohl(size); + + ret = recv(sock, buffer, sizeof(uint32_t) * (size + 1), MSG_WAITALL); + if (ret == 0) { + connection_closed_by_peer(sock); + return -1; + } - for(int i = 0; i < EVENTS_QUEUE_SIZE; i++) { + for(i = 0; i < EVENTS_QUEUE_SIZE; i++) { buffer[j] = ntohl(buffer[j]); ev[i].type = (buffer[j] >> 16); ev[i].code = buffer[j] & 0xffff; @@ -148,22 +116,28 @@ static int receive_input_events(int sock, struct input_event *ev, uint32_t size) static int input_subsystem_init(void) { - int uinput_fd; - unsigned int i; + int uinput_fd, i; struct uinput_user_dev uidev; ssize_t ret; bzero(&uidev, sizeof(uidev)); + if (getuid() != 0) { + fprintf(stderr, "aibd: root privileges are required to access to input subsystem\n"); + exit(1); + } + uinput_fd = openx("/dev/uinput", O_WRONLY | O_NONBLOCK); - for (i = 0; i < (sizeof(evbits) / sizeof(uint16_t)); i++) - ioctlx(uinput_fd, UI_SET_EVBIT, evbits[i]); - for (i = 0; i < (sizeof(relbits) / sizeof(uint16_t)); i++) - ioctlx(uinput_fd, UI_SET_RELBIT, relbits[i]); - for (i = 0; i < (sizeof(keybits) / sizeof(uint16_t)); i++) - ioctlx(uinput_fd, UI_SET_KEYBIT, keybits[i]); - for (i = 0; i < (sizeof(absbits) / sizeof(uint16_t)); i++) - ioctlx(uinput_fd, UI_SET_ABSBIT, absbits[i]); + ioctlx(uinput_fd, UI_SET_EVBIT, EV_KEY); + ioctlx(uinput_fd, UI_SET_EVBIT, EV_REL); + + ioctlx(uinput_fd, UI_SET_RELBIT, REL_X); + ioctlx(uinput_fd, UI_SET_RELBIT, REL_Y); + ioctlx(uinput_fd, UI_SET_RELBIT, REL_WHEEL); + + ioctlx(uinput_fd, UI_SET_KEYBIT, BTN_LEFT); + ioctlx(uinput_fd, UI_SET_KEYBIT, BTN_RIGHT); + ioctlx(uinput_fd, UI_SET_KEYBIT, BTN_MIDDLE); /* Register all keyboards keys, see linux/input.h */ for(i = 1; i <= 248; i++) @@ -184,22 +158,17 @@ static int input_subsystem_init(void) return uinput_fd; } -static void mainloop(int sock) +static void mainloop(int sock, int uinput) { fd_set readfds; - int ret, maxfd, uinput = 0; - bool uidev_created = false; - int remote_socks[LISTENING_QUEUE_SIZE]; - struct input_event events[EVENTS_QUEUE_SIZE]; + int ret, newsock, i, maxfd; - bzero(remote_socks, sizeof(remote_socks)); - bzero(events, sizeof(events)); while (1) { maxfd = sock; FD_ZERO(&readfds); FD_SET(sock, &readfds); - for (int i = 0; i < LISTENING_QUEUE_SIZE; i++) { + for (i = 0; i < LISTENING_QUEUE_SIZE; i++) { if (remote_socks[i] != 0) { FD_SET(remote_socks[i], &readfds); if (remote_socks[i] > maxfd) @@ -211,44 +180,26 @@ static void mainloop(int sock) ret = select(maxfd + 1, &readfds, NULL, NULL, NULL); } while (ret < 0 && errno == EINTR); - if (unlikely(ret < 0)) { + if (ret < 0) { perror("aibd"); exit(1); } if (FD_ISSET(sock, &readfds)) { D("Incoming connection\n"); - int newsock = accept(sock, NULL, NULL); + newsock = accept(sock, NULL, NULL); - if (unlikely(newsock == -1)) + if (newsock == -1) continue; - registering_client(newsock, remote_socks); - if (uidev_created == false) { - D("Creating virtual input device\n"); - uinput = input_subsystem_init(); - uidev_created = true; - } + for (i = 0; i < LISTENING_QUEUE_SIZE; i++) + if (remote_socks[i] == 0) + remote_socks[i] = newsock; } else { - for (int i = 0; i < LISTENING_QUEUE_SIZE; i++) { + for (i = 0; i < LISTENING_QUEUE_SIZE; i++) { if (FD_ISSET(remote_socks[i], &readfds)) { - ssize_t rret; - uint32_t size; - - rret = recv(remote_socks[i], &size, sizeof(uint32_t), MSG_PEEK); - if (unlikely(rret == 0)) { - bool last_client_unregistered = unregistering_client(remote_socks[i], remote_socks); - if (last_client_unregistered) { - D("Destroying virtual input device\n"); - ioctlx(uinput, UI_DEV_DESTROY, NO_EXTRA_ARGUMENT); - uidev_created = false; - } - break; - } - - size = ntohl(size); - ret = receive_input_events(remote_socks[i], events, size); - if (unlikely(ret == -1)) + ret = receive_input_events(remote_socks[i], events); + if (ret == -1) continue; forward_events(uinput, events); } @@ -289,12 +240,7 @@ int main (int argc, char *argv[]) { char *endptr = NULL; uint16_t port; - int sock; - - if (getuid() != 0) { - fprintf(stderr, "aibd: root privileges are required to access to input subsystem\n"); - exit(1); - } + int sock, uinput; if (argc < 2) usage(argv[0]); @@ -303,8 +249,9 @@ int main (int argc, char *argv[]) if (*endptr != '\0') usage(argv[0]); + uinput = input_subsystem_init(); sock = socket_init(port); - mainloop(sock); + mainloop(sock, uinput); return 0; } diff --git a/common.h b/common.h index 13bb715..7aa4e98 100644 --- a/common.h +++ b/common.h @@ -39,9 +39,6 @@ } \ } while(0) -#define likely(x) __builtin_expect((x), 1) -#define unlikely(x) __builtin_expect((x), 0) - int socketx(int domain, int type, int protocol); int openx(const char *pathname, int flags); void *mallocx(size_t size); -- cgit v1.2.3