chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
8e471cc
)
unit: make cgroup controller/path specification more flexible
author
Lennart Poettering
<lennart@poettering.net>
Sat, 10 Apr 2010 02:46:52 +0000
(
04:46
+0200)
committer
Lennart Poettering
<lennart@poettering.net>
Sat, 10 Apr 2010 16:00:20 +0000
(18:00 +0200)
unit.c
patch
|
blob
|
history
diff --git
a/unit.c
b/unit.c
index 6406015b4bc075cf9855ff222f4fe0bfa9c19533..a8058500d1411070e0f20bef675b279b9ae263f8 100644
(file)
--- a/
unit.c
+++ b/
unit.c
@@
-1316,55
+1316,72
@@
int unit_add_cgroup(Unit *u, CGroupBonding *b) {
return 0;
}
return 0;
}
+static char *default_cgroup_path(Unit *u) {
+ char *p;
+
+ assert(u);
+
+ if (asprintf(&p, "%s/%s", u->meta.manager->cgroup_hierarchy, unit_id(u)) < 0)
+ return NULL;
+
+ return p;
+}
+
int unit_add_cgroup_from_text(Unit *u, const char *name) {
size_t n;
int unit_add_cgroup_from_text(Unit *u, const char *name) {
size_t n;
- const char *p;
- char *controller;
- CGroupBonding *b;
+ char *controller = NULL, *path = NULL;
+ CGroupBonding *b = NULL;
int r;
assert(u);
assert(name);
/* Detect controller name */
int r;
assert(u);
assert(name);
/* Detect controller name */
- n = strcspn(name, ":
/
");
+ n = strcspn(name, ":");
- /* Only controller name, no path? No path? */
- if (name[n] == 0)
- return -EINVAL;
+ if (name[n] == 0 ||
+ (name[n] == ':' && name[n+1] == 0)) {
- if (n > 0) {
- if (name[n] != ':')
- return -EINVAL;
+ /* Only controller name, no path? */
- p = name+n+1;
- } else
- p = name;
+ if (!(path = default_cgroup_path(u)))
+ return -ENOMEM;
- /* Insist in absolute paths */
- if (p[0] != '/')
- return -EINVAL;
+ } else {
+ const char *p;
- if (!(controller = strndup(name, n)))
-
return -ENOMEM
;
+ /* Controller name, and path. */
+
p = name+n+1
;
- if (cgroup_bonding_find_list(u->meta.cgroup_bondings, controller)) {
- free(controller);
- return -EEXIST;
+ if (!path_is_absolute(p))
+ return -EINVAL;
+
+ if (!(path = strdup(p)))
+ return -ENOMEM;
}
}
- if (!(b = new0(CGroupBonding, 1))) {
- free(controller);
- return -ENOMEM;
+ if (n > 0)
+ controller = strndup(name, n);
+ else
+ controller = strdup(u->meta.manager->cgroup_controller);
+
+ if (!controller) {
+ r = -ENOMEM;
+ goto fail;
}
}
- b->controller = controller;
+ if (cgroup_bonding_find_list(u->meta.cgroup_bondings, controller)) {
+ r = -EEXIST;
+ goto fail;
+ }
- if (!(b
->path = strdup(p
))) {
+ if (!(b
= new0(CGroupBonding, 1
))) {
r = -ENOMEM;
goto fail;
}
r = -ENOMEM;
goto fail;
}
+ b->controller = controller;
+ b->path = path;
b->only_us = false;
b->clean_up = false;
b->only_us = false;
b->clean_up = false;
@@
-1374,8
+1391,8
@@
int unit_add_cgroup_from_text(Unit *u, const char *name) {
return 0;
fail:
return 0;
fail:
- free(
b->
path);
- free(
b->
controller);
+ free(path);
+ free(controller);
free(b);
return r;
free(b);
return r;
@@
-1398,7
+1415,7
@@
int unit_add_default_cgroup(Unit *u) {
if (!(b->controller = strdup(u->meta.manager->cgroup_controller)))
goto fail;
if (!(b->controller = strdup(u->meta.manager->cgroup_controller)))
goto fail;
- if (
asprintf(&b->path, "%s/%s", u->meta.manager->cgroup_hierarchy, unit_id(u)) < 0
)
+ if (
!(b->path = default_cgroup_path(u))
)
goto fail;
b->clean_up = true;
goto fail;
b->clean_up = true;