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.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 feat_bits[KEY_MAX] = {};
ioctl(dev->event, EVIOCGBIT(0, EV_MAX), bits);

80
net.c
View File

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

11
net.h
View File

@ -12,6 +12,7 @@ typedef enum {
ControllerState = 4,
} MessageCode;
// TODO: replace counts by uint16_t
typedef struct {
MessageCode code;
@ -36,8 +37,16 @@ typedef struct {
typedef struct {
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;
#define MSS_DEVICE_REPORT 0
#define MSS_DEVICE_REPORT(abs, rel, key) (3 + abs * 4 + rel * 4 + key * 1)
typedef struct {
MessageCode code;

View File

@ -47,18 +47,28 @@ void *server_handle_conn(void *args_) {
int len = msg_serialize(buf, 2048, (Message *)&dev.device_info);
write(args->socket, buf, len);
struct pollfd pfd[2] = {};
pfd[0].fd = args->socket;
pfd[0].events = POLLIN;
pfd[1].fd = dev.event;
pfd[1].events = POLLIN;
struct pollfd pfds[2] = {};
struct pollfd *socket_poll = &pfds[0];
struct pollfd *event_poll = &pfds[1];
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) {
int rc = poll(pfd, 1, -1);
int rc = poll(pfds, 2, -1);
if (rc < 0) // error (connection closed)
goto conn_end;
if (pfd[0].revents & POLLIN) {
if (socket_poll->revents & POLLIN) {
int len = recv(args->socket, buf, 2048, 0);
if (len <= 0)
goto conn_end;
@ -66,8 +76,8 @@ void *server_handle_conn(void *args_) {
Message msg;
if (msg_deserialize(buf, len, &msg) == 0) {
if(msg.code == ControllerState) {
apply_controller_state(&dev, (MessageControllerState*)&msg);
if (msg.code == ControllerState) {
apply_controller_state(&dev, (MessageControllerState *)&msg);
} else {
printf("CONN(%d): Illegal message\n", args->id);
}
@ -76,8 +86,53 @@ void *server_handle_conn(void *args_) {
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;
}
}
}