server is mostly done

This commit is contained in:
viandoxdev 2022-08-30 18:28:29 +02:00
parent afe99fc054
commit fd719fc1b1
No known key found for this signature in database
GPG Key ID: AF1410C5BC10AA25
5 changed files with 147 additions and 26 deletions

0
client.c Normal file
View File

7
hid.c
View File

@ -57,6 +57,13 @@ void setup_device(PhysicalDevice *dev) {
dev->device_info.rel_count = 0; dev->device_info.rel_count = 0;
dev->device_info.key_count = 0; dev->device_info.key_count = 0;
for(int i = 0; i < ABS_CNT; i++)
dev->mapping.abs_indices[i] = -1;
for(int i = 0; i < REL_CNT; i++)
dev->mapping.key_indices[i] = -1;
for(int i = 0; i < KEY_CNT; i++)
dev->mapping.key_indices[i] = -1;
uint8_t bits[EV_MAX] = {}; uint8_t bits[EV_MAX] = {};
uint8_t feat_bits[KEY_MAX] = {}; uint8_t feat_bits[KEY_MAX] = {};
ioctl(dev->event, EVIOCGBIT(0, EV_MAX), bits); ioctl(dev->event, EVIOCGBIT(0, EV_MAX), bits);

80
net.c
View File

@ -1,4 +1,5 @@
#include "net.h" #include "net.h"
#include <stdio.h>
Message msg_device_info() { Message msg_device_info() {
MessageDeviceInfo m; MessageDeviceInfo m;
@ -17,18 +18,20 @@ int msg_deserialize(const uint8_t *buf, size_t len, Message *dst) {
uint8_t code_byte = buf[0]; uint8_t code_byte = buf[0];
MessageCode code = (MessageCode)code_byte; MessageCode code = (MessageCode)code_byte;
uint8_t abs, rel, key;
switch (code) { switch (code) {
case DeviceInfo: case DeviceInfo:
if (len < 3) if (len < 3)
return -1; return -1;
uint8_t abs = buf[1]; abs = buf[1];
uint8_t rel = buf[2]; rel = buf[2];
uint8_t key = buf[3]; key = buf[3];
buf += 4; buf += 4;
if (MSS_DEVICE_INFO(abs, rel, key) > len) if (MSS_DEVICE_INFO(abs, rel, key) > len)
return -1; return -1;
dst->code = code; dst->device_info.code = code;
dst->device_info.abs_count = abs; dst->device_info.abs_count = abs;
dst->device_info.rel_count = rel; dst->device_info.rel_count = rel;
dst->device_info.key_count = key; dst->device_info.key_count = key;
@ -55,9 +58,34 @@ int msg_deserialize(const uint8_t *buf, size_t len, Message *dst) {
return 0; return 0;
case DeviceReport: case DeviceReport:
if (len < MSS_DEVICE_REPORT) if (len < 3)
return -1; return -1;
dst->code = code;
abs = buf[1];
rel = buf[2];
key = buf[3];
buf += 4;
if (len < MSS_DEVICE_REPORT(abs, rel, key))
return -1;
dst->device_report.code = code;
dst->device_report.abs_count = abs;
dst->device_report.rel_count = rel;
dst->device_report.key_count = key;
for (int i = 0; i < abs; i++) {
dst->device_report.abs[i] = *(uint32_t *)buf;
buf += 4;
}
for (int i = 0; i < rel; i++) {
dst->device_report.rel[i] = *(uint32_t *)buf;
buf += 4;
}
for (int i = 0; i < key; i++)
dst->device_report.key[i] = *(buf++);
return 0; return 0;
case DeviceDestroy: case DeviceDestroy:
if (len < MSS_DEVICE_DESTROY) if (len < MSS_DEVICE_DESTROY)
@ -82,18 +110,19 @@ int msg_deserialize(const uint8_t *buf, size_t len, Message *dst) {
} }
} }
// The indices have to match with msg_deserialize
int msg_serialize(uint8_t *buf, size_t len, Message *msg) { int msg_serialize(uint8_t *buf, size_t len, Message *msg) {
// If len is 0 we can't serialize any message // If len is 0 we can't serialize any message
if (len-- == 0) if (len-- == 0)
return -1; return -1;
uint8_t abs, rel, key;
switch (msg->code) { switch (msg->code) {
case DeviceInfo:; // semicolon needed here case DeviceInfo:
uint8_t abs = msg->device_info.abs_count; abs = msg->device_info.abs_count;
uint8_t rel = msg->device_info.rel_count; rel = msg->device_info.rel_count;
uint8_t key = msg->device_info.key_count; key = msg->device_info.key_count;
if (len < MSS_DEVICE_INFO(abs, rel, len)) if (len < MSS_DEVICE_INFO(abs, rel, key))
return -1; return -1;
buf[0] = (uint8_t)msg->code; buf[0] = (uint8_t)msg->code;
@ -123,11 +152,31 @@ int msg_serialize(uint8_t *buf, size_t len, Message *msg) {
return MSS_DEVICE_INFO(abs, rel, key) + 1; return MSS_DEVICE_INFO(abs, rel, key) + 1;
case DeviceReport: case DeviceReport:
if (len < MSS_DEVICE_REPORT) abs = msg->device_report.abs_count;
rel = msg->device_report.rel_count;
key = msg->device_report.key_count;
if (len < MSS_DEVICE_REPORT(abs, rel, key))
return -1; return -1;
buf[0] = (uint8_t)msg->code; buf[0] = (uint8_t)msg->code;
return MSS_DEVICE_REPORT + 1; buf[1] = abs;
buf[2] = rel;
buf[3] = key;
buf += 4;
for (int i = 0; i < abs; i++) {
*(uint32_t *)buf = msg->device_report.abs[i];
buf += 4;
}
for (int i = 0; i < rel; i++) {
*(uint32_t *)buf = msg->device_report.rel[i];
buf += 4;
}
for (int i = 0; i < key; i++)
*(buf++) = msg->device_report.key[i];
return MSS_DEVICE_REPORT(abs, rel, key) + 1;
case DeviceDestroy: case DeviceDestroy:
if (len < MSS_DEVICE_DESTROY) if (len < MSS_DEVICE_DESTROY)
return -1; return -1;
@ -148,6 +197,7 @@ int msg_serialize(uint8_t *buf, size_t len, Message *msg) {
buf[7] = msg->controller_state.flash_off; buf[7] = msg->controller_state.flash_off;
return MSS_CONTROLLER_STATE + 1; return MSS_CONTROLLER_STATE + 1;
default: default:
printf("ERR(msg_serialize): Trying to serialize unknown message of code %d\n", msg->code);
return -1; return -1;
} }
} }

11
net.h
View File

@ -12,6 +12,7 @@ typedef enum {
ControllerState = 4, ControllerState = 4,
} MessageCode; } MessageCode;
// TODO: replace counts by uint16_t
typedef struct { typedef struct {
MessageCode code; MessageCode code;
@ -36,8 +37,16 @@ typedef struct {
typedef struct { typedef struct {
MessageCode code; MessageCode code;
uint8_t abs_count;
uint8_t rel_count;
uint8_t key_count;
uint32_t abs[ABS_CNT];
uint32_t rel[REL_CNT];
uint8_t key[KEY_CNT];
} MessageDeviceReport; } MessageDeviceReport;
#define MSS_DEVICE_REPORT 0 #define MSS_DEVICE_REPORT(abs, rel, key) (3 + abs * 4 + rel * 4 + key * 1)
typedef struct { typedef struct {
MessageCode code; MessageCode code;

View File

@ -47,18 +47,28 @@ void *server_handle_conn(void *args_) {
int len = msg_serialize(buf, 2048, (Message *)&dev.device_info); int len = msg_serialize(buf, 2048, (Message *)&dev.device_info);
write(args->socket, buf, len); write(args->socket, buf, len);
struct pollfd pfd[2] = {}; struct pollfd pfds[2] = {};
pfd[0].fd = args->socket; struct pollfd *socket_poll = &pfds[0];
pfd[0].events = POLLIN; struct pollfd *event_poll = &pfds[1];
pfd[1].fd = dev.event;
pfd[1].events = POLLIN; socket_poll->fd = args->socket;
socket_poll->events = POLLIN;
event_poll->fd = dev.event;
event_poll->events = POLLIN;
MessageDeviceReport report = {};
report.code = DeviceReport;
report.abs_count = dev.device_info.abs_count;
report.rel_count = dev.device_info.rel_count;
report.key_count = dev.device_info.key_count;
while (1) { while (1) {
int rc = poll(pfd, 1, -1); int rc = poll(pfds, 2, -1);
if (rc < 0) // error (connection closed) if (rc < 0) // error (connection closed)
goto conn_end; goto conn_end;
if (pfd[0].revents & POLLIN) { if (socket_poll->revents & POLLIN) {
int len = recv(args->socket, buf, 2048, 0); int len = recv(args->socket, buf, 2048, 0);
if (len <= 0) if (len <= 0)
goto conn_end; goto conn_end;
@ -76,8 +86,53 @@ void *server_handle_conn(void *args_) {
printf("CONN(%d): Couldn't parse message.\n", args->id); printf("CONN(%d): Couldn't parse message.\n", args->id);
} }
} }
if (pfd[1].revents & POLLIN) { if (event_poll->revents & POLLIN) {
struct input_event event;
int len = read(dev.event, &event, sizeof(struct input_event));
if (len <= 0)
goto conn_end;
if (len < sizeof(struct input_event)) {
printf("CONN(%d): error reading event\n", args->id);
continue;
}
if (event.type == EV_SYN) {
int len = msg_serialize(buf, 2048, (Message *)&report);
if (len < 0) {
printf("CONN(%d): Couldn't serialize report %d\n", args->id, len);
continue;
};
write(args->socket, buf, len);
} else if (event.type == EV_ABS) {
int index = dev.mapping.abs_indices[event.code];
if (index < 0) {
printf("CONN(%d): Invalid abs\n", args->id);
continue;
};
report.abs[index] = event.value;
} else if (event.type == EV_REL) {
int index = dev.mapping.rel_indices[event.code];
if (index < 0) {
printf("CONN(%d): Invalid rel\n", args->id);
continue;
};
report.rel[index] = event.value;
} else if (event.type == EV_KEY) {
int index = dev.mapping.key_indices[event.code];
if (index < 0) {
printf("CONN(%d): Invalid key\n", args->id);
continue;
};
report.key[index] = !!event.value;
}
} }
} }