summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-05-16 17:44:57 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-05-22 10:16:00 +0200
commite3b4efd28f36a11a15531aa1a56ecadfd6f7253d (patch)
treedb6bee1c192cce630e2ddd393da860851783d78d
parent09c1dceef180630ecd6cf40e5c1fb653029b615c (diff)
downloadsystemd-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.c7
-rw-r--r--src/basic/escape.h1
-rw-r--r--src/basic/process-util.c5
-rw-r--r--src/basic/process-util.h1
-rw-r--r--src/shared/cgroup-show.c4
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));