aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRomain Perier <romain.perier@gmail.com>2012-07-20 17:29:17 +0200
committerRomain Perier <romain.perier@gmail.com>2012-07-20 17:29:17 +0200
commite091ba587ee393e7d66149e59a05fd58bdef4337 (patch)
treecc29991a83f91b25ff38d89342c785e34f842cef
parent2c45bd7a354aad1c6bf54a9a3a21424717d942aa (diff)
downloadandroid-input-bridge-e091ba587ee393e7d66149e59a05fd58bdef4337.tar.gz
reverts commit ac70763974e9ba20e6d87c1db7981b4da9cc2456 which breaks the daemon on android.
-rw-r--r--Android.mk2
-rw-r--r--aib.c2
-rw-r--r--aibd.c167
-rw-r--r--common.h3
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 <stdio.h>
#include <stdlib.h>
#include <stdint.h>
-#include <stdbool.h>
#include <string.h>
-#include <strings.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
@@ -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);