# HG changeset patch # User John Tsiombikas # Date 1410767851 -10800 # Node ID 9e260c091f75bec6b3860af39ff3a57a3e2e0023 # Parent a32b151fb3c6c7404bfd3e50e33ee110c422bbed wrote some server code in the test input tool diff -r a32b151fb3c6 -r 9e260c091f75 inptools/test/src/main.c --- a/inptools/test/src/main.c Thu Sep 11 00:08:23 2014 +0300 +++ b/inptools/test/src/main.c Mon Sep 15 10:57:31 2014 +0300 @@ -15,7 +15,7 @@ #include "proto.h" struct client { - int s; + int active; struct sockaddr_in addr; struct client *next; }; @@ -24,10 +24,15 @@ int handle_js(int fd); int start_srv(int port); int handle_net(int s); +int respond(int s, int rsp, struct sockaddr_in *sa); +int respond_msg(int s, struct message *msg, struct sockaddr_in *sa); +struct client *add_client(struct sockaddr_in *addr); +struct client *find_client(struct sockaddr_in *addr); static int opt_dport = DEF_PORT; static const char *opt_jspath = "/dev/input/js0"; +static int sock = -1; static struct client *clients; static int js_num_axes; @@ -37,7 +42,7 @@ int main(int argc, char **argv) { - int js, sock; + int js; int maxfd; if((js = open_js(opt_jspath)) == -1) { @@ -80,7 +85,7 @@ fprintf(stderr, "failed to open js device: %s: %s\n", jspath, strerror(errno)); return -1; } - fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); + /*fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);*/ if(ioctl(fd, JSIOCGAXES, &axes) == -1) { fprintf(stderr, "failed to get number of joystick axes\n"); @@ -137,8 +142,9 @@ m.data.event.x = js_axis_state[0]; m.data.event.y = js_num_axes > 1 ? js_axis_state[1] : 0; m.data.event.z = js_num_axes > 2 ? js_axis_state[2] : 0; + m.data.event.bnmask = js_bn_state; - sendto(c->s, &m, sizeof m, 0, (struct sockaddr*)&c->addr, sizeof c->addr); + sendto(sock, &m, sizeof m, 0, (struct sockaddr*)&c->addr, sizeof c->addr); c = c->next; } return 0; @@ -168,7 +174,106 @@ return s; } + int handle_net(int s) { + struct message msg; + struct sockaddr_in addr; + socklen_t addrlen = sizeof addr; + struct client *c; + + if(recvfrom(s, &msg, sizeof msg, 0, (struct sockaddr*)&addr, &addrlen) < sizeof addr) { + perror("failed to recieve message"); + return -1; + } + if(msg.magic != MAGIC) { + fprintf(stderr, "received magic is not good\n"); + return -1; + } + + c = find_client(&addr); + + switch(msg.type) { + case REQ_DISCOVER: + /* a client is looking for us */ + msg.type = RSP_OK; + strcat(msg.data.raw, "test-input"); + if(respond_msg(s, &msg, &addr) == -1) { + return -1; + } + break; + + case REQ_START: + if(!c) { + if(!(c = add_client(&addr))) { + respond(s, RSP_ERR, &addr); + return -1; + } + } + c->active = 1; + if(respond(s, RSP_OK, &addr) == -1) { + return -1; + } + break; + + case REQ_STOP: + if(c) { + c->active = 0; + } + if(respond(s, RSP_OK, &addr) == -1) { + return -1; + } + break; + + default: + break; + } + return 0; } + +int respond(int s, int rsp, struct sockaddr_in *sa) +{ + struct message m; + memset(&m, 0, sizeof m); + m.magic = MAGIC; + m.type = rsp; + + return respond_msg(s, &m, sa); +} + +int respond_msg(int s, struct message *msg, struct sockaddr_in *sa) +{ + if(sendto(s, &msg, sizeof msg, 0, (struct sockaddr*)sa, sizeof *sa) == -1) { + perror("failed to send response"); + return -1; + } + return 0; +} + +struct client *add_client(struct sockaddr_in *addr) +{ + struct client *c; + + if(!(c = calloc(1, sizeof *c))) { + perror("failed to add client"); + return 0; + } + c->addr = *addr; + c->next = clients; + clients = c; + return c; +} + +struct client *find_client(struct sockaddr_in *addr) +{ + struct client *c = clients; + while(c) { + if(c->addr.sin_addr.s_addr == addr->sin_addr.s_addr && + c->addr.sin_port == addr->sin_port) { + return c; + } + c = c->next; + } + return 0; +} diff -r a32b151fb3c6 -r 9e260c091f75 src/inpclient.cc --- a/src/inpclient.cc Thu Sep 11 00:08:23 2014 +0300 +++ b/src/inpclient.cc Mon Sep 15 10:57:31 2014 +0300 @@ -121,17 +121,6 @@ } setsockopt(s, SOL_SOCKET, SO_BROADCAST, &true_val, sizeof true_val); - memset(&sa, 0, sizeof sa); - sa.sin_family = AF_INET; - sa.sin_port = htons(opt_dport); - sa.sin_addr.s_addr = htonl(INADDR_ANY); - - if(bind(s, (struct sockaddr*)&sa, sizeof sa) == -1) { - perror("failed to bind datagram socket"); - close(s); - return -1; - } - do { fd_set rdset;