From: Zbigniew Jędrzejewski-Szmek Date: Thu, 16 May 2019 15:44:57 +0000 (+0200) Subject: Add 8bit-version of get_process_cmdline() and use in cgroup-show.c X-Git-Tag: v243-rc1~383^2~1 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fsystemd.git;a=commitdiff_plain;h=e3b4efd28f36a11a15531aa1a56ecadfd6f7253d Add 8bit-version of get_process_cmdline() and use in cgroup-show.c This restores show_pid_array() output in legacy locales on the console. Only one call to get_process_cmdline() is changed, all others retain utf8-only mode. This affects systemd-cgls, systemctl status, etc, when working locally. Calls to get_process_cmdline() that cross a process boundary always use utf8. It's the callers responsibility to convert this to some encoding that they use. This means that we always pass utf8 over the bus. --- diff --git a/src/basic/escape.c b/src/basic/escape.c index 77e86a58f31..33a6f204f55 100644 --- a/src/basic/escape.c +++ b/src/basic/escape.c @@ -435,6 +435,13 @@ char *xescape_full(const char *s, const char *bad, size_t console_width, bool ei return ans; } +char *escape_non_printable_full(const char *str, size_t console_width, bool eight_bit) { + if (eight_bit) + return xescape_full(str, "", console_width, true); + else + return utf8_escape_non_printable_full(str, console_width); +} + char *octescape(const char *s, size_t len) { char *r, *t; const char *f; diff --git a/src/basic/escape.h b/src/basic/escape.h index 45e23d0651b..b26054c5df8 100644 --- a/src/basic/escape.h +++ b/src/basic/escape.h @@ -51,6 +51,7 @@ static inline char *xescape(const char *s, const char *bad) { return xescape_full(s, bad, SIZE_MAX, false); } char *octescape(const char *s, size_t len); +char *escape_non_printable_full(const char *str, size_t console_width, bool eight_bit); char *shell_escape(const char *s, const char *bad); char* shell_maybe_quote(const char *s, EscapeStyle style); diff --git a/src/basic/process-util.c b/src/basic/process-util.c index 3e94c9a4aa7..b50537908cc 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -30,6 +30,7 @@ #include "fileio.h" #include "fs-util.h" #include "ioprio.h" +#include "locale-util.h" #include "log.h" #include "macro.h" #include "memory-util.h" @@ -178,7 +179,9 @@ int get_process_cmdline(pid_t pid, size_t max_columns, ProcessCmdlineFlags flags delete_trailing_chars(t, WHITESPACE); - ans = utf8_escape_non_printable_full(t, max_columns); + bool eight_bit = (flags & PROCESS_CMDLINE_USE_LOCALE) && !is_locale_utf8(); + + ans = escape_non_printable_full(t, max_columns, eight_bit); if (!ans) return -ENOMEM; diff --git a/src/basic/process-util.h b/src/basic/process-util.h index b68729cf78b..2e3bd725054 100644 --- a/src/basic/process-util.h +++ b/src/basic/process-util.h @@ -33,6 +33,7 @@ typedef enum ProcessCmdlineFlags { PROCESS_CMDLINE_COMM_FALLBACK = 1 << 0, + PROCESS_CMDLINE_USE_LOCALE = 1 << 1, } ProcessCmdlineFlags; int get_process_comm(pid_t pid, char **name); diff --git a/src/shared/cgroup-show.c b/src/shared/cgroup-show.c index 464a3e5c035..e6fdcfa277d 100644 --- a/src/shared/cgroup-show.c +++ b/src/shared/cgroup-show.c @@ -61,7 +61,9 @@ static void show_pid_array( for (i = 0; i < n_pids; i++) { _cleanup_free_ char *t = NULL; - (void) get_process_cmdline(pids[i], n_columns, PROCESS_CMDLINE_COMM_FALLBACK, &t); + (void) get_process_cmdline(pids[i], n_columns, + PROCESS_CMDLINE_COMM_FALLBACK | PROCESS_CMDLINE_USE_LOCALE, + &t); if (extra) printf("%s%s ", prefix, special_glyph(SPECIAL_GLYPH_TRIANGULAR_BULLET));