build-sys: fix built with --disable-logind

This commit is contained in:
Lennart Poettering
2012-05-30 22:25:01 +02:00
parent 7c0987d812
commit ba1261bc02
8 changed files with 152 additions and 111 deletions
+105
View File
@@ -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;
}
+2
View File
@@ -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);