Commit graph

245 commits

Author SHA1 Message Date
Simon Ser
cb7a94378b seatd: avoid overwriting errno in set_nonblock error handling
If close fails, it'll mess up errno, and log_errorf will print a
non-sensical value.
2021-10-24 00:52:08 +02:00
Kenny Levinsen
88db55f606 Bump version to 0.6.3 2021-10-19 21:39:17 +02:00
Kenny Levinsen
e35c9cd02e logind: Set userdata for ping_handler 2021-10-05 10:05:25 +02:00
Kenny Levinsen
ec0d6565bb ci: Add logind smoketest to arch 2021-09-22 23:06:59 +02:00
Kenny Levinsen
8e5c00e7c8 logind: Improve error handling in open_seat
errno was not being set by open_seat in most cases, leading to
simpletest possibly failing with "libseat_open_seat() failed: Success".
2021-09-22 23:04:40 +02:00
Simon Ser
d2193b45ff examples/simpletest: check for libseat_dispatch failures 2021-09-22 21:59:41 +02:00
Simon Ser
262ccef84e logind: check if session is active on startup
Up until now we assumed the session was always active on startup.
This might not be the case. Instead, read the current value of the
Active property.
2021-09-22 21:55:49 +02:00
Kenny Levinsen
1c376ca9b1 ci: Inline smoketest into build scripts
The smoketest script has gotten significantly simpler, and can simply be
inlined into the build scripts if we don't care about running the tests
twice.

This should fix CI for mailing list patches.
2021-09-21 13:11:55 +02:00
Kenny Levinsen
e2baadc230 clang-format: Fix alignment 2021-09-21 12:48:24 +02:00
Kenny Levinsen
db08fb921f logind: Send ping to wake us up later
sd_bus_call drains received messages into the receive queue, and peeks
for its own return value. It does not dispatch the receive queue.

As the socket is drained, the caller will not wake from a poll and have
no reason to dispatch libseat. This has gone unnoticed largely due to
logind sending an event for every device, making it unlikely that no
unread message will be left on the socket.

Like we have done for seatd, we fix this by sending a "ping" request to
logind if anything is left in our receive queue as reported by
sd_bus_get_events. The response to this will wake us up and ensure that
dispatch is called.
2021-09-21 11:18:18 +02:00
Kenny Levinsen
2eee9aa445 seatd: Implement ping request to wake up later
When device open or close messages are sent to seatd, libseat must read
messages from the socket until it sees the associated response message.
This means that it may drain enable/disable seat events from the socket,
queueing them internally for deferred processing.

As the socket is drained, the caller will not wake from a poll and have
no reason to dispatch libseat. To ensure that these messages would not
be left in the queue, 6fa82930d0 made it
so that open/close calls would execute all queued events just before
returning.

Unfortunately, this had the side-effect of having events fire from the
stack of libseat_open_device or libseat_close_device, which we now see
cause problems in compositors. Specifically, an issue has been observed
where libinput end up calling libseat_close_device, which in turn
dispatch a disable seat event that calls libinput_suspend. libinput does
not like this.

Instead, remove the execution from libseat_open_device and
libseat_close_device, and instead make a "ping" request to seatd if
events have been queued. The response to this will wake us up and ensure
that dispatch is called.
2021-09-21 11:18:18 +02:00
Kenny Levinsen
0f20175752 Bump version to 0.6.2 2021-09-16 01:07:42 +02:00
Kenny Levinsen
ebf512c2bf seatd-launch: Specify exact environment to seatd
The parent environment might contain nasty things. Create a new
environment for the seatd process containing only the environment
variables we care about. For now, that's only SEATD_LOGLEVEL.
2021-09-16 00:55:43 +02:00
Kenny Levinsen
907b75de1a seatd-launch: Use absolute path for seatd
We previously used execlp to execute seatd, which had the effect of
searching PATH for the executable. This allowed the caller to control
what executable was run, which is bad if SUID has been set.

Instead, expose the absolute install path for seatd from meason as a
define, and use that in a call to execv.
2021-09-16 00:46:49 +02:00
Kenny Levinsen
4091ba2c07 ci: Install seatd instead of manipulating PATH 2021-09-16 00:46:42 +02:00
Kenny Levinsen
66becee6da Bump version to 0.6.1 2021-09-14 11:58:56 +02:00
Simon Ser
4e3b7b3bb6 seatd-launch: print unlink/kill errors
Makes it easier to find out that something went wrong.
2021-09-13 13:40:00 +02:00
Simon Ser
fe600eac2b seatd-launch: exit with status >128 if child is signalled
Mimick shells and exit with a status >128 if our child has been
signalled. Exiting with 128 + signal number is what most shells do
(POSIX only requires them to exit with >128).
2021-09-13 13:39:20 +02:00
Kenny Levinsen
8c85c46d2d man/seatd-launch: Make mssage about root clearer 2021-09-12 12:06:05 +02:00
Kenny Levinsen
483dbf76fa seatd-launch: Use optind to find the command
The command indexing had not been updated afer the introduction of
getopt, so combining a command with flags would fail.

Add error handling for if no command was specified while we're at it.
2021-09-12 12:06:05 +02:00
Jan Beich
d5c1a7811b seatd-launch: respect PATH when looking for command
$ seatd-launch sway -c /dev/null
Could not start target: No such file or directory
2021-09-12 12:06:05 +02:00
Kenny Levinsen
da59bea775 man: Add seatd-launch(1) to SEE ALSO of seatd(1) 2021-09-11 15:55:26 +02:00
Kenny Levinsen
3ad9164a89 Bump version to 0.6.0 2021-09-11 14:02:44 +02:00
Kenny Levinsen
d1c6bb9a15 seatd-launch: Fix chmod error goto 2021-09-08 20:54:18 +02:00
Kenny Levinsen
e7343ca96f man: Add simple seatd-launch(1) page 2021-09-08 20:45:42 +02:00
Kenny Levinsen
17cdbe0ad2 seatd-launch: Set socket permissions directly
Instead of relying on seatd's user/group arguments, which require
turning our UID back into a username, just chmod/chown the socket
ourselves once seatd is ready.

We also reduce the permissions to just user access, instead of user and
group like seatd specifies.
2021-09-08 20:40:09 +02:00
Kenny Levinsen
60c370d4ec seat: Allow new clients when active is pending ack
New clients could only be added to a VT bound seat if there were no
"active" client, regardless of its actual state. This meant that if one
switched from an "active" VT to an "inactive" VT, the seat would be
blocked while the "active" client was in CLIENT_PENDING_DISABLE, causing
new clients to possibly fail should the old client take its time with
the ack.

Instead, allow new clients to also be added if there is an active client
whose state is CLIENT_PENDING_DISABLE, and there is no client with the
new VT as its session ID.
2021-09-07 22:24:24 +02:00
Simon Ser
29a6832ca0 Add .editorconfig
Allows text editor auto-configuration.
2021-09-02 20:41:47 +02:00
Kenny Levinsen
df3f307b8e seat: Avoid holding a tty fd
The kernel Secure Attention Key killer, triggered by SysRq+k, kills all
processes that hold an fd referencing the tty.

To avoid its attention, we stop storing the fd for the currently active
VT in seat state. This has the added benefit of simplifying state a bit.
2021-09-02 20:02:55 +02:00
Fabrice Fontaine
15b0972bd3 meson.build: fix build with gcc < 7
Test if arguments (e.g. -Wimplicit-fallthrough) is available before
using it as -Wimplicit-fallthrough has been added only since gcc 7.1 and
81fea426da
and so it will raise the following build failure with gcc < 7:

arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-Wimplicit-fallthrough'

Fixes:
 - http://autobuild.buildroot.org/results/0ee6816a7cceebdafd07612677a594bdf68e0790

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
2021-09-02 20:00:03 +02:00
Kenny Levinsen
038c30f9b1 libseat: Fix build of builtin backend
This was regressed by 166feaea33 which
missed the builtin backend when changing struct libseat_seat_listener to
being passed around as const.
2021-08-15 14:32:05 +02:00
Greg Depoire--Ferrer
d78859bc9a libseat: Update builtin backend root requirement documentation
The builtin backend no longer requires root, setuid or CAP_SYS_ADMIN.
This commit updates the documentation accordingly.
2021-08-15 14:03:23 +02:00
Greg Depoire--Ferrer
d9ae4c3010 Revert "libseat: Check euid before using builtin"
This reverts commit 1ae6c3b3dd.

A user might want to run the builtin server as non root, if they have
permission to use the devices.

The check was originally copied from wlroots's direct backend. It was reverted
in fa05d3cde68d with a detailed explanation of why root priviledges are not
always necessary to use the DRM device.
2021-08-15 14:03:23 +02:00
Kenny Levinsen
6e7a1db32d logind: Remove redundant null check 2021-08-15 13:34:26 +02:00
Simon Ser
166feaea33 Make libseat_seat_listener const
libseat will never write to that struct. Let's allow callers to
make it read-only.
2021-08-15 13:33:30 +02:00
Kenny Levinsen
309650aa4d seatd: Use path in chmod/chown operations
c8b3a22d4e snuck in a change which
converts chown/chmod to fchown/fchmod using the socket fd. This appears
to succeed under Linux, but fails with EINVAL on FreeBSD. As the error
handling in this area was flawed, CI failed to catch the regression.

Partially revert c8b3a22d4e to fix the
regression on FreeBSD.
2021-08-08 18:22:17 +02:00
Kenny Levinsen
2cfc56d5ed seatd: Improve socket permission error handling
chmod/chown errors were logged, but did not result in failure opening
the seatd socket. This meant that errors would not get caught by CI.
2021-08-08 18:21:28 +02:00
Kenny Levinsen
48727a0b6b seatd-launch: Command line argument support 2021-08-06 23:00:05 +02:00
Simon Ser
369af8f9e4 seatd-launch: check for getpwuid errors 2021-08-06 22:27:42 +02:00
Simon Ser
3a843745c2 seatd-launch: don't use gotos in child processes
While forked (child pid is zero), don't use gotos. These will
execute atexit functions and potentially mess up the stdlib.
Instead, use _exit.
2021-08-06 22:27:42 +02:00
Simon Ser
f2a614dcd3 seatd-launch: propagate child exit status
When the child process exits with a non-zero code or is killed,
return with a non-zero code as well.
2021-08-06 22:27:42 +02:00
Kenny Levinsen
7d06b34ee2 ci: Fix meson flags 2021-08-06 01:29:52 +02:00
Kenny Levinsen
978dec42b0 ci: Use seatd-launch 2021-08-06 01:29:52 +02:00
Kenny Levinsen
1e98727ae9 seatd-launch: Add seatd launch wrapper
This launch wrapper is used to conveniently start a new seatd instance,
wait for it to be ready, and launch a target application.
2021-08-06 01:29:52 +02:00
Kenny Levinsen
c8b3a22d4e seatd: Only set UID/GID when specified
The UID/GID defaulted to 0, which results in trying to chown to root
when a UID or GID isn't requested. Instead, deafult to -1 so that the
unspecified values are left intact.
2021-08-06 01:15:55 +02:00
Kenny Levinsen
312d6906ae seatd: s6-style readiness notification support
This adds the ability to specify the number of an fd that is inherited
by the process as open. Once seatd is read to serve requests, it will
write a single newline and close the fd.
2021-08-06 01:15:55 +02:00
Kenny Levinsen
d03e9d1c35 seatd: We shouldn't poll if predispatch > 0
This condition was accidentally botched as part of
5923e0edc9
2021-08-06 01:15:55 +02:00
Kenny Levinsen
6444da6093 libseat: Rename dispatch_background in backends
This name never made much sense. dispatch_and_execute is more
meaningful, especially when compared to the non-executing dispatch
function.
2021-07-09 00:16:10 +02:00
Kenny Levinsen
5923e0edc9 libseat/seatd: Add dispatch_pending_and_execute
This handler returns the number of dispatched or executed events, or -1
if dispatch_pending failed.

This helper is used to clean up dispatch_background, which now ensures
that all events are executed before we read or poll the connection, and
have improved error handling in the corner case where the second
dispatch_pending failed.
2021-07-09 00:09:14 +02:00
Kenny Levinsen
7a6d12ff7a libseat/seatd: Return executed events
Dispatch needs to report if something has happened, which includes
events executed from the queue as these could have lead to additional
dispatch and queuing.
2021-07-08 23:48:30 +02:00