]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: io.systemd.Unit.List can lookup by InvocationID
authorIvan Kruglov <mail@ikruglov.com>
Wed, 16 Jul 2025 14:03:49 +0000 (07:03 -0700)
committerIvan Kruglov <mail@ikruglov.com>
Mon, 20 Oct 2025 10:58:53 +0000 (03:58 -0700)
src/core/varlink-unit.c
src/shared/varlink-io.systemd.Unit.c

index 5a88bb3840218dd33b079aca5c949b2fbb5f7246..f71c3d7e33e9c50e6e2d31139ff9a04ad8c9b959 100644 (file)
@@ -359,6 +359,7 @@ static int lookup_unit_by_pidref(sd_varlink *link, Manager *manager, PidRef *pid
 typedef struct UnitLookupParameters {
         const char *name, *cgroup;
         PidRef pidref;
+        sd_id128_t invocation_id;
 } UnitLookupParameters;
 
 static void unit_lookup_parameters_done(UnitLookupParameters *p) {
@@ -376,10 +377,11 @@ static int varlink_error_no_such_unit(sd_varlink *v, const char *name) {
 static int varlink_error_conflict_lookup_parameters(sd_varlink *v, const UnitLookupParameters *p) {
         log_debug_errno(
                         ESRCH,
-                        "Searching unit by lookup parameters name='%s' pid="PID_FMT" cgroup='%s' resulted in multiple different units",
+                        "Searching unit by lookup parameters name='%s' pid="PID_FMT" cgroup='%s' invocationID='%s' resulted in multiple different units",
                         p->name,
                         p->pidref.pid,
-                        p->cgroup);
+                        p->cgroup,
+                        sd_id128_is_null(p->invocation_id) ? "" : SD_ID128_TO_UUID_STRING(p->invocation_id));
 
         return varlink_error_no_such_unit(v, /* name= */ NULL);
 }
@@ -428,6 +430,16 @@ static int lookup_unit_by_parameters(sd_varlink *link, Manager *manager, UnitLoo
                 unit = cgroup_unit;
         }
 
+        if (!sd_id128_is_null(p->invocation_id)) {
+                Unit *id128_unit = hashmap_get(manager->units_by_invocation_id, &p->invocation_id);
+                if (!id128_unit)
+                        return varlink_error_no_such_unit(link, "invocationID");
+                if (id128_unit != unit && unit != NULL)
+                        return varlink_error_conflict_lookup_parameters(link, p);
+
+                unit = id128_unit;
+        }
+
         *ret_unit = unit;
         return 0;
 }
@@ -437,6 +449,7 @@ int vl_method_list_units(sd_varlink *link, sd_json_variant *parameters, sd_varli
                 { "name",         SD_JSON_VARIANT_STRING,        json_dispatch_const_unit_name, offsetof(UnitLookupParameters, name),          0 /* allows UNIT_NAME_PLAIN | UNIT_NAME_INSTANCE */ },
                 { "pid",          _SD_JSON_VARIANT_TYPE_INVALID, json_dispatch_pidref,          offsetof(UnitLookupParameters, pidref),        SD_JSON_RELAX /* allows PID_AUTOMATIC */            },
                 { "cgroup",       SD_JSON_VARIANT_STRING,        json_dispatch_const_path,      offsetof(UnitLookupParameters, cgroup),        SD_JSON_STRICT /* require normalized path */        },
+                { "invocationID", SD_JSON_VARIANT_STRING,        sd_json_dispatch_id128,        offsetof(UnitLookupParameters, invocation_id), 0                                                   },
                 {}
         };
 
index b4c7e22b3822839637189df6b05e8a8f689b9454..eacc960792643871efe8d7dce98fb4dd478a1ec9 100644 (file)
@@ -1019,6 +1019,8 @@ static SD_VARLINK_DEFINE_METHOD_FULL(
                 SD_VARLINK_DEFINE_INPUT_BY_TYPE(pid, ProcessId, SD_VARLINK_NULLABLE),
                 SD_VARLINK_FIELD_COMMENT("If non-null the cgroup of a unit"),
                 SD_VARLINK_DEFINE_INPUT(cgroup, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
+                SD_VARLINK_FIELD_COMMENT("If non-null the invocation ID of a unit"),
+                SD_VARLINK_DEFINE_INPUT(invocationID, SD_VARLINK_STRING, SD_VARLINK_NULLABLE),
                 SD_VARLINK_FIELD_COMMENT("Configuration of the unit"),
                 SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(context, UnitContext, 0),
                 SD_VARLINK_FIELD_COMMENT("Runtime information of the unit"),