59 lines
2.3 KiB
Diff
59 lines
2.3 KiB
Diff
From 903c71befc93c5443f70720c6e98ecca704da692 Mon Sep 17 00:00:00 2001
|
|
From: Mike Yuan <me@yhndnzj.com>
|
|
Date: Sun, 19 May 2024 09:07:21 +0800
|
|
Subject: [PATCH] run: pass the pty slave fd to transient service
|
|
|
|
The rationale is similar to 40e1f4ea7458a0a80eaf1ef356e52bfe0835412e.
|
|
|
|
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
|
|
|
|
(cherry picked from commit 28459ba1f4df824d5ef7f7d1a9acb6953ea24045)
|
|
(cherry picked from commit 182b80bede28ef6e9c0d0edd34c56a467d22dee5)
|
|
(cherry picked from commit 369d7d4083a835e654ae02f92d559293bde66919)
|
|
|
|
Conflict:NA
|
|
Reference:https://github.com/systemd/systemd/commit/28459ba1f4df824d5ef7f7d1a9acb6953ea24045
|
|
---
|
|
src/run/run.c | 12 +++++++++---
|
|
1 file changed, 9 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/run/run.c b/src/run/run.c
|
|
index 645a1fee4c..8bb061e62c 100644
|
|
--- a/src/run/run.c
|
|
+++ b/src/run/run.c
|
|
@@ -773,11 +773,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);
|
|
--
|
|
2.33.0
|
|
|