run: pass the pty slave fd to transient service

The rationale is similar to 40e1f4ea74.

Currently, we only pass TTYPath=/dev/pts/... to
the transient service spawned by systemd-run.
This is a bit problematic though, when ExecStartPre=
or ExecStopPost= is used. Since when these control
processes get to run, the main process is not yet
started/has already exited, hence the slave suffers
from the same vhangup problem as the mentioned commit.

By passing the slave fd in, the service manager will
hold the fd open as long as the service is alive.

Fixes #32916
This commit is contained in:
Mike Yuan 2024-05-19 09:07:21 +08:00
parent ade0789fab
commit 28459ba1f4
No known key found for this signature in database
GPG key ID: 417471C0A40F58B3

View file

@ -1133,11 +1133,17 @@ static int transient_service_set_properties(sd_bus_message *m, const char *pty_p
}
if (pty_path) {
_cleanup_close_ int pty_slave = -EBADF;
pty_slave = open_terminal(pty_path, O_RDWR|O_NOCTTY|O_CLOEXEC);
if (pty_slave < 0)
return pty_slave;
r = sd_bus_message_append(m,
"(sv)(sv)(sv)(sv)",
"StandardInput", "s", "tty",
"StandardOutput", "s", "tty",
"StandardError", "s", "tty",
"StandardInputFileDescriptor", "h", pty_slave,
"StandardOutputFileDescriptor", "h", pty_slave,
"StandardErrorFileDescriptor", "h", pty_slave,
"TTYPath", "s", pty_path);
if (r < 0)
return bus_log_create_error(r);