]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: Introduce build_managed_oom_cgroups_json()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 2 Sep 2021 12:32:31 +0000 (14:32 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 16 Sep 2021 11:26:29 +0000 (12:26 +0100)
Will be reused to build the varlink message contents sent by user
instances of systemd to systemd-oomd's varlink server in a future
commit.

src/core/core-varlink.c

index b7afb87d500575f5ce3ba306bd0bbb43a3f8ed98..29bc3367eada84e9a8405bc246e04657dd14b61b 100644 (file)
@@ -123,26 +123,13 @@ int manager_varlink_send_managed_oom_update(Unit *u) {
         return varlink_notify(u->manager->managed_oom_varlink_request, v);
 }
 
-static int vl_method_subscribe_managed_oom_cgroups(
-                Varlink *link,
-                JsonVariant *parameters,
-                VarlinkMethodFlags flags,
-                void *userdata) {
+static int build_managed_oom_cgroups_json(Manager *m, JsonVariant **ret) {
         static const UnitType supported_unit_types[] = { UNIT_SLICE, UNIT_SERVICE, UNIT_SCOPE };
         _cleanup_(json_variant_unrefp) JsonVariant *v = NULL, *arr = NULL;
-        Manager *m = userdata;
         int r;
 
-        assert(link);
         assert(m);
-
-        if (json_variant_elements(parameters) > 0)
-                return varlink_error_invalid_parameter(link, parameters);
-
-        /* We only take one subscriber for this method so return an error if there's already an existing one.
-         * This shouldn't happen since systemd-oomd is the only client of this method. */
-        if (FLAGS_SET(flags, VARLINK_METHOD_MORE) && m->managed_oom_varlink_request)
-                return varlink_error(link, VARLINK_ERROR_SUBSCRIPTION_TAKEN, NULL);
+        assert(ret);
 
         r = json_build(&arr, JSON_BUILD_EMPTY_ARRAY);
         if (r < 0)
@@ -185,6 +172,35 @@ static int vl_method_subscribe_managed_oom_cgroups(
         if (r < 0)
                 return r;
 
+        *ret = TAKE_PTR(v);
+        return 0;
+}
+
+static int vl_method_subscribe_managed_oom_cgroups(
+                Varlink *link,
+                JsonVariant *parameters,
+                VarlinkMethodFlags flags,
+                void *userdata) {
+
+        _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
+        Manager *m = userdata;
+        int r;
+
+        assert(link);
+        assert(m);
+
+        if (json_variant_elements(parameters) > 0)
+                return varlink_error_invalid_parameter(link, parameters);
+
+        /* We only take one subscriber for this method so return an error if there's already an existing one.
+         * This shouldn't happen since systemd-oomd is the only client of this method. */
+        if (FLAGS_SET(flags, VARLINK_METHOD_MORE) && m->managed_oom_varlink_request)
+                return varlink_error(link, VARLINK_ERROR_SUBSCRIPTION_TAKEN, NULL);
+
+        r = build_managed_oom_cgroups_json(m, &v);
+        if (r < 0)
+                return r;
+
         if (!FLAGS_SET(flags, VARLINK_METHOD_MORE))
                 return varlink_reply(link, v);