mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-10-27 18:55:09 +03:00
core/cgroup-util: simplify functions and add tests
This commit is contained in:
parent
3f98659cce
commit
96cde13ace
10
Makefile.am
10
Makefile.am
@ -1194,7 +1194,8 @@ noinst_tests += \
|
||||
test-replace-var \
|
||||
test-sched-prio \
|
||||
test-calendarspec \
|
||||
test-strip-tab-ansi
|
||||
test-strip-tab-ansi \
|
||||
test-cgroup-util
|
||||
|
||||
EXTRA_DIST += \
|
||||
test/sched_idle_bad.service \
|
||||
@ -1311,6 +1312,13 @@ test_cgroup_LDADD = \
|
||||
libsystemd-label.la \
|
||||
libsystemd-shared.la
|
||||
|
||||
test_cgroup_util_SOURCES = \
|
||||
src/test/test-cgroup-util.c
|
||||
|
||||
test_cgroup_util_LDADD = \
|
||||
libsystemd-label.la \
|
||||
libsystemd-shared.la
|
||||
|
||||
test_env_replace_SOURCES = \
|
||||
src/test/test-env-replace.c
|
||||
|
||||
|
@ -1211,69 +1211,57 @@ int cg_pid_get_cgroup(pid_t pid, char **root, char **cgroup) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int instance_unit_from_cgroup(char **cgroup){
|
||||
static int instance_unit_from_cgroup(char *cgroup){
|
||||
char *at;
|
||||
|
||||
assert(cgroup);
|
||||
|
||||
at = memchr(*cgroup, '@', strlen(*cgroup));
|
||||
if (at && at[1] == '.') {
|
||||
char *i, *s;
|
||||
|
||||
at = strstr(cgroup, "@.");
|
||||
if (at) {
|
||||
/* This is a templated service */
|
||||
i = memchr(at, '/', strlen(at));
|
||||
if(!i)
|
||||
return -EIO;
|
||||
|
||||
s = strndup(at + 1, i - at);
|
||||
if (!s)
|
||||
char *i;
|
||||
char _cleanup_free_ *i2 = NULL, *s = NULL;
|
||||
|
||||
i = strchr(at, '/');
|
||||
if (!i || !i[1]) /* disallow empty instances */
|
||||
return -EINVAL;
|
||||
|
||||
s = strndup(at + 1, i - at - 1);
|
||||
i2 = strdup(i + 1);
|
||||
if (!s || !i2)
|
||||
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);
|
||||
strcpy(at + 1, i2);
|
||||
strcat(at + 1, s);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cgroup_to_unit(char *cgroup, char **unit){
|
||||
/* non-static only for testing purposes */
|
||||
int cgroup_to_unit(char *cgroup, char **unit){
|
||||
int r;
|
||||
char *b, *p;
|
||||
size_t k;
|
||||
char *p;
|
||||
|
||||
assert(cgroup);
|
||||
assert(unit);
|
||||
|
||||
r = instance_unit_from_cgroup(&cgroup);
|
||||
r = instance_unit_from_cgroup(cgroup);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
p = strrchr(cgroup, '/') + 1;
|
||||
k = strlen(p);
|
||||
p = strrchr(cgroup, '/');
|
||||
assert(p);
|
||||
|
||||
b = strndup(p, k);
|
||||
r = unit_name_is_valid(p + 1, true);
|
||||
if (!r)
|
||||
return -EINVAL;
|
||||
|
||||
if (!b)
|
||||
*unit = strdup(p + 1);
|
||||
if (!*unit)
|
||||
return -ENOMEM;
|
||||
|
||||
r = unit_name_is_valid(b, true);
|
||||
if (!r) {
|
||||
free(b);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
*unit = b;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -73,4 +73,6 @@ 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_user_unit(pid_t pid, char **unit);
|
||||
|
||||
int cgroup_to_unit(char *cgroup, char **unit);
|
||||
|
||||
char **cg_shorten_controllers(char **controllers);
|
||||
|
27
src/test/test-cgroup-util.c
Normal file
27
src/test/test-cgroup-util.c
Normal file
@ -0,0 +1,27 @@
|
||||
#include <assert.h>
|
||||
|
||||
#include "util.h"
|
||||
#include "cgroup-util.h"
|
||||
|
||||
#define check_c_t_u(path, code, result) \
|
||||
{ \
|
||||
char a[] = path; \
|
||||
char *unit = NULL; \
|
||||
assert_se(cgroup_to_unit(a, &unit) == code); \
|
||||
assert(code < 0 || streq(unit, result)); \
|
||||
}
|
||||
|
||||
|
||||
static void test_cgroup_to_unit(void) {
|
||||
check_c_t_u("/system/getty@.service/tty2", 0, "getty@tty2.service");
|
||||
check_c_t_u("/system/getty@.service/", -EINVAL, "getty@tty2.service");
|
||||
check_c_t_u("/system/getty@.service", -EINVAL, "getty@tty2.service");
|
||||
check_c_t_u("/system/getty.service", 0, "getty.service");
|
||||
check_c_t_u("/system/getty", -EINVAL, "getty.service");
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
test_cgroup_to_unit();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user