From: Michael Vogt Date: Wed, 29 Apr 2026 13:27:54 +0000 (+0200) Subject: core: tweak pattern of applying varlink properties for StartTransient X-Git-Tag: v261-rc1~158^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb435b832669a14d745ce587cfe0227b87cad7be;p=thirdparty%2Fsystemd.git core: tweak pattern of applying varlink properties for StartTransient So far we had the pattern to check first if any property needs setting and then have a function to set it. The downside is that when we add a new property two different places need to change (once the `if` in vl_method_start_transient_unit() and once in the specific helper to do the actual setting). So instead this commit moves everything to the helpers and tweaks the code so that we can always call the function. --- diff --git a/src/core/varlink-unit.c b/src/core/varlink-unit.c index 2e3b1dd1961..85139f068dc 100644 --- a/src/core/varlink-unit.c +++ b/src/core/varlink-unit.c @@ -703,6 +703,7 @@ static JSON_DISPATCH_ENUM_DEFINE(dispatch_service_type, ServiceType, service_typ static JSON_DISPATCH_ENUM_DEFINE(dispatch_job_mode, JobMode, job_mode_from_string); typedef struct TransientServiceParameters { + bool present; ServiceType type; TransientExecCommandItem *exec_start; size_t n_exec_start; @@ -782,6 +783,7 @@ static int dispatch_transient_service(const char *name, sd_json_variant *variant }; StartTransientContextParameters *p = ASSERT_PTR(userdata); + p->service.present = true; return sd_json_dispatch(variant, service_dispatch, /* flags= */ 0, &p->service); } @@ -807,10 +809,26 @@ static int dispatch_transient_context(const char *name, sd_json_variant *variant return r; } -static int transient_service_apply_properties(Unit *u, TransientServiceParameters *sp) { +static int transient_unit_apply_properties(Unit *u, StartTransientContextParameters *p) { + int r; + + assert(u); + assert(p); + + if (p->description) { + r = unit_set_description(u, p->description); + if (r < 0) + return r; + unit_write_settingf(u, UNIT_RUNTIME|UNIT_ESCAPE_SPECIFIERS, "Description", "Description=%s", p->description); + } + + return 0; +} + +static int transient_service_apply_properties(Service *s, TransientServiceParameters *sp) { + Unit *u = UNIT(ASSERT_PTR(s)); int r; - Service *s = ASSERT_PTR(SERVICE(u)); assert(sp); if (sp->type >= 0) { @@ -956,22 +974,18 @@ int vl_method_start_transient_unit(sd_varlink *link, sd_json_variant *parameters return varlink_reply_bus_error(link, r, &bus_error); /* Apply unit-level properties from context */ - if (p.context.description) { - r = unit_set_description(u, p.context.description); - if (r < 0) - return sd_varlink_error(link, VARLINK_ERROR_UNIT_BAD_SETTING, NULL); - unit_write_settingf(u, UNIT_RUNTIME|UNIT_ESCAPE_SPECIFIERS, "Description", "Description=%s", p.context.description); - } + r = transient_unit_apply_properties(u, &p.context); + if (r < 0) + return sd_varlink_error(link, VARLINK_ERROR_UNIT_BAD_SETTING, NULL); /* Apply service-specific properties from context.Service */ - if (p.context.service.type >= 0 || p.context.service.n_exec_start > 0 || p.context.service.remain_after_exit >= 0) { - if (t != UNIT_SERVICE) - return sd_varlink_error(link, VARLINK_ERROR_UNIT_TYPE_NOT_SUPPORTED, NULL); - - r = transient_service_apply_properties(u, &p.context.service); + Service *s = SERVICE(u); + if (s) { + r = transient_service_apply_properties(s, &p.context.service); if (r < 0) return sd_varlink_error(link, VARLINK_ERROR_UNIT_BAD_SETTING, NULL); - } + } else if (p.context.service.present) + return sd_varlink_error(link, VARLINK_ERROR_UNIT_TYPE_NOT_SUPPORTED, NULL); unit_add_to_load_queue(u); manager_dispatch_load_queue(manager);