#include "cgroup-util.h"
#include "missing.h"
#include "cgroup-attr.h"
+#include "mkdir.h"
const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
[UNIT_SERVICE] = &service_vtable,
_cleanup_free_ char *c = NULL;
CGroupAttribute *a;
+ int r;
assert(u);
assert(name);
assert(value);
if (!controller) {
- const char *dot;
-
- dot = strchr(name, '.');
- if (!dot)
+ r = cg_controller_from_attr(name, &c);
+ if (r < 0)
return -EINVAL;
- c = strndup(name, dot - name);
- if (!c)
- return -ENOMEM;
-
controller = c;
+ } else {
+ if (!filename_is_safe(name))
+ return -EINVAL;
+
+ if (!filename_is_safe(controller))
+ return -EINVAL;
}
- if (streq(controller, SYSTEMD_CGROUP_CONTROLLER))
+ if (!controller || streq(controller, SYSTEMD_CGROUP_CONTROLLER))
return -EINVAL;
a = cgroup_attribute_find_list(u->cgroup_attributes, controller, name);
return (ExecContext*) ((uint8_t*) u + offset);
}
+int unit_write_drop_in(Unit *u, bool runtime, const char *name, const char *data) {
+ _cleanup_free_ char *p = NULL, *q = NULL;
+ assert(u);
+
+ if (u->manager->running_as != SYSTEMD_SYSTEM)
+ return -ENOTSUP;
+
+ if (!filename_is_safe(name))
+ return -EINVAL;
+
+ p = strjoin(runtime ? "/run/systemd/system/" : "/etc/systemd/system/", u->id, ".d", NULL);
+ if (!p)
+ return -ENOMEM;
+
+ q = strjoin(p, "/50-", name, ".conf", NULL);
+ if (!q)
+ return -ENOMEM;
+
+ mkdir_p(p, 0755);
+ return write_one_line_file_atomic(q, data);
+}
+
+int unit_remove_drop_in(Unit *u, bool runtime, const char *name) {
+ _cleanup_free_ char *p = NULL, *q = NULL;
+
+ assert(u);
+
+ if (u->manager->running_as != SYSTEMD_SYSTEM)
+ return -ENOTSUP;
+
+ if (!filename_is_safe(name))
+ return -EINVAL;
+
+ p = strjoin(runtime ? "/run/systemd/system/" : "/etc/systemd/system/", u->id, ".d", NULL);
+ if (!p)
+ return -ENOMEM;
+
+ q = strjoin(p, "/50-", name, ".conf", NULL);
+ if (!q)
+ return -ENOMEM;
+
+ if (unlink(q) < 0)
+ return -errno;
+
+ rmdir(p);
+ return 0;
+}
+
static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
[UNIT_ACTIVE] = "active",
[UNIT_RELOADING] = "reloading",