typedef struct UnitLookupParameters {
const char *name, *cgroup;
PidRef pidref;
+ sd_id128_t invocation_id;
} UnitLookupParameters;
static void unit_lookup_parameters_done(UnitLookupParameters *p) {
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);
}
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;
}
{ "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 },
{}
};
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"),