From: Mike Yuan Date: Tue, 7 Feb 2023 16:21:33 +0000 (+0800) Subject: journal: cat: set JOURNAL_STREAM before exec-ing X-Git-Tag: v254-rc1~1275 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0688bea1631c9ddb83cbfadfe7e0bb66ffc3e17a;p=thirdparty%2Fsystemd.git journal: cat: set JOURNAL_STREAM before exec-ing Make the behavior of systemd-cat match that of core/execute. Closes #25880 --- diff --git a/src/journal/cat.c b/src/journal/cat.c index 0ba427a660b..5908758a8f0 100644 --- a/src/journal/cat.c +++ b/src/journal/cat.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "sd-journal.h" @@ -12,6 +13,7 @@ #include "alloc-util.h" #include "build.h" #include "fd-util.h" +#include "format-util.h" #include "main-func.h" #include "parse-argument.h" #include "parse-util.h" @@ -151,8 +153,23 @@ static int run(int argc, char *argv[]) { if (argc <= optind) (void) execl("/bin/cat", "/bin/cat", NULL); - else + else { + _cleanup_free_ char *s = NULL; + struct stat st; + + if (fstat(STDERR_FILENO, &st) < 0) + return log_error_errno(errno, + "Failed to fstat(%s): %m", + FORMAT_PROC_FD_PATH(STDERR_FILENO)); + + if (asprintf(&s, DEV_FMT ":" INO_FMT, st.st_dev, st.st_ino) < 0) + return log_oom(); + + if (setenv("JOURNAL_STREAM", s, /* overwrite = */ true) < 0) + return log_error_errno(errno, "Failed to set environment variable JOURNAL_STREAM: %m"); + (void) execvp(argv[optind], argv + optind); + } r = -errno; /* Let's try to restore a working stderr, so we can print the error message */