journal: log _SYSTEMD_USER_UNIT for user session units
This commit is contained in:
parent
b989350563
commit
ef1673d169
|
@ -601,8 +601,15 @@ static void dispatch_message_real(
|
||||||
if (cg_pid_get_unit(ucred->pid, &t) >= 0) {
|
if (cg_pid_get_unit(ucred->pid, &t) >= 0) {
|
||||||
unit = strappend("_SYSTEMD_UNIT=", t);
|
unit = strappend("_SYSTEMD_UNIT=", t);
|
||||||
free(t);
|
free(t);
|
||||||
} else if (unit_id)
|
} else if (cg_pid_get_user_unit(ucred->pid, &t) >= 0) {
|
||||||
unit = strappend("_SYSTEMD_UNIT=", unit_id);
|
unit = strappend("_SYSTEMD_USER_UNIT=", t);
|
||||||
|
free(t);
|
||||||
|
} else if (unit_id) {
|
||||||
|
if (session)
|
||||||
|
unit = strappend("_SYSTEMD_USER_UNIT=", unit_id);
|
||||||
|
else
|
||||||
|
unit = strappend("_SYSTEMD_UNIT=", unit_id);
|
||||||
|
}
|
||||||
|
|
||||||
if (unit)
|
if (unit)
|
||||||
IOVEC_SET_STRING(iovec[n++], unit);
|
IOVEC_SET_STRING(iovec[n++], unit);
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "path-util.h"
|
#include "path-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "unit-name.h"
|
||||||
|
|
||||||
int cg_enumerate_processes(const char *controller, const char *path, FILE **_f) {
|
int cg_enumerate_processes(const char *controller, const char *path, FILE **_f) {
|
||||||
char *fs;
|
char *fs;
|
||||||
|
@ -1210,10 +1211,75 @@ int cg_pid_get_cgroup(pid_t pid, char **root, char **cgroup) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int instance_unit_from_cgroup(char **cgroup){
|
||||||
|
char *at;
|
||||||
|
|
||||||
|
assert(cgroup);
|
||||||
|
|
||||||
|
at = memchr(*cgroup, '@', strlen(*cgroup));
|
||||||
|
if (at && at[1] == '.') {
|
||||||
|
char *i, *s;
|
||||||
|
|
||||||
|
/* This is a templated service */
|
||||||
|
i = memchr(at, '/', strlen(at));
|
||||||
|
if(!i)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
s = strndup(at + 1, i - at);
|
||||||
|
if (!s)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
i = strdup(i + 1);
|
||||||
|
if (!i) {
|
||||||
|
free(s);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(at + 1, i);
|
||||||
|
strcpy(at + strlen(i) + 1, s);
|
||||||
|
at[strlen(at) - 1] = '\0';
|
||||||
|
|
||||||
|
free(i);
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cgroup_to_unit(char *cgroup, char **unit){
|
||||||
|
int r;
|
||||||
|
char *b, *p;
|
||||||
|
size_t k;
|
||||||
|
|
||||||
|
assert(cgroup);
|
||||||
|
assert(unit);
|
||||||
|
|
||||||
|
r = instance_unit_from_cgroup(&cgroup);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
p = strrchr(cgroup, '/') + 1;
|
||||||
|
k = strlen(p);
|
||||||
|
|
||||||
|
b = strndup(p, k);
|
||||||
|
|
||||||
|
if (!b)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
r = unit_name_is_valid(b, true);
|
||||||
|
if (!r) {
|
||||||
|
free(b);
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
*unit = b;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int cg_pid_get_unit(pid_t pid, char **unit) {
|
int cg_pid_get_unit(pid_t pid, char **unit) {
|
||||||
int r;
|
int r;
|
||||||
char *cgroup, *p, *at, *b;
|
char *cgroup;
|
||||||
size_t k;
|
|
||||||
|
|
||||||
assert(pid >= 0);
|
assert(pid >= 0);
|
||||||
assert(unit);
|
assert(unit);
|
||||||
|
@ -1227,38 +1293,40 @@ int cg_pid_get_unit(pid_t pid, char **unit) {
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = cgroup + 8;
|
r = cgroup_to_unit(cgroup, unit);
|
||||||
k = strcspn(p, "/");
|
if (r < 0){
|
||||||
|
free(cgroup);
|
||||||
at = memchr(p, '@', k);
|
return r;
|
||||||
if (at && at[1] == '.') {
|
}
|
||||||
size_t j;
|
|
||||||
|
free(cgroup);
|
||||||
/* This is a templated service */
|
|
||||||
if (p[k] != '/') {
|
return 0;
|
||||||
free(cgroup);
|
}
|
||||||
return -EIO;
|
|
||||||
}
|
int cg_pid_get_user_unit(pid_t pid, char **unit) {
|
||||||
|
int r;
|
||||||
j = strcspn(p+k+1, "/");
|
char *cgroup;
|
||||||
|
|
||||||
b = malloc(k + j + 1);
|
assert(pid >= 0);
|
||||||
|
assert(unit);
|
||||||
if (b) {
|
|
||||||
memcpy(b, p, at - p + 1);
|
r = cg_pid_get_cgroup(pid, NULL, &cgroup);
|
||||||
memcpy(b + (at - p) + 1, p + k + 1, j);
|
if (r < 0)
|
||||||
memcpy(b + (at - p) + 1 + j, at + 1, k - (at - p) - 1);
|
return r;
|
||||||
b[k+j] = 0;
|
|
||||||
}
|
if (!startswith(cgroup, "/user/")) {
|
||||||
} else
|
free(cgroup);
|
||||||
b = strndup(p, k);
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = cgroup_to_unit(cgroup, unit);
|
||||||
|
if (r < 0) {
|
||||||
|
free(cgroup);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
free(cgroup);
|
free(cgroup);
|
||||||
|
|
||||||
if (!b)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
*unit = b;
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,5 +71,6 @@ int cg_is_empty_recursive(const char *controller, const char *path, bool ignore_
|
||||||
int cg_get_user_path(char **path);
|
int cg_get_user_path(char **path);
|
||||||
int cg_pid_get_cgroup(pid_t pid, char **root, char **cgroup);
|
int cg_pid_get_cgroup(pid_t pid, char **root, char **cgroup);
|
||||||
int cg_pid_get_unit(pid_t pid, char **unit);
|
int cg_pid_get_unit(pid_t pid, char **unit);
|
||||||
|
int cg_pid_get_user_unit(pid_t pid, char **unit);
|
||||||
|
|
||||||
char **cg_shorten_controllers(char **controllers);
|
char **cg_shorten_controllers(char **controllers);
|
||||||
|
|
Loading…
Reference in New Issue