* write RPM spec macros for presets
-* write man pages for systemd-cgtop, systemd-cat
+* write man pages for systemd-cat
* journal: write man pages for API
* move to LGPL2+
-* logind: selinux is borked...
-
* logind: allow showing logout dialog from system
* document that %% can be used to write % in a string that is specifier extended
* GC unreferenced jobs (such as .device jobs)
-* cgroup_notify_empty(): recursively check groups up the tree, too
-
* when failing to start a service due to ratelimiting, try again later, if restart=always is set
* write blog stories about:
- remote access
- how to pass throw-away units to systemd, or dynamically change properties of existing units
- how to integrate cgconfig and suchlike with systemd
+ - resource control in systemd
* allow port=0 in .socket units
m->cgroup_hierarchy = NULL;
}
+int cgroup_bonding_get(Manager *m, const char *cgroup, CGroupBonding **bonding) {
+ CGroupBonding *b;
+ char *p;
+
+ assert(m);
+ assert(cgroup);
+ assert(bonding);
+
+ b = hashmap_get(m->cgroup_bondings, cgroup);
+ if (!b) {
+ *bonding = b;
+ return 1;
+ }
+
+ p = strdup(cgroup);
+ if (!p)
+ return -ENOMEM;
+
+ for (;;) {
+ char *e;
+
+ e = strrchr(p, '/');
+ if (!e || e == p) {
+ free(p);
+ *bonding = NULL;
+ return 0;
+ }
+
+ *e = 0;
+
+ b = hashmap_get(m->cgroup_bondings, p);
+ if (b) {
+ free(p);
+ *bonding = b;
+ return 1;
+ }
+ }
+}
+
int cgroup_notify_empty(Manager *m, const char *group) {
CGroupBonding *l, *b;
+ int r;
assert(m);
assert(group);
- l = hashmap_get(m->cgroup_bondings, group);
- if (!l)
- return 0;
+ r = cgroup_bonding_get(m, group, &l);
+ if (r <= 0)
+ return r;
LIST_FOREACH(by_path, b, l) {
int t;
int manager_setup_cgroup(Manager *m);
void manager_shutdown_cgroup(Manager *m, bool delete);
+int cgroup_bonding_get(Manager *m, const char *cgroup, CGroupBonding **bonding);
int cgroup_notify_empty(Manager *m, const char *group);
Unit* cgroup_unit_by_pid(Manager *m, pid_t pid);
}
int manager_get_session_by_cgroup(Manager *m, const char *cgroup, Session **session) {
+ Session *s;
char *p;
assert(m);
assert(cgroup);
assert(session);
+ s = hashmap_get(m->cgroups, cgroup);
+ if (s) {
+ *session = s;
+ return 1;
+ }
+
p = strdup(cgroup);
if (!p) {
log_error("Out of memory.");
}
for (;;) {
- Session *s;
char *e;
- if (isempty(p) || streq(p, "/")) {
+ e = strrchr(p, '/');
+ if (!e || e == p) {
free(p);
*session = NULL;
return 0;
}
+ *e = 0;
+
s = hashmap_get(m->cgroups, p);
if (s) {
free(p);
*session = s;
return 1;
}
-
- assert_se(e = strrchr(p, '/'));
- *e = 0;
}
}