commit 443631d6755b8f0381954c2e3c0de98b5c57031d
parent 13a9edebf1ffe6d668924c0cd0290ed914e351e5
Author: Robert Russell <robertrussell.72001@gmail.com>
Date: Mon, 29 Aug 2022 23:09:17 -0700
Final touches on vhidkb.c
Diffstat:
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/vhidkb.c b/vhidkb.c
@@ -1,3 +1,4 @@
+#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <poll.h>
@@ -10,6 +11,7 @@
#include <unistd.h>
#include <linux/uhid.h>
+#define NAME "vhidkb"
#define USAGE "usage: %s [-h] [-d DEVICE] [-t DELAY]"
typedef uint8_t u8;
@@ -59,16 +61,19 @@ write_event(int fd, struct uhid_event *e) {
fatalf("write: incomplete write");
}
-/* TODO: ensure sizeof rdesc < HID_MAX_DESCRIPTOR_SIZE */
void
send_create2(int fd) {
struct uhid_event e = {0};
+
+ assert(sizeof rdesc <= sizeof e.u.create2.rd_data);
+ assert(sizeof NAME <= sizeof e.u.create2.name);
+
e.type = UHID_CREATE2;
- strcpy((char *)e.u.create2.name, "vhidkb");
+ strcpy((char *)e.u.create2.name, NAME);
e.u.create2.rd_size = sizeof rdesc;
e.u.create2.bus = BUS_VIRTUAL;
- e.u.create2.vendor = 0; /* TODO */
- e.u.create2.product = 0; /* TODO */
+ e.u.create2.vendor = 0; /* XXX */
+ e.u.create2.product = 0; /* XXX */
e.u.create2.version = 0;
e.u.create2.country = 0;
memcpy(e.u.create2.rd_data, rdesc, sizeof rdesc);
@@ -79,6 +84,9 @@ send_create2(int fd) {
void
send_input2(int fd, u8 *keys) {
struct uhid_event e = {0};
+
+ assert(1+32 <= sizeof e.u.input2.data);
+
e.type = UHID_INPUT2;
e.u.input2.size = 1 + 32;
e.u.input2.data[0] = keys[28]; /* modifiers field */
@@ -95,6 +103,9 @@ send_get_report_reply(int fd, u8 *keys, struct uhid_get_report_req req) {
}
struct uhid_event e = {0};
+
+ assert(1+32 <= sizeof e.u.get_report_reply.data);
+
e.type = UHID_GET_REPORT_REPLY;
e.u.get_report_reply.id = req.id;
e.u.get_report_reply.err = 0;