1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-27 03:21:32 +03:00

sd-login: teach sd_pid_get_unit() proper handling of instantiated services

This commit is contained in:
Lennart Poettering 2012-01-13 00:49:02 +01:00
parent 7c8bbccd07
commit ebda471d89

View File

@ -123,7 +123,8 @@ _public_ int sd_pid_get_session(pid_t pid, char **session) {
_public_ int sd_pid_get_unit(pid_t pid, char **unit) {
int r;
char *cgroup, *p;
char *cgroup, *p, *at, *b;
size_t k;
if (!unit)
return -EINVAL;
@ -138,13 +139,37 @@ _public_ int sd_pid_get_unit(pid_t pid, char **unit) {
}
p = cgroup + 8;
p = strndup(p, strcspn(p, "/"));
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 (!p)
if (!b)
return -ENOMEM;
*unit = p;
*unit = b;
return 0;
}