login: add an api to determine the slice a PID is located in to libsystemd-login
This commit is contained in:
parent
ed002560a1
commit
1021b21bc6
|
@ -75,3 +75,8 @@ LIBSYSTEMD_LOGIN_203 {
|
||||||
global:
|
global:
|
||||||
sd_get_machine_names;
|
sd_get_machine_names;
|
||||||
} LIBSYSTEMD_LOGIN_202;
|
} LIBSYSTEMD_LOGIN_202;
|
||||||
|
|
||||||
|
LIBSYSTEMD_LOGIN_204 {
|
||||||
|
global:
|
||||||
|
sd_pid_get_slice;
|
||||||
|
} LIBSYSTEMD_LOGIN_203;
|
||||||
|
|
|
@ -72,6 +72,16 @@ _public_ int sd_pid_get_machine_name(pid_t pid, char **name) {
|
||||||
return cg_pid_get_machine_name(pid, name);
|
return cg_pid_get_machine_name(pid, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_public_ int sd_pid_get_slice(pid_t pid, char **slice) {
|
||||||
|
|
||||||
|
if (pid < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
if (!slice)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return cg_pid_get_slice(pid, slice);
|
||||||
|
}
|
||||||
|
|
||||||
_public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
|
_public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
|
||||||
|
|
||||||
if (pid < 0)
|
if (pid < 0)
|
||||||
|
|
|
@ -1227,11 +1227,11 @@ int cg_path_decode_unit(const char *cgroup, char **unit){
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *skip_slices(const char *p) {
|
static const char *skip_slices(const char *p) {
|
||||||
size_t n;
|
|
||||||
|
|
||||||
/* Skips over all slice assignments */
|
/* Skips over all slice assignments */
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
size_t n;
|
||||||
|
|
||||||
p += strspn(p, "/");
|
p += strspn(p, "/");
|
||||||
|
|
||||||
n = strcspn(p, "/");
|
n = strcspn(p, "/");
|
||||||
|
@ -1475,6 +1475,53 @@ int cg_pid_get_owner_uid(pid_t pid, uid_t *uid) {
|
||||||
return cg_path_get_owner_uid(cgroup, uid);
|
return cg_path_get_owner_uid(cgroup, uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cg_path_get_slice(const char *p, char **slice) {
|
||||||
|
const char *e = NULL;
|
||||||
|
size_t m = 0;
|
||||||
|
|
||||||
|
assert(p);
|
||||||
|
assert(slice);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
p += strspn(p, "/");
|
||||||
|
|
||||||
|
n = strcspn(p, "/");
|
||||||
|
if (n <= 6 || memcmp(p + n - 6, ".slice", 6) != 0) {
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
if (!e)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
s = strndup(e, m);
|
||||||
|
if (!s)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*slice = s;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
e = p;
|
||||||
|
m = n;
|
||||||
|
|
||||||
|
p += n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int cg_pid_get_slice(pid_t pid, char **slice) {
|
||||||
|
_cleanup_free_ char *cgroup = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(slice);
|
||||||
|
|
||||||
|
r = cg_pid_get_path_shifted(pid, NULL, &cgroup);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return cg_path_get_slice(cgroup, slice);
|
||||||
|
}
|
||||||
|
|
||||||
int cg_controller_from_attr(const char *attr, char **controller) {
|
int cg_controller_from_attr(const char *attr, char **controller) {
|
||||||
const char *dot;
|
const char *dot;
|
||||||
char *c;
|
char *c;
|
||||||
|
|
|
@ -90,6 +90,7 @@ int cg_path_get_owner_uid(const char *path, uid_t *uid);
|
||||||
int cg_path_get_unit(const char *path, char **unit);
|
int cg_path_get_unit(const char *path, char **unit);
|
||||||
int cg_path_get_user_unit(const char *path, char **unit);
|
int cg_path_get_user_unit(const char *path, char **unit);
|
||||||
int cg_path_get_machine_name(const char *path, char **machine);
|
int cg_path_get_machine_name(const char *path, char **machine);
|
||||||
|
int cg_path_get_slice(const char *path, char **slice);
|
||||||
|
|
||||||
int cg_pid_get_path_shifted(pid_t pid, char **root, char **cgroup);
|
int cg_pid_get_path_shifted(pid_t pid, char **root, char **cgroup);
|
||||||
|
|
||||||
|
@ -98,6 +99,7 @@ int cg_pid_get_owner_uid(pid_t pid, uid_t *uid);
|
||||||
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);
|
int cg_pid_get_user_unit(pid_t pid, char **unit);
|
||||||
int cg_pid_get_machine_name(pid_t pid, char **machine);
|
int cg_pid_get_machine_name(pid_t pid, char **machine);
|
||||||
|
int cg_pid_get_slice(pid_t pid, char **slice);
|
||||||
|
|
||||||
int cg_path_decode_unit(const char *cgroup, char **unit);
|
int cg_path_decode_unit(const char *cgroup, char **unit);
|
||||||
|
|
||||||
|
|
|
@ -72,9 +72,12 @@ int sd_pid_get_unit(pid_t pid, char **unit);
|
||||||
int sd_pid_get_user_unit(pid_t pid, char **unit);
|
int sd_pid_get_user_unit(pid_t pid, char **unit);
|
||||||
|
|
||||||
/* Get machine name from PID, for processes assigned to VM or
|
/* Get machine name from PID, for processes assigned to VM or
|
||||||
* container. This will return an error for non-service processes. */
|
* container. This will return an error for non-machine processes. */
|
||||||
int sd_pid_get_machine_name(pid_t pid, char **name);
|
int sd_pid_get_machine_name(pid_t pid, char **name);
|
||||||
|
|
||||||
|
/* Get slice name from PID. */
|
||||||
|
int sd_pid_get_slice(pid_t pid, char **name);
|
||||||
|
|
||||||
/* Get state from uid. Possible states: offline, lingering, online, active, closing */
|
/* Get state from uid. Possible states: offline, lingering, online, active, closing */
|
||||||
int sd_uid_get_state(uid_t uid, char**state);
|
int sd_uid_get_state(uid_t uid, char**state);
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,7 @@ static void test_proc(void) {
|
||||||
assert_se(d);
|
assert_se(d);
|
||||||
|
|
||||||
FOREACH_DIRENT(de, d, break) {
|
FOREACH_DIRENT(de, d, break) {
|
||||||
_cleanup_free_ char *path = NULL, *path_shifted = NULL, *session = NULL, *unit = NULL, *user_unit = NULL, *machine = NULL, *prefix = NULL;
|
_cleanup_free_ char *path = NULL, *path_shifted = NULL, *session = NULL, *unit = NULL, *user_unit = NULL, *machine = NULL, *prefix = NULL, *slice = NULL;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
uid_t uid = (uid_t) -1;
|
uid_t uid = (uid_t) -1;
|
||||||
|
|
||||||
|
@ -156,8 +156,9 @@ static void test_proc(void) {
|
||||||
cg_pid_get_unit(pid, &unit);
|
cg_pid_get_unit(pid, &unit);
|
||||||
cg_pid_get_user_unit(pid, &user_unit);
|
cg_pid_get_user_unit(pid, &user_unit);
|
||||||
cg_pid_get_machine_name(pid, &machine);
|
cg_pid_get_machine_name(pid, &machine);
|
||||||
|
cg_pid_get_slice(pid, &slice);
|
||||||
|
|
||||||
printf("%lu\t%s\t%s\t%s\t%lu\t%s\t%s\t%s\t%s\n",
|
printf("%lu\t%s\t%s\t%s\t%lu\t%s\t%s\t%s\t%s\t%s\n",
|
||||||
(unsigned long) pid,
|
(unsigned long) pid,
|
||||||
path,
|
path,
|
||||||
prefix,
|
prefix,
|
||||||
|
@ -166,7 +167,8 @@ static void test_proc(void) {
|
||||||
session,
|
session,
|
||||||
unit,
|
unit,
|
||||||
user_unit,
|
user_unit,
|
||||||
machine);
|
machine,
|
||||||
|
slice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue