X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcgls.c;h=20d6531123c8a69cc5293f8e72d996ebcbba0b03;hp=f1f3046edfd1897d2709c43c734ed3a5349f8e54;hb=ead51eb4ed55981f290e40a871ffbca6480c4cd3;hpb=77d5f105bf63330350c7bddacdeda914f945590f diff --git a/src/cgls.c b/src/cgls.c index f1f3046ed..20d653112 100644 --- a/src/cgls.c +++ b/src/cgls.c @@ -30,20 +30,29 @@ #include "cgroup-util.h" #include "log.h" #include "util.h" +#include "pager.h" + +static bool arg_no_pager = false; static void help(void) { printf("%s [OPTIONS...] [CGROUP...]\n\n" "Recursively show control group contents.\n\n" - " -h --help Show this help\n", + " -h --help Show this help\n" + " --no-pager Do not pipe output into a pager\n", program_invocation_short_name); } static int parse_argv(int argc, char *argv[]) { + enum { + ARG_NO_PAGER = 0x100 + }; + static const struct option options[] = { - { "help", no_argument, NULL, 'h' }, - { NULL, 0, NULL, 0 } + { "help", no_argument, NULL, 'h' }, + { "no-pager", no_argument, NULL, ARG_NO_PAGER }, + { NULL, 0, NULL, 0 } }; int c; @@ -59,6 +68,10 @@ static int parse_argv(int argc, char *argv[]) { help(); return 0; + case ARG_NO_PAGER: + arg_no_pager = true; + break; + case '?': return -EINVAL; @@ -72,7 +85,7 @@ static int parse_argv(int argc, char *argv[]) { } int main(int argc, char *argv[]) { - int r = 0, retval = 1; + int r = 0, retval = EXIT_FAILURE; log_parse_environment(); log_open(); @@ -80,10 +93,13 @@ int main(int argc, char *argv[]) { if ((r = parse_argv(argc, argv)) < 0) goto finish; else if (r == 0) { - retval = 0; + retval = EXIT_SUCCESS; goto finish; } + if (!arg_no_pager) + pager_open(); + if (optind < argc) { unsigned i; @@ -106,8 +122,22 @@ 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); - } else - r = show_cgroup(SYSTEMD_CGROUP_CONTROLLER, "/", NULL, 0); + } else { + char *root = NULL; + const char *t = NULL; + + if ((r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 1, &root)) < 0) + t = "/"; + else { + if (endswith(root, "/system")) + root[strlen(root)-7] = 0; + + t = root[0] ? root : "/"; + } + + r = show_cgroup(SYSTEMD_CGROUP_CONTROLLER, t, NULL, 0); + free(root); + } free(p); } @@ -115,9 +145,10 @@ int main(int argc, char *argv[]) { if (r < 0) log_error("Failed to list cgroup tree: %s", strerror(-r)); - retval = 0; + retval = EXIT_SUCCESS; finish: + pager_close(); return retval; }