}
}
-int cg_split_spec(const char *spec, char **controller, char **path) {
- char *t = NULL, *u = NULL;
- const char *e;
+int cg_split_spec(const char *spec, char **ret_controller, char **ret_path) {
+ _cleanup_free_ char *controller = NULL, *path = NULL;
assert(spec);
if (!path_is_normalized(spec))
return -EINVAL;
- if (path) {
- t = strdup(spec);
- if (!t)
+ if (ret_path) {
+ path = strdup(spec);
+ if (!path)
return -ENOMEM;
- *path = path_simplify(t, false);
+ path_simplify(path, false);
}
- if (controller)
- *controller = NULL;
-
- return 0;
- }
-
- e = strchr(spec, ':');
- if (!e) {
- if (!cg_controller_is_valid(spec))
- return -EINVAL;
+ } else {
+ const char *e;
- if (controller) {
- t = strdup(spec);
- if (!t)
+ e = strchr(spec, ':');
+ if (e) {
+ controller = strndup(spec, e-spec);
+ if (!controller)
return -ENOMEM;
+ if (!cg_controller_is_valid(controller))
+ return -EINVAL;
- *controller = t;
- }
-
- if (path)
- *path = NULL;
+ if (!isempty(e + 1)) {
+ path = strdup(e+1);
+ if (!path)
+ return -ENOMEM;
- return 0;
- }
+ if (!path_is_normalized(path) ||
+ !path_is_absolute(path))
+ return -EINVAL;
- t = strndup(spec, e-spec);
- if (!t)
- return -ENOMEM;
- if (!cg_controller_is_valid(t)) {
- free(t);
- return -EINVAL;
- }
+ path_simplify(path, false);
+ }
- if (isempty(e+1))
- u = NULL;
- else {
- u = strdup(e+1);
- if (!u) {
- free(t);
- return -ENOMEM;
- }
+ } else {
+ if (!cg_controller_is_valid(spec))
+ return -EINVAL;
- if (!path_is_normalized(u) ||
- !path_is_absolute(u)) {
- free(t);
- free(u);
- return -EINVAL;
+ if (ret_controller) {
+ controller = strdup(spec);
+ if (!controller)
+ return -ENOMEM;
+ }
}
-
- path_simplify(u, false);
}
- if (controller)
- *controller = t;
- else
- free(t);
-
- if (path)
- *path = u;
- else
- free(u);
-
+ if (ret_controller)
+ *ret_controller = TAKE_PTR(controller);
+ if (ret_path)
+ *ret_path = TAKE_PTR(path);
return 0;
}
int cg_kill(const char *controller, const char *path, int sig, CGroupFlags flags, Set *s, cg_kill_log_func_t kill_log, void *userdata);
int cg_kill_recursive(const char *controller, const char *path, int sig, CGroupFlags flags, Set *s, cg_kill_log_func_t kill_log, void *userdata);
-int cg_split_spec(const char *spec, char **controller, char **path);
+int cg_split_spec(const char *spec, char **ret_controller, char **ret_path);
int cg_mangle_path(const char *path, char **result);
int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs);