From: Franck Bui Date: Tue, 2 May 2017 07:59:17 +0000 (+0200) Subject: core: introduce cg_mask_from_string()/cg_mask_to_string() X-Git-Tag: chiark/234.4-1+devuan1.1+iwj1~144 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=d5aacbb6077b4e45fd36fbff6843595aa64d2288 core: introduce cg_mask_from_string()/cg_mask_to_string() --- diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index d30edd41b..ec2c52991 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -2265,6 +2265,60 @@ int cg_trim_everywhere(CGroupMask supported, const char *path, bool delete_root) } #endif // 0 +int cg_mask_to_string(CGroupMask mask, char **ret) { + const char *controllers[_CGROUP_CONTROLLER_MAX + 1]; + CGroupController c; + int i = 0; + char *s; + + assert(ret); + + if (mask == 0) { + *ret = NULL; + return 0; + } + + for (c = 0; c < _CGROUP_CONTROLLER_MAX; c++) { + + if (!(mask & CGROUP_CONTROLLER_TO_MASK(c))) + continue; + + controllers[i++] = cgroup_controller_to_string(c); + controllers[i] = NULL; + } + + s = strv_join((char **)controllers, NULL); + if (!s) + return -ENOMEM; + + *ret = s; + return 0; +} + +int cg_mask_from_string(const char *value, CGroupMask *mask) { + assert(mask); + assert(value); + + for (;;) { + _cleanup_free_ char *n = NULL; + CGroupController v; + int r; + + r = extract_first_word(&value, &n, NULL, 0); + if (r < 0) + return r; + if (r == 0) + break; + + v = cgroup_controller_from_string(n); + if (v < 0) + continue; + + *mask |= CGROUP_CONTROLLER_TO_MASK(v); + } + return 0; +} + int cg_mask_supported(CGroupMask *ret) { CGroupMask mask = 0; int r; @@ -2278,7 +2332,6 @@ int cg_mask_supported(CGroupMask *ret) { return r; if (r > 0) { _cleanup_free_ char *root = NULL, *controllers = NULL, *path = NULL; - const char *c; /* In the unified hierarchy we can read the supported * and accessible controllers from a the top-level @@ -2296,23 +2349,9 @@ int cg_mask_supported(CGroupMask *ret) { if (r < 0) return r; - c = controllers; - for (;;) { - _cleanup_free_ char *n = NULL; - CGroupController v; - - r = extract_first_word(&c, &n, NULL, 0); - if (r < 0) - return r; - if (r == 0) - break; - - v = cgroup_controller_from_string(n); - if (v < 0) - continue; - - mask |= CGROUP_CONTROLLER_TO_MASK(v); - } + r = cg_mask_from_string(controllers, &mask); + if (r < 0) + return r; /* Currently, we support the cpu, memory, io and pids * controller in the unified hierarchy, mask diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h index ea74df4e6..1ea4d3d08 100644 --- a/src/basic/cgroup-util.h +++ b/src/basic/cgroup-util.h @@ -246,6 +246,8 @@ int cg_enable_everywhere(CGroupMask supported, CGroupMask mask, const char *p); #endif // 0 int cg_mask_supported(CGroupMask *ret); +int cg_mask_from_string(const char *s, CGroupMask *ret); +int cg_mask_to_string(CGroupMask mask, char **ret); #if 0 /// UNNEEDED by elogind int cg_kernel_controllers(Set *controllers);