+static int instance_unit_from_cgroup(char *cgroup){
+ char *at;
+
+ assert(cgroup);
+
+ at = strstr(cgroup, "@.");
+ if (at) {
+ /* This is a templated service */
+
+ char *i;
+ char _cleanup_free_ *i2 = NULL, *s = NULL;
+
+ i = strchr(at, '/');
+ if (!i || !i[1]) /* disallow empty instances */
+ return -EINVAL;
+
+ s = strndup(at + 1, i - at - 1);
+ i2 = strdup(i + 1);
+ if (!s || !i2)
+ return -ENOMEM;
+
+ strcpy(at + 1, i2);
+ strcat(at + 1, s);
+ }
+
+ return 0;
+}
+
+/* non-static only for testing purposes */
+int cgroup_to_unit(char *cgroup, char **unit){
+ int r;
+ char *p;
+
+ assert(cgroup);
+ assert(unit);
+
+ r = instance_unit_from_cgroup(cgroup);
+ if (r < 0)
+ return r;
+
+ p = strrchr(cgroup, '/');
+ assert(p);
+
+ r = unit_name_is_valid(p + 1, true);
+ if (!r)
+ return -EINVAL;
+
+ *unit = strdup(p + 1);
+ if (!*unit)
+ return -ENOMEM;
+
+ return 0;
+}
+
+static int cg_pid_get(const char *prefix, pid_t pid, char **unit) {