- a forwarded SIGINT/SIGTERM/SIGHUP now leaves the polling loop, so the
five-second TERM grace and the SIGKILL fallback actually run; a loader that
ignores SIGTERM no longer blocks the supervisor forever
- surviving guest processes now return a non-zero status instead of 0
- an invalid RCLOL_STOP_AFTER_CLIENT_SECONDS warns and disables the idle stop
instead of aborting the launch with a traceback
Adds a regression test that sends SIGTERM to a loader and a descendant that
both ignore it, and asserts the process group is killed.
Signed-off-by: zero <zero@localhost>
The Riot Client does not exit when its window closes, and a loader that dies
first leaves launchd/mldr and the client tree holding memory until the runtime
is restarted by hand. run-riot-client.sh now execs a small supervisor instead
of the guest loader:
- SIGINT/SIGTERM/SIGHUP are forwarded to the guest process group, the loader
gets a grace period, and darling shutdown runs before any leftover guest
process is stopped.
- Leftovers are stopped only when they carry this prefix's __mldr_sockpath and
the same uid, deepest-first, SIGTERM then SIGKILL. The guest PID namespace is
learned while the session runs; a namespace equal to the host's is refused.
- Cleanup only runs when this launcher started the runtime, so a second launch
that attaches to an existing server leaves it running.
- RCLOL_STOP_AFTER_CLIENT_SECONDS=N adds an opt-in idle stop: it fires only
after a managed client window was seen and is gone for N seconds with no game
process, and never when the window state cannot be read. Off by default.
- RCLOL_CLEAN_ON_EXIT=0 keeps the previous exec-only behaviour.
Adds 23 unit tests for attribution, namespace scoping, shutdown ordering, the
attached-session guard and the idle decision.