summaryrefslogtreecommitdiff
path: root/src/core/core-varlink.c
diff options
context:
space:
mode:
authorDaan De Meyer <daan.j.demeyer@gmail.com>2021-09-02 14:32:31 +0200
committerDaan De Meyer <daan.j.demeyer@gmail.com>2021-09-16 12:26:29 +0100
commitf2ed82d5107cfe557470958a7c0857202952aac3 (patch)
tree083bd37720e2d652157d718b11d92d9b94414fe2 /src/core/core-varlink.c
parent71feeae4bf480523d64b580117a05c61774717f1 (diff)
downloadsystemd-f2ed82d5107cfe557470958a7c0857202952aac3.tar.gz
core: Introduce build_managed_oom_cgroups_json()
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.
Diffstat (limited to 'src/core/core-varlink.c')
-rw-r--r--src/core/core-varlink.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/core/core-varlink.c b/src/core/core-varlink.c
index b7afb87d50..29bc3367ea 100644
--- a/src/core/core-varlink.c
+++ b/src/core/core-varlink.c
@@ -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);