summaryrefslogtreecommitdiffstats
path: root/src/systemctl.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2011-10-24 11:49:59 +0200
committerMichal Schmidt <mschmidt@redhat.com>2011-10-24 19:40:05 +0200
commit1c0a113fd3fe3344b2c947ca9948760057052716 (patch)
tree910858cae07e087ce7d210a0b680009eb6fc8416 /src/systemctl.c
parentsystemctl-completion: always invoke with --no-legend (diff)
downloadsystemd-1c0a113fd3fe3344b2c947ca9948760057052716.tar.xz
systemd-1c0a113fd3fe3344b2c947ca9948760057052716.zip
systemctl: make list-unit-files output more economical
The first column is given the width of the widest entry, if possible, otherwise all entries are ellipsized to fit in ($COLUMNS - (width of second column)). [ Added a few fixes, calculate state_cols too, respect '--no-legend', better handling of '--full' -- michich ]
Diffstat (limited to 'src/systemctl.c')
-rw-r--r--src/systemctl.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/src/systemctl.c b/src/systemctl.c
index 0de2444d43..b0baf8dc5f 100644
--- a/src/systemctl.c
+++ b/src/systemctl.c
@@ -551,11 +551,30 @@ static bool output_show_unit_file(const UnitFileList *u) {
}
static void output_unit_file_list(const UnitFileList *units, unsigned c) {
- unsigned n_shown = 0;
+ unsigned max_id_len, id_cols, state_cols, n_shown = 0;
const UnitFileList *u;
- if (on_tty())
- printf("%-25s %-6s\n", "UNIT FILE", "STATE");
+ max_id_len = sizeof("UNIT FILE")-1;
+ state_cols = sizeof("STATE")-1;
+ for (u = units; u < units + c; u++) {
+ if (!output_show_unit_file(u))
+ continue;
+
+ max_id_len = MAX(max_id_len, strlen(file_name_from_path(u->path)));
+ state_cols = MAX(state_cols, strlen(unit_file_state_to_string(u->state)));
+ }
+
+ if (!arg_full) {
+ unsigned basic_cols;
+ id_cols = MIN(max_id_len, 25);
+ basic_cols = 1 + id_cols + state_cols;
+ if (basic_cols < (unsigned) columns())
+ id_cols += MIN(columns() - basic_cols, max_id_len - id_cols);
+ } else
+ id_cols = max_id_len;
+
+ if (!arg_no_legend)
+ printf("%-*s %-*s\n", id_cols, "UNIT FILE", state_cols, "STATE");
for (u = units; u < units + c; u++) {
char *e;
@@ -580,16 +599,16 @@ static void output_unit_file_list(const UnitFileList *units, unsigned c) {
id = file_name_from_path(u->path);
- e = arg_full ? NULL : ellipsize(id, 25, 33);
+ e = arg_full ? NULL : ellipsize(id, id_cols, 33);
- printf("%-25s %s%-6s%s\n",
- e ? e : id,
- on, unit_file_state_to_string(u->state), off);
+ printf("%-*s %s%-*s%s\n",
+ id_cols, e ? e : id,
+ on, state_cols, unit_file_state_to_string(u->state), off);
free(e);
}
- if (on_tty())
+ if (!arg_no_legend)
printf("\n%u unit files listed.\n", n_shown);
}