]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
cgtop: use common function to query cgroup root
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 2 Feb 2017 01:26:58 +0000 (20:26 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 2 Feb 2017 01:29:09 +0000 (20:29 -0500)
show_cgroup_get_root_and_warn is renamed to show_cgroup_get_path_and_warn
because it now optionally allows querying a non-root path.

This removes duplicated code and teaches cgtop to combine
-M with a root prefix:

$ systemd-cgtop -M myprecious /system.slice
...

src/cgls/cgls.c
src/cgtop/cgtop.c
src/shared/cgroup-show.c
src/shared/cgroup-show.h

index e6ec9640a8b2c2073ed88432f82ca3a1b8e677c6..1d21c1c20ce3f8ceff2de7024b824b459f468f16 100644 (file)
@@ -154,7 +154,7 @@ int main(int argc, char *argv[]) {
                 _cleanup_free_ char *root = NULL;
                 int i;
 
-                r = show_cgroup_get_root_and_warn(arg_machine, &root);
+                r = show_cgroup_get_path_and_warn(arg_machine, NULL, &root);
                 if (r < 0)
                         goto finish;
 
@@ -223,7 +223,7 @@ int main(int argc, char *argv[]) {
                 if (!done) {
                         _cleanup_free_ char *root = NULL;
 
-                        r = show_cgroup_get_root_and_warn(arg_machine, &root);
+                        r = show_cgroup_get_path_and_warn(arg_machine, NULL, &root);
                         if (r < 0)
                                 goto finish;
 
index af5c3d869544de3fd4b062f985ea01cfd5755820..50ac6a58b0aa2870299493aa59ec30b612d3dd38 100644 (file)
@@ -31,6 +31,7 @@
 #include "alloc-util.h"
 #include "bus-error.h"
 #include "bus-util.h"
+#include "cgroup-show.h"
 #include "cgroup-util.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -862,13 +863,9 @@ static int parse_argv(int argc, char *argv[]) {
                         assert_not_reached("Unhandled option");
                 }
 
-        if (optind == argc-1) {
-                if (arg_machine) {
-                        log_error("Specifying a control group path together with the -M option is not allowed");
-                        return -EINVAL;
-                }
+        if (optind == argc - 1)
                 arg_root = argv[optind];
-        else if (optind < argc) {
+        else if (optind < argc) {
                 log_error("Too many arguments.");
                 return -EINVAL;
         }
@@ -890,59 +887,6 @@ static const char* counting_what(void) {
                 return "userspace processes (excl. kernel)";
 }
 
-static int get_cgroup_root(char **ret) {
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
-        _cleanup_free_ char *unit = NULL, *path = NULL;
-        const char *m;
-        int r;
-
-        if (arg_root) {
-                char *aux;
-
-                aux = strdup(arg_root);
-                if (!aux)
-                        return log_oom();
-
-                *ret = aux;
-                return 0;
-        }
-
-        if (!arg_machine) {
-                r = cg_get_root_path(ret);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to get root control group path: %m");
-
-                return 0;
-        }
-
-        m = strjoina("/run/systemd/machines/", arg_machine);
-        r = parse_env_file(m, NEWLINE, "SCOPE", &unit, NULL);
-        if (r < 0)
-                return log_error_errno(r, "Failed to load machine data: %m");
-
-        path = unit_dbus_path_from_name(unit);
-        if (!path)
-                return log_oom();
-
-        r = bus_connect_transport_systemd(BUS_TRANSPORT_LOCAL, NULL, false, &bus);
-        if (r < 0)
-                return log_error_errno(r, "Failed to create bus connection: %m");
-
-        r = sd_bus_get_property_string(
-                        bus,
-                        "org.freedesktop.systemd1",
-                        path,
-                        unit_dbus_interface_from_name(unit),
-                        "ControlGroup",
-                        &error,
-                        ret);
-        if (r < 0)
-                return log_error_errno(r, "Failed to query unit control group path: %s", bus_error_message(&error, r));
-
-        return 0;
-}
-
 int main(int argc, char *argv[]) {
         int r;
         Hashmap *a = NULL, *b = NULL;
@@ -967,11 +911,12 @@ int main(int argc, char *argv[]) {
         if (r <= 0)
                 goto finish;
 
-        r = get_cgroup_root(&root);
+        r = show_cgroup_get_path_and_warn(arg_machine, arg_root, &root);
         if (r < 0) {
                 log_error_errno(r, "Failed to get root control group path: %m");
                 goto finish;
-        }
+        } else
+                log_debug("Cgroup path: %s", root);
 
         a = hashmap_new(&string_hash_ops);
         b = hashmap_new(&string_hash_ops);
index 105710436e05bfdf842a968976ac1d917d24b442..c9815f22ac6963e7c777d2ea10bd6761f24fd1e3 100644 (file)
@@ -317,51 +317,65 @@ int show_cgroup_and_extra_by_spec(
         return show_cgroup_and_extra(controller, path, prefix, n_columns, extra_pids, n_extra_pids, flags);
 }
 
-int show_cgroup_get_root_and_warn(
+int show_cgroup_get_path_and_warn(
                 const char *machine,
+                const char *prefix,
                 char **ret) {
 
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
-        _cleanup_free_ char *unit = NULL, *path = NULL;
-        const char *m;
         int r;
+        _cleanup_free_ char *root = NULL;
+
+        if (machine) {
+                _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+                _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+                _cleanup_free_ char *unit = NULL, *path = NULL;
+                const char *m;
+
+                m = strjoina("/run/systemd/machines/", machine);
+                r = parse_env_file(m, NEWLINE, "SCOPE", &unit, NULL);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to load machine data: %m");
 
-        if (!machine) {
-                r = cg_get_root_path(ret);
+                path = unit_dbus_path_from_name(unit);
+                if (!path)
+                        return log_oom();
+
+                r = bus_connect_transport_systemd(BUS_TRANSPORT_LOCAL, NULL, false, &bus);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to create bus connection: %m");
+
+                r = sd_bus_get_property_string(
+                                bus,
+                                "org.freedesktop.systemd1",
+                                path,
+                                unit_dbus_interface_from_name(unit),
+                                "ControlGroup",
+                                &error,
+                                &root);
+                if (r < 0)
+                        return log_error_errno(r, "Failed to query unit control group path: %s",
+                                               bus_error_message(&error, r));
+        } else {
+                r = cg_get_root_path(&root);
                 if (r == -ENOMEDIUM)
                         return log_error_errno(r, "Failed to get root control group path.\n"
                                                   "No cgroup filesystem mounted on /sys/fs/cgroup");
                 else if (r < 0)
                         return log_error_errno(r, "Failed to get root control group path: %m");
-
-                return 0;
         }
 
-        m = strjoina("/run/systemd/machines/", machine);
-        r = parse_env_file(m, NEWLINE, "SCOPE", &unit, NULL);
-        if (r < 0)
-                return log_error_errno(r, "Failed to load machine data: %m");
+        if (prefix) {
+                char *t;
 
-        path = unit_dbus_path_from_name(unit);
-        if (!path)
-                return log_oom();
+                t = strjoin(root, prefix);
+                if (!t)
+                        return log_oom();
 
-        r = bus_connect_transport_systemd(BUS_TRANSPORT_LOCAL, NULL, false, &bus);
-        if (r < 0)
-                return log_error_errno(r, "Failed to create bus connection: %m");
-
-        r = sd_bus_get_property_string(
-                        bus,
-                        "org.freedesktop.systemd1",
-                        path,
-                        unit_dbus_interface_from_name(unit),
-                        "ControlGroup",
-                        &error,
-                        ret);
-        if (r < 0)
-                return log_error_errno(r, "Failed to query unit control group path: %s",
-                                       bus_error_message(&error, r));
+                *ret = t;
+        } else {
+                *ret = root;
+                root = NULL;
+        }
 
         return 0;
 }
index 0574f405523afaad2c64aa3fe954f2e71af26489..1445c05f1f21db4f3919149b305ad527f9772e69 100644 (file)
@@ -31,6 +31,7 @@ int show_cgroup(const char *controller, const char *path, const char *prefix, un
 int show_cgroup_and_extra_by_spec(const char *spec, const char *prefix, unsigned n_columns, 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, const pid_t extra_pids[], unsigned n_extra_pids, OutputFlags flags);
 
-int show_cgroup_get_root_and_warn(
+int show_cgroup_get_path_and_warn(
                 const char *machine,
+                const char *prefix,
                 char **ret);