build-sys: fix built with --disable-logind
This commit is contained in:
@@ -1149,3 +1149,108 @@ char **cg_shorten_controllers(char **controllers) {
|
||||
*t = NULL;
|
||||
return controllers;
|
||||
}
|
||||
|
||||
int cg_pid_get_cgroup(pid_t pid, char **root, char **cgroup) {
|
||||
char *cg_process, *cg_init, *p;
|
||||
int r;
|
||||
|
||||
assert(pid >= 0);
|
||||
|
||||
if (pid == 0)
|
||||
pid = getpid();
|
||||
|
||||
r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &cg_process);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 1, &cg_init);
|
||||
if (r < 0) {
|
||||
free(cg_process);
|
||||
return r;
|
||||
}
|
||||
|
||||
if (endswith(cg_init, "/system"))
|
||||
cg_init[strlen(cg_init)-7] = 0;
|
||||
else if (streq(cg_init, "/"))
|
||||
cg_init[0] = 0;
|
||||
|
||||
if (startswith(cg_process, cg_init))
|
||||
p = cg_process + strlen(cg_init);
|
||||
else
|
||||
p = cg_process;
|
||||
|
||||
free(cg_init);
|
||||
|
||||
if (cgroup) {
|
||||
char* c;
|
||||
|
||||
c = strdup(p);
|
||||
if (!c) {
|
||||
free(cg_process);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
*cgroup = c;
|
||||
}
|
||||
|
||||
if (root) {
|
||||
cg_process[p-cg_process] = 0;
|
||||
*root = cg_process;
|
||||
} else
|
||||
free(cg_process);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cg_pid_get_unit(pid_t pid, char **unit) {
|
||||
int r;
|
||||
char *cgroup, *p, *at, *b;
|
||||
size_t k;
|
||||
|
||||
assert(pid >= 0);
|
||||
assert(unit);
|
||||
|
||||
r = cg_pid_get_cgroup(pid, NULL, &cgroup);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (!startswith(cgroup, "/system/")) {
|
||||
free(cgroup);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
p = cgroup + 8;
|
||||
k = strcspn(p, "/");
|
||||
|
||||
at = memchr(p, '@', k);
|
||||
if (at && at[1] == '.') {
|
||||
size_t j;
|
||||
|
||||
/* This is a templated service */
|
||||
if (p[k] != '/') {
|
||||
free(cgroup);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
j = strcspn(p+k+1, "/");
|
||||
|
||||
b = malloc(k + j + 1);
|
||||
|
||||
if (b) {
|
||||
memcpy(b, p, at - p + 1);
|
||||
memcpy(b + (at - p) + 1, p + k + 1, j);
|
||||
memcpy(b + (at - p) + 1 + j, at + 1, k - (at - p) - 1);
|
||||
b[k+j] = 0;
|
||||
}
|
||||
} else
|
||||
b = strndup(p, k);
|
||||
|
||||
free(cgroup);
|
||||
|
||||
if (!b)
|
||||
return -ENOMEM;
|
||||
|
||||
*unit = b;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
@@ -69,6 +69,8 @@ int cg_is_empty(const char *controller, const char *path, bool ignore_self);
|
||||
int cg_is_empty_recursive(const char *controller, const char *path, bool ignore_self);
|
||||
|
||||
int cg_get_user_path(char **path);
|
||||
int cg_pid_get_cgroup(pid_t pid, char **root, char **cgroup);
|
||||
int cg_pid_get_unit(pid_t pid, char **unit);
|
||||
|
||||
char **cg_shorten_controllers(char **controllers);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user