vhidkb

virtual HID keyboard
git clone git://git.rr3.xyz/vhidkb
Log | Files | Refs | README | LICENSE

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:
Mvhidkb.c | 19+++++++++++++++----
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;