X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcgls%2Fcgls.c;h=c3229ad2d3dbca66dc7c21c3d088423dd9d78bc5;hb=6faa3dcbb8c2c9d89b23a39ca9be258c453255d9;hp=e01a7b13a139d535ed57356bd1a1e7bc70263ff8;hpb=7027ff61a34a12487712b382a061c654acc3a679;p=elogind.git diff --git a/src/cgls/cgls.c b/src/cgls/cgls.c index e01a7b13a..c3229ad2d 100644 --- a/src/cgls/cgls.c +++ b/src/cgls/cgls.c @@ -34,11 +34,13 @@ #include "pager.h" #include "build.h" #include "output-mode.h" +#include "fileio.h" static bool arg_no_pager = false; static bool arg_kernel_threads = false; static bool arg_all = false; static int arg_full = -1; +static char* arg_machine = NULL; static void help(void) { @@ -48,8 +50,9 @@ static void help(void) { " --version Show package version\n" " --no-pager Do not pipe output into a pager\n" " -a --all Show all groups, including empty\n" - " --full Do not ellipsize output\n" - " -k Include kernel threads in output\n", + " -l --full Do not ellipsize output\n" + " -k Include kernel threads in output\n" + " -M --machine Show container\n", program_invocation_short_name); } @@ -58,7 +61,6 @@ static int parse_argv(int argc, char *argv[]) { enum { ARG_NO_PAGER = 0x100, ARG_VERSION, - ARG_FULL, }; static const struct option options[] = { @@ -66,7 +68,8 @@ static int parse_argv(int argc, char *argv[]) { { "version", no_argument, NULL, ARG_VERSION }, { "no-pager", no_argument, NULL, ARG_NO_PAGER }, { "all", no_argument, NULL, 'a' }, - { "full", no_argument, NULL, ARG_FULL }, + { "full", no_argument, NULL, 'l' }, + { "machine", required_argument, NULL, 'M' }, { NULL, 0, NULL, 0 } }; @@ -75,7 +78,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 1); assert(argv); - while ((c = getopt_long(argc, argv, "hka", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hkalM:", options, NULL)) >= 0) { switch (c) { @@ -96,7 +99,7 @@ static int parse_argv(int argc, char *argv[]) { arg_all = true; break; - case ARG_FULL: + case 'l': arg_full = true; break; @@ -104,6 +107,10 @@ static int parse_argv(int argc, char *argv[]) { arg_kernel_threads = true; break; + case 'M': + arg_machine = optarg; + break; + case '?': return -EINVAL; @@ -119,6 +126,7 @@ static int parse_argv(int argc, char *argv[]) { int main(int argc, char *argv[]) { int r = 0, retval = EXIT_FAILURE; int output_flags; + char _cleanup_free_ *root = NULL; log_parse_environment(); log_open(); @@ -144,20 +152,27 @@ int main(int argc, char *argv[]) { (arg_full > 0) * OUTPUT_FULL_WIDTH; if (optind < argc) { - unsigned i; + int i; - for (i = (unsigned) optind; i < (unsigned) argc; i++) { + for (i = optind; i < argc; i++) { int q; printf("%s:\n", argv[i]); - q = show_cgroup_by_path(argv[i], NULL, 0, + if (arg_machine) + root = strjoin("machine/", arg_machine, "/", argv[i], NULL); + else + root = strdup(argv[i]); + if (!root) + return log_oom(); + + q = show_cgroup_by_path(root, NULL, 0, arg_kernel_threads, output_flags); if (q < 0) r = q; } } else { - char _cleanup_free_ *p; + _cleanup_free_ char *p; p = get_current_dir_name(); if (!p) { @@ -165,16 +180,20 @@ int main(int argc, char *argv[]) { goto finish; } - if (path_startswith(p, "/sys/fs/cgroup")) { + if (path_startswith(p, "/sys/fs/cgroup") && !arg_machine) { printf("Working Directory %s:\n", p); r = show_cgroup_by_path(p, NULL, 0, arg_kernel_threads, output_flags); } else { - char _cleanup_free_ *root = NULL; - - r = cg_get_root_path(&root); + if (arg_machine) { + char *m; + m = strappenda("/run/systemd/machines/", arg_machine); + r = parse_env_file(m, NEWLINE, "CGROUP", &root, NULL); + } else + r = cg_get_root_path(&root); if (r < 0) { - log_error("Failed to get root path: %s", strerror(-r)); + log_error("Failed to get %s path: %s", + arg_machine ? "machine" : "root", strerror(-r)); goto finish; } @@ -183,10 +202,11 @@ int main(int argc, char *argv[]) { } } - if (r < 0) - log_error("Failed to list cgroup tree: %s", strerror(-r)); - - retval = EXIT_SUCCESS; + if (r < 0) { + log_error("Failed to list cgroup tree %s: %s", root, strerror(-r)); + retval = EXIT_FAILURE; + } else + retval = EXIT_SUCCESS; finish: pager_close();