Commit graph

28 commits

Author SHA1 Message Date
Peter Hutterer
6c823b1308 libeis: keep a ref of the client during dispatch
On error, we call eis_client_disconnect() which unrefs the client. Since we're
using it afterwards for debugging logs, we need to keep at least one ref
going.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-13 16:17:51 +10:00
Peter Hutterer
fb7bbbd4ce libeis: plug a memory leak if we get more than one message per dispatch
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-13 16:17:51 +10:00
Peter Hutterer
bfee550834 More log messages for debugging
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-12 14:16:09 +10:00
Peter Hutterer
3db476930b Add a bunch of log_debug messages
We can remove those when we have a working implementation, for now it's too
painful to debug when an exchange doesn't  work for some reason.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-11 13:01:36 +10:00
Peter Hutterer
57a9892f5d eis: send the removed deviceid down the wire
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-11 11:13:14 +10:00
Peter Hutterer
b717837b14 Downgrade the ECANCELED warning to a mere info
ECANCELED is used for any time the other end disconnects, so it's not really
an error.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-11 11:06:07 +10:00
Peter Hutterer
55246512f0 Add capabilities to the Added event
This makes it possible for the server to limit capabilities.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-10 19:32:34 +10:00
Peter Hutterer
6f75463261 Rename "accepted" to "added" for consistency with the public API
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-10 08:49:22 +10:00
Peter Hutterer
4cfa6e6225 Add configuration messages to the protocol
For the Portal case, we'll have the portal open the sockets for us and then
(depending on policy) restrict what the client can do. Then the socket can be
passed to the client with e.g. keyboards disabled and the client is none the
wiser (other than that the server will reject any keyboard caps).

Since the portal doesn't need a EI context, the configuration is a separate
small library.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-07 16:05:57 +10:00
Peter Hutterer
2f855c568c Drop the "hello" message
The main purpose of that was for (plain-text protocol) debugging. With the
current intentions to "preload" a connection with restrictions, having the
server initiate a connection is not useful.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-07 14:46:20 +10:00
Peter Hutterer
9c2c912353 util: change the sources API to source_new and sink_add_source
This is a more explicit API that makes it more obvious where the ref/unref
calls need to go. The sink now has two refs to the sources as well (epoll data
pointer and the list) which means a caller cannot just source_unref() anymore
without removing a source. Since this is how we've been using it anyway - meh.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-07 14:46:20 +10:00
Peter Hutterer
35d676e7f7 libeis: fix the client ref handling and move the list to the eis context
Let the context take care of adding the device so we have better separation
here. Removal isn't handled in a special way because any list node can remove
itself safel anyway.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-07 11:37:51 +10:00
Peter Hutterer
6d46c55df3 More source ref fixes
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-07 11:37:51 +10:00
Peter Hutterer
a9f07368a5 Implement pointer button and keyboard key events
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-03 12:00:31 +10:00
Peter Hutterer
81d4556dcc proto: add a fixed-length frame message
protobuf relies on external framing and exact buffer lengths to parse things
correctly. So let's provide that by sending a fixed-length Frame message
before every real message.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-03 11:59:05 +10:00
Peter Hutterer
718beb926e utils: Rename OBJECT_DECLARE... to OBJECT_IMPLEMENT
More technically correct since that's what all these crazy macros do.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-03 07:34:52 +10:00
Peter Hutterer
6610319832 Add a missing empty line
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-08-03 07:32:32 +10:00
Peter Hutterer
40682a0420 Use send() instead of write() to prevent SIGPIPE
We're in a library here, so expecting the caller to handle SIGPIPE just in
case we get it is a bit demanding. Let's use send() instead so we can just
prevent that altogether.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-31 14:27:18 +10:00
Peter Hutterer
9f4827135d Process multiple messages in one dispatch
We may get more than one message per dispatch so let's make sure we iterate
through all the available data.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-31 14:14:21 +10:00
Peter Hutterer
9f851bcccb Replace the custom message parsing with protobuf
Plain-text was useful for the initial implementation where the counterpart was
netcat but now that both parts are in place, protobuf is a much more
convenient system to handle a frequently-changing protocol.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-31 13:05:11 +10:00
Peter Hutterer
3c7820baca libeis: only remove the source on disconnect, don't destroy it
Removed sources will be cleaned up at the end of dispatch.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-30 21:17:54 +10:00
Peter Hutterer
8ec0f4bf7c Send the trailing null byte for composed string messages
The iobuf treats this as binary data but then we're using it as strings in the
message parsing code. So make sure all messages have a trailing null byte.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-30 21:01:09 +10:00
Peter Hutterer
27670000e4 libeis: only log client state transitions if they changed
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-29 11:52:23 +10:00
Peter Hutterer
247b6d0dcb libeis: fix wrong message field assignment
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-29 10:59:07 +10:00
Peter Hutterer
23c34fc77d client: handle the case of zero data bytes
When terminating the connection, we might get a read of zero

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-29 09:42:42 +10:00
Peter Hutterer
fb115a1f43 libeis: avoid a cleanup double-free
Aparently the compiler is not smart enough to handle the case correctly where
a cleanup variable is introduced after a goto statement.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-29 09:41:56 +10:00
Peter Hutterer
b840c510bf libeis: remove existing devices before disconnecting the client
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-29 09:41:07 +10:00
Peter Hutterer
f7a24b2fbd Add the minimal implementation for a UNIX socket libeis server
This is the minimum framework to support new clients, added devices and
pointer relative motion events. It's missing a bunch of checks and
verification, most of the server hooks aren't there yet, the only
implementation is a UNIX socket and the protocol is plain text (but at least
the last two makes it netcat-compatible).

Protocol is plain text for now and interaction is like this (S is server, C is client):
S: hello
C: connect myclientname
S: connected
C: add 2 4
S: accept 2
C: rel 2 -1 1
C: rel 2 5 4

Where the last two lines are: add device with id 2 and capability mask 0x4,
send a relative pointer motion event for device 2 with coordinates -1/1, then
5/4.

The implementation relies heavily on some abstraction and macros galore, see
the various util-* files. These are largely copied from libinput, with a few
parts removed and a few other parts added.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2020-07-28 19:33:34 +10:00