// Connect the jail to our cgroup
r = pakfire_jail_set_cgroup(build->jail, build->cgroup);
- if (r) {
- ERROR(build->ctx, "Could not set cgroup for jail: %m\n");
- return r;
+ if (r < 0) {
+ switch (-r) {
+ case EINVAL:
+ ERROR(build->ctx, "cgroup cannot be used. Ignoring.\n");
+ break;
+
+ default:
+ ERROR(build->ctx, "Could not set cgroup for jail: %m\n");
+ return r;
+ }
}
// Build everything with a slightly lower priority
return NULL;
}
+int pakfire_cgroup_is_valid(struct pakfire_cgroup* self) {
+ if (self->controllers)
+ return 1;
+
+ return 0;
+}
+
int pakfire_cgroup_child(struct pakfire_cgroup** child,
struct pakfire_cgroup* cgroup, const char* path, int flags) {
return pakfire_cgroup_open(child, cgroup->ctx, cgroup, path, flags);
struct pakfire_cgroup* pakfire_cgroup_ref(struct pakfire_cgroup* cgroup);
struct pakfire_cgroup* pakfire_cgroup_unref(struct pakfire_cgroup* cgroup);
+int pakfire_cgroup_is_valid(struct pakfire_cgroup* self);
+
int pakfire_cgroup_child(struct pakfire_cgroup** child,
struct pakfire_cgroup* cgroup, const char* path, int flags);
if (cgroup) {
DEBUG(jail->ctx, "Setting cgroup %p\n", cgroup);
+ // Don't accept the cgroup if it is in an invalid state
+ if (!pakfire_cgroup_is_valid(cgroup))
+ return -EINVAL;
+
jail->cgroup = pakfire_cgroup_ref(cgroup);
}