diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-05-16 17:44:57 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-05-22 10:16:00 +0200 |
commit | e3b4efd28f36a11a15531aa1a56ecadfd6f7253d (patch) | |
tree | db6bee1c192cce630e2ddd393da860851783d78d | |
parent | 09c1dceef180630ecd6cf40e5c1fb653029b615c (diff) | |
download | systemd-e3b4efd28f36a11a15531aa1a56ecadfd6f7253d.tar.gz systemd-e3b4efd28f36a11a15531aa1a56ecadfd6f7253d.tar.bz2 systemd-e3b4efd28f36a11a15531aa1a56ecadfd6f7253d.zip |
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.
-rw-r--r-- | src/basic/escape.c | 7 | ||||
-rw-r--r-- | src/basic/escape.h | 1 | ||||
-rw-r--r-- | src/basic/process-util.c | 5 | ||||
-rw-r--r-- | src/basic/process-util.h | 1 | ||||
-rw-r--r-- | src/shared/cgroup-show.c | 4 |
5 files changed, 16 insertions, 2 deletions
diff --git a/src/basic/escape.c b/src/basic/escape.c index 77e86a58f3..33a6f204f5 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 45e23d0651..b26054c5df 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 3e94c9a4aa..b50537908c 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 b68729cf78..2e3bd72505 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 464a3e5c03..e6fdcfa277 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)); |