X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcgls%2Fcgls.c;h=f400bccc0a72108de04ef369e00156d2434046b0;hp=c689b5c471c47d1be64f48d080e0c53f4eaccd8a;hb=72e6110485926c884f056717a21e4f5f3942908c;hpb=baa89da40a1d42242c9c62603501ada7e9e52613 diff --git a/src/cgls/cgls.c b/src/cgls/cgls.c index c689b5c47..f400bccc0 100644 --- a/src/cgls/cgls.c +++ b/src/cgls/cgls.c @@ -35,6 +35,10 @@ #include "build.h" #include "output-mode.h" #include "fileio.h" +#include "sd-bus.h" +#include "bus-util.h" +#include "bus-error.h" +#include "unit-name.h" static bool arg_no_pager = false; static bool arg_kernel_threads = false; @@ -43,7 +47,6 @@ static int arg_full = -1; static char* arg_machine = NULL; static void help(void) { - printf("%s [OPTIONS...] [CGROUP...]\n\n" "Recursively show control group contents.\n\n" " -h --help Show this help\n" @@ -52,8 +55,8 @@ static void help(void) { " -a --all Show all groups, including empty\n" " -l --full Do not ellipsize output\n" " -k Include kernel threads in output\n" - " -M --machine Show container\n", - program_invocation_short_name); + " -M --machine Show container\n" + , program_invocation_short_name); } static int parse_argv(int argc, char *argv[]) { @@ -70,7 +73,7 @@ static int parse_argv(int argc, char *argv[]) { { "all", no_argument, NULL, 'a' }, { "full", no_argument, NULL, 'l' }, { "machine", required_argument, NULL, 'M' }, - { NULL, 0, NULL, 0 } + {} }; int c; @@ -78,7 +81,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 1); assert(argv); - while ((c = getopt_long(argc, argv, "hkalM:", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hkalM:", options, NULL)) >= 0) switch (c) { @@ -115,10 +118,8 @@ static int parse_argv(int argc, char *argv[]) { return -EINVAL; default: - log_error("Unknown option code %c", c); - return -EINVAL; + assert_not_reached("Unhandled option"); } - } return 1; } @@ -126,7 +127,8 @@ 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; + _cleanup_free_ char *root = NULL; + _cleanup_bus_close_unref_ sd_bus *bus = NULL; log_parse_environment(); log_open(); @@ -151,6 +153,12 @@ int main(int argc, char *argv[]) { arg_all * OUTPUT_SHOW_ALL | (arg_full > 0) * OUTPUT_FULL_WIDTH; + r = bus_open_transport(BUS_TRANSPORT_LOCAL, NULL, false, &bus); + if (r < 0) { + log_error_errno(r, "Failed to create bus connection: %m"); + goto finish; + } + if (optind < argc) { int i; @@ -178,7 +186,7 @@ int main(int argc, char *argv[]) { p = get_current_dir_name(); if (!p) { - log_error("Cannot determine current working directory: %m"); + log_error_errno(errno, "Cannot determine current working directory: %m"); goto finish; } @@ -189,13 +197,57 @@ int main(int argc, char *argv[]) { } else { if (arg_machine) { char *m; + const char *cgroup; + _cleanup_free_ char *scope = NULL; + _cleanup_free_ char *path = NULL; + _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; + _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; + m = strappenda("/run/systemd/machines/", arg_machine); - r = parse_env_file(m, NEWLINE, "CGROUP", &root, NULL); + r = parse_env_file(m, NEWLINE, "SCOPE", &scope, NULL); + if (r < 0) { + log_error_errno(r, "Failed to get machine path: %m"); + goto finish; + } + + path = unit_dbus_path_from_name(scope); + if (!path) { + log_oom(); + goto finish; + } + + r = sd_bus_get_property( + bus, + "org.freedesktop.systemd1", + path, + "org.freedesktop.systemd1.Scope", + "ControlGroup", + &error, + &reply, + "s"); + + if (r < 0) { + log_error("Failed to query ControlGroup: %s", bus_error_message(&error, -r)); + goto finish; + } + + r = sd_bus_message_read(reply, "s", &cgroup); + if (r < 0) { + bus_log_parse_error(r); + goto finish; + } + + root = strdup(cgroup); + if (!root) { + log_oom(); + goto finish; + } + } else r = cg_get_root_path(&root); if (r < 0) { - log_error("Failed to get %s path: %s", - arg_machine ? "machine" : "root", strerror(-r)); + log_error_errno(r, "Failed to get %s path: %m", + arg_machine ? "machine" : "root"); goto finish; } @@ -205,7 +257,7 @@ int main(int argc, char *argv[]) { } if (r < 0) { - log_error("Failed to list cgroup tree %s: %s", root, strerror(-r)); + log_error_errno(r, "Failed to list cgroup tree %s: %m", root); retval = EXIT_FAILURE; } else retval = EXIT_SUCCESS;