From 2b4a691c32aadbc45491c8b243ec3cf7ed910f55 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Tue, 21 May 2024 20:10:24 +0800 Subject: [PATCH] run: when disconnected from PTY forwarder, exit event loop if not --wait Follow-up for ade0789fabbf01b95bf54d32f8cab1217a753f03 The change in behavior was partly intentional, as I think if both --wait and --pty are used, manually disconnecting from PTY forwarder should not result in systemd-run exiting with "Finished with ..." log. But we should check for --wait here. Closes #32953 --- src/run/run.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/run/run.c b/src/run/run.c index fa77c5ea78e..3732945a2ed 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -1432,7 +1432,7 @@ static void run_context_check_done(RunContext *c) { else done = true; - if (c->forward && done) /* If the service is gone, it's time to drain the output */ + if (c->forward && !pty_forward_is_done(c->forward) && done) /* If the service is gone, it's time to drain the output */ done = pty_forward_drain(c->forward); if (done) @@ -1506,9 +1506,14 @@ static int pty_forward_handler(PTYForward *f, int rcode, void *userdata) { assert(f); - if (rcode == -ECANCELED) + if (rcode == -ECANCELED) { log_debug_errno(rcode, "PTY forwarder disconnected."); - else if (rcode < 0) { + if (!arg_wait) + return sd_event_exit(c->event, EXIT_SUCCESS); + + /* If --wait is specified, we'll only exit the pty forwarding, but will continue to wait + * for the service to end. If the user hits ^C we'll exit too. */ + } else if (rcode < 0) { sd_event_exit(c->event, EXIT_FAILURE); return log_error_errno(rcode, "Error on PTY forwarding logic: %m"); } -- 2.47.3