Lennart Poettering píše v Pá 21. 09. 2012 v 12:22 +0200: > On Thu, 20.09.12 16:30, Lukáš Nykrýn (lnyk...@redhat.com) wrote: > > > Hello, > > >From bug report: https://bugzilla.redhat.com/show_bug.cgi?id=858693 > > "There is no easy way how to force "systemctl status" not to crop long > > lines with ellipsis in a virtual terminal. "-a" or "--full" options > > doesn't help (and they even shouldn't help, according to the man page)" > > > > I am not sure if there should be additional parameter or extend --full, > > but systemctl has already enough parameters. > > Using --full for this sounds like a good idea. > > Insted of using UINT_MAX here as special value I'd prefer if we could > follow the semantics of logs-show.h here more closely and introduce a > bit field? > > Lennart >
I think that in this case we can use the OutputFlags so here is reworked patch. Regards Lukas
>From 4d5427101094a29a125176d0010842b3093184fb Mon Sep 17 00:00:00 2001 From: Lukas Nykryn <lnyk...@redhat.com> Date: Tue, 25 Sep 2012 15:30:03 +0200 Subject: [PATCH] systemctl: do not ellipsize cgroup members in full status --- man/systemctl.xml | 2 +- src/cgls/cgls.c | 6 ++-- src/core/selinux-access.c | 4 +- src/journal/coredump.c | 2 +- src/journal/journald.c | 2 +- src/login/loginctl.c | 4 +- src/shared/cgroup-show.c | 36 ++++++++++---------- src/shared/cgroup-show.h | 9 +++-- src/shared/logs-show.h | 20 ----------- src/shared/util.c | 81 +++++++++++++++++++++++++++------------------ src/shared/util.h | 22 ++++++++++++- src/systemctl/systemctl.c | 14 ++++---- 12 files changed, 110 insertions(+), 92 deletions(-) diff --git a/man/systemctl.xml b/man/systemctl.xml index fedc588..eacd2ed 100644 --- a/man/systemctl.xml +++ b/man/systemctl.xml @@ -151,7 +151,7 @@ <term><option>--full</option></term> <listitem><para>Do not ellipsize unit - names and truncate unit descriptions + names, cgroup members and truncate unit descriptions in the output of <command>list-units</command> and <command>list-jobs</command>.</para></listitem> diff --git a/src/cgls/cgls.c b/src/cgls/cgls.c index b2cd968..c7c368d 100644 --- a/src/cgls/cgls.c +++ b/src/cgls/cgls.c @@ -132,7 +132,7 @@ int main(int argc, char *argv[]) { int q; printf("%s:\n", argv[i]); - q = show_cgroup_by_path(argv[i], NULL, 0, arg_kernel_threads, arg_all); + q = show_cgroup_by_path(argv[i], NULL, 0, arg_kernel_threads, arg_all, 0); if (q < 0) r = q; } @@ -148,7 +148,7 @@ int main(int argc, char *argv[]) { if (path_startswith(p, "/sys/fs/cgroup")) { printf("Working Directory %s:\n", p); - r = show_cgroup_by_path(p, NULL, 0, arg_kernel_threads, arg_all); + r = show_cgroup_by_path(p, NULL, 0, arg_kernel_threads, arg_all, 0); } else { char *root = NULL; const char *t = NULL; @@ -163,7 +163,7 @@ int main(int argc, char *argv[]) { t = root[0] ? root : "/"; } - r = show_cgroup(SYSTEMD_CGROUP_CONTROLLER, t, NULL, 0, arg_kernel_threads, arg_all); + r = show_cgroup(SYSTEMD_CGROUP_CONTROLLER, t, NULL, 0, arg_kernel_threads, arg_all, 0); free(root); } diff --git a/src/core/selinux-access.c b/src/core/selinux-access.c index 8513634..c4a0901 100644 --- a/src/core/selinux-access.c +++ b/src/core/selinux-access.c @@ -236,7 +236,7 @@ static int bus_get_audit_data( if (r < 0) return r; - r = get_process_cmdline(pid, LINE_MAX, true, &audit->cmdline); + r = get_process_cmdline(pid, LINE_MAX, true, &audit->cmdline, 0); if (r < 0) return r; @@ -372,7 +372,7 @@ static int get_audit_data( if (r < 0) return r; - r = get_process_cmdline(ucred.pid, LINE_MAX, true, &audit->cmdline); + r = get_process_cmdline(ucred.pid, LINE_MAX, true, &audit->cmdline, 0); if (r < 0) return r; diff --git a/src/journal/coredump.c b/src/journal/coredump.c index a507fc6..8dfadbd 100644 --- a/src/journal/coredump.c +++ b/src/journal/coredump.c @@ -205,7 +205,7 @@ int main(int argc, char* argv[]) { IOVEC_SET_STRING(iovec[j++], core_exe); } - if (get_process_cmdline(pid, LINE_MAX, false, &t) >= 0) { + if (get_process_cmdline(pid, LINE_MAX, false, &t, 0) >= 0) { core_cmdline = strappend("COREDUMP_CMDLINE=", t); free(t); diff --git a/src/journal/journald.c b/src/journal/journald.c index 3267fff..257e061 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -566,7 +566,7 @@ static void dispatch_message_real( IOVEC_SET_STRING(iovec[n++], exe); } - r = get_process_cmdline(ucred->pid, LINE_MAX, false, &t); + r = get_process_cmdline(ucred->pid, LINE_MAX, false, &t, 0); if (r >= 0) { cmdline = strappend("_CMDLINE=", t); free(t); diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 7ef9dde..bb04072 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -428,7 +428,7 @@ static void print_session_status_info(SessionStatusInfo *i) { else c = 0; - show_cgroup_and_extra_by_spec(i->default_control_group, "\t\t ", c, false, arg_all, &i->leader, i->leader > 0 ? 1 : 0); + show_cgroup_and_extra_by_spec(i->default_control_group, "\t\t ", c, false, arg_all, &i->leader, i->leader > 0 ? 1 : 0, 0); } } } @@ -480,7 +480,7 @@ static void print_user_status_info(UserStatusInfo *i) { else c = 0; - show_cgroup_by_path(i->default_control_group, "\t\t ", c, false, arg_all); + show_cgroup_by_path(i->default_control_group, "\t\t ", c, false, arg_all, 0); } } } diff --git a/src/shared/cgroup-show.c b/src/shared/cgroup-show.c index 9003a12..baef32b 100644 --- a/src/shared/cgroup-show.c +++ b/src/shared/cgroup-show.c @@ -51,7 +51,7 @@ static unsigned ilog10(unsigned long ul) { return n; } -static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsigned n_columns, bool extra, bool more, bool kernel_threads) { +static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsigned n_columns, bool extra, bool more, bool kernel_threads, OutputFlags flags) { unsigned i, m; pid_t biggest = 0; @@ -83,7 +83,7 @@ static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsi for (i = 0; i < n_pids; i++) { char *t = NULL; - get_process_cmdline(pids[i], n_columns, true, &t); + get_process_cmdline(pids[i], n_columns, true, &t, flags); printf("%s%s %*lu %s\n", prefix, @@ -97,7 +97,7 @@ static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsi } -static int show_cgroup_one_by_path(const char *path, const char *prefix, unsigned n_columns, bool more, bool kernel_threads) { +static int show_cgroup_one_by_path(const char *path, const char *prefix, unsigned n_columns, bool more, bool kernel_threads, OutputFlags flags) { char *fn; FILE *f; size_t n = 0, n_allocated = 0; @@ -147,7 +147,7 @@ static int show_cgroup_one_by_path(const char *path, const char *prefix, unsigne goto finish; if (n > 0) - show_pid_array(pids, n, prefix, n_columns, false, more, kernel_threads); + show_pid_array(pids, n, prefix, n_columns, false, more, kernel_threads, flags); r = 0; @@ -160,7 +160,7 @@ finish: return r; } -int show_cgroup_by_path(const char *path, const char *prefix, unsigned n_columns, bool kernel_threads, bool all) { +int show_cgroup_by_path(const char *path, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, OutputFlags flags) { DIR *d; char *last = NULL; char *p1 = NULL, *p2 = NULL, *fn = NULL, *gn = NULL; @@ -201,7 +201,7 @@ int show_cgroup_by_path(const char *path, const char *prefix, unsigned n_columns } if (!shown_pids) { - show_cgroup_one_by_path(path, prefix, n_columns, true, kernel_threads); + show_cgroup_one_by_path(path, prefix, n_columns, true, kernel_threads, flags); shown_pids = true; } @@ -217,7 +217,7 @@ int show_cgroup_by_path(const char *path, const char *prefix, unsigned n_columns } } - show_cgroup_by_path(last, p1, n_columns-2, kernel_threads, all); + show_cgroup_by_path(last, p1, n_columns-2, kernel_threads, all, flags); free(last); } @@ -228,7 +228,7 @@ int show_cgroup_by_path(const char *path, const char *prefix, unsigned n_columns goto finish; if (!shown_pids) - show_cgroup_one_by_path(path, prefix, n_columns, !!last, kernel_threads); + show_cgroup_one_by_path(path, prefix, n_columns, !!last, kernel_threads, flags); if (last) { printf("%s\342\224\224 %s\n", prefix, path_get_file_name(last)); @@ -241,7 +241,7 @@ int show_cgroup_by_path(const char *path, const char *prefix, unsigned n_columns } } - show_cgroup_by_path(last, p2, n_columns-2, kernel_threads, all); + show_cgroup_by_path(last, p2, n_columns-2, kernel_threads, all, flags); } r = 0; @@ -257,7 +257,7 @@ finish: return r; } -int show_cgroup(const char *controller, const char *path, const char *prefix, unsigned n_columns, bool kernel_threads, bool all) { +int show_cgroup(const char *controller, const char *path, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, OutputFlags flags) { char *p; int r; @@ -268,13 +268,13 @@ int show_cgroup(const char *controller, const char *path, const char *prefix, un if (r < 0) return r; - r = show_cgroup_by_path(p, prefix, n_columns, kernel_threads, all); + r = show_cgroup_by_path(p, prefix, n_columns, kernel_threads, all, flags); free(p); return r; } -static int show_extra_pids(const char *controller, const char *path, const char *prefix, unsigned n_columns, const pid_t pids[], unsigned n_pids) { +static int show_extra_pids(const char *controller, const char *path, const char *prefix, unsigned n_columns, const pid_t pids[], unsigned n_pids, OutputFlags flags) { pid_t *copy; unsigned i, j; int r; @@ -310,26 +310,26 @@ static int show_extra_pids(const char *controller, const char *path, const char copy[j++] = pids[i]; } - show_pid_array(copy, j, prefix, n_columns, true, false, false); + show_pid_array(copy, j, prefix, n_columns, true, false, false, flags); free(copy); return 0; } -int show_cgroup_and_extra(const char *controller, const char *path, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, const pid_t extra_pids[], unsigned n_extra_pids) { +int show_cgroup_and_extra(const char *controller, const char *path, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, const pid_t extra_pids[], unsigned n_extra_pids, OutputFlags flags) { int r; assert(controller); assert(path); - r = show_cgroup(controller, path, prefix, n_columns, kernel_threads, all); + r = show_cgroup(controller, path, prefix, n_columns, kernel_threads, all, flags); if (r < 0) return r; - return show_extra_pids(controller, path, prefix, n_columns, extra_pids, n_extra_pids); + return show_extra_pids(controller, path, prefix, n_columns, extra_pids, n_extra_pids, flags); } -int show_cgroup_and_extra_by_spec(const char *spec, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, const pid_t extra_pids[], unsigned n_extra_pids) { +int show_cgroup_and_extra_by_spec(const char *spec, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, const pid_t extra_pids[], unsigned n_extra_pids, OutputFlags flags) { int r; char *controller, *path; @@ -339,7 +339,7 @@ int show_cgroup_and_extra_by_spec(const char *spec, const char *prefix, unsigned if (r < 0) return r; - r = show_cgroup_and_extra(controller, path, prefix, n_columns, kernel_threads, all, extra_pids, n_extra_pids); + r = show_cgroup_and_extra(controller, path, prefix, n_columns, kernel_threads, all, extra_pids, n_extra_pids, flags); free(controller); free(path); diff --git a/src/shared/cgroup-show.h b/src/shared/cgroup-show.h index dba900a..d10a07b 100644 --- a/src/shared/cgroup-show.h +++ b/src/shared/cgroup-show.h @@ -24,11 +24,12 @@ #include <stdbool.h> #include <sys/types.h> +#include "util.h" -int show_cgroup_by_path(const char *path, const char *prefix, unsigned columns, bool kernel_threads, bool all); -int show_cgroup(const char *controller, const char *path, const char *prefix, unsigned columns, bool kernel_threads, bool all); +int show_cgroup_by_path(const char *path, const char *prefix, unsigned columns, bool kernel_threads, bool all, OutputFlags flags); +int show_cgroup(const char *controller, const char *path, const char *prefix, unsigned columns, bool kernel_threads, bool all, OutputFlags flags); -int show_cgroup_and_extra_by_spec(const char *spec, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, const pid_t extra_pids[], unsigned n_extra_pids); -int show_cgroup_and_extra(const char *controller, const char *path, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, const pid_t extra_pids[], unsigned n_extra_pids); +int show_cgroup_and_extra_by_spec(const char *spec, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, const pid_t extra_pids[], unsigned n_extra_pids, OutputFlags flags); +int show_cgroup_and_extra(const char *controller, const char *path, const char *prefix, unsigned n_columns, bool kernel_threads, bool all, const pid_t extra_pids[], unsigned n_extra_pids, OutputFlags flags); #endif diff --git a/src/shared/logs-show.h b/src/shared/logs-show.h index 3e6b6e0..3b63a5d 100644 --- a/src/shared/logs-show.h +++ b/src/shared/logs-show.h @@ -27,26 +27,6 @@ #include "util.h" -typedef enum OutputMode { - OUTPUT_SHORT, - OUTPUT_SHORT_MONOTONIC, - OUTPUT_VERBOSE, - OUTPUT_EXPORT, - OUTPUT_JSON, - OUTPUT_JSON_PRETTY, - OUTPUT_CAT, - _OUTPUT_MODE_MAX, - _OUTPUT_MODE_INVALID = -1 -} OutputMode; - -typedef enum OutputFlags { - OUTPUT_SHOW_ALL = 1 << 0, - OUTPUT_FOLLOW = 1 << 1, - OUTPUT_WARN_CUTOFF = 1 << 2, - OUTPUT_FULL_WIDTH = 1 << 3, - OUTPUT_COLOR = 1 << 4 -} OutputFlags; - int output_journal(sd_journal *j, OutputMode mode, unsigned line, unsigned n_columns, OutputFlags flags); diff --git a/src/shared/util.c b/src/shared/util.c index 97f766c..884f13f 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -971,11 +971,9 @@ int get_process_comm(pid_t pid, char **name) { return r; } -int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line) { - char *r, *k; +int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line, OutputFlags flags) { + char *r = NULL, *k; int c; - bool space = false; - size_t left; FILE *f; assert(max_length > 0); @@ -994,47 +992,66 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char * if (!f) return -errno; + if (flags & OUTPUT_FULL_WIDTH) { + size_t len = 0, alloc = 0; + while ((c = getc(f)) != EOF) { + if(alloc <= len+1) { + alloc += 20; + k = realloc(r, alloc); + if (k == NULL) { + free(r); + fclose(f); + return log_oom(); + } + r = k; + } + r[len] = isprint(c) ? c : ' '; + r[++len] = 0; + } + } else { + bool space = false; + size_t left; + r = new(char, max_length); + if (!r) { + fclose(f); + return -ENOMEM; + } - r = new(char, max_length); - if (!r) { - fclose(f); - return -ENOMEM; - } + k = r; + left = max_length; + while ((c = getc(f)) != EOF) { + + if (isprint(c)) { + if (space) { + if (left <= 4) + break; - k = r; - left = max_length; - while ((c = getc(f)) != EOF) { + *(k++) = ' '; + left--; + space = false; + } - if (isprint(c)) { - if (space) { if (left <= 4) break; - *(k++) = ' '; + *(k++) = (char) c; left--; - space = false; - } - - if (left <= 4) - break; + } else + space = true; + } - *(k++) = (char) c; - left--; - } else - space = true; + if (left <= 4) { + size_t n = MIN(left-1, 3U); + memcpy(k, "...", n); + k[n] = 0; + } else + *k = 0; } - if (left <= 4) { - size_t n = MIN(left-1, 3U); - memcpy(k, "...", n); - k[n] = 0; - } else - *k = 0; - fclose(f); /* Kernel threads have no argv[] */ - if (r[0] == 0) { + if (r == NULL || r[0] == 0) { char *t; int h; diff --git a/src/shared/util.h b/src/shared/util.h index e1d4735..6e32531 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -42,6 +42,26 @@ typedef uint64_t usec_t; typedef uint64_t nsec_t; +typedef enum OutputMode { + OUTPUT_SHORT, + OUTPUT_SHORT_MONOTONIC, + OUTPUT_VERBOSE, + OUTPUT_EXPORT, + OUTPUT_JSON, + OUTPUT_JSON_PRETTY, + OUTPUT_CAT, + _OUTPUT_MODE_MAX, + _OUTPUT_MODE_INVALID = -1 +} OutputMode; + +typedef enum OutputFlags { + OUTPUT_SHOW_ALL = 1 << 0, + OUTPUT_FOLLOW = 1 << 1, + OUTPUT_WARN_CUTOFF = 1 << 2, + OUTPUT_FULL_WIDTH = 1 << 3, + OUTPUT_COLOR = 1 << 4 +} OutputFlags; + typedef struct dual_timestamp { usec_t realtime; usec_t monotonic; @@ -250,7 +270,7 @@ char *file_in_same_dir(const char *path, const char *filename); int rmdir_parents(const char *path, const char *stop); int get_process_comm(pid_t pid, char **name); -int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line); +int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line, OutputFlags flags); int get_process_exe(pid_t pid, char **name); int get_process_uid(pid_t pid, uid_t *uid); int get_process_gid(pid_t pid, gid_t *gid); diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index cc9c775..3685d26 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -2040,6 +2040,12 @@ static void print_status_info(UnitStatusInfo *i) { char since1[FORMAT_TIMESTAMP_PRETTY_MAX], *s1; char since2[FORMAT_TIMESTAMP_MAX], *s2; const char *path; + int flags = + arg_all * OUTPUT_SHOW_ALL | + arg_follow * OUTPUT_FOLLOW | + !arg_quiet * OUTPUT_WARN_CUTOFF | + on_tty() * OUTPUT_COLOR | + arg_full * OUTPUT_FULL_WIDTH; assert(i); @@ -2267,17 +2273,11 @@ static void print_status_info(UnitStatusInfo *i) { if (i->control_pid > 0) extra[k++] = i->control_pid; - show_cgroup_and_extra_by_spec(i->default_control_group, "\t\t ", c, false, arg_all, extra, k); + show_cgroup_and_extra_by_spec(i->default_control_group, "\t\t ", c, false, arg_all, extra, k, flags); } } if (i->id && arg_transport != TRANSPORT_SSH) { - int flags = - arg_all * OUTPUT_SHOW_ALL | - arg_follow * OUTPUT_FOLLOW | - !arg_quiet * OUTPUT_WARN_CUTOFF | - on_tty() * OUTPUT_COLOR; - printf("\n"); show_journal_by_unit(i->id, arg_output, 0, i->inactive_exit_timestamp_monotonic, -- 1.7.6.5
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel