if (!ku)
return -ENOMEM;
- r = unit_add_cgroup_from_text(u, ku);
+ r = unit_add_cgroup_from_text(u, ku, true, NULL);
if (r < 0) {
log_error("[%s:%u] Failed to parse cgroup value %s, ignoring: %s",
filename, line, k, rvalue);
void *userdata) {
Timer *t = data;
- usec_t u;
+ usec_t u = 0;
TimerValue *v;
TimerBase b;
+ CalendarSpec *c = NULL;
+ clockid_t id;
assert(filename);
assert(lvalue);
assert(rvalue);
assert(data);
- if ((b = timer_base_from_string(lvalue)) < 0) {
+ b = timer_base_from_string(lvalue);
+ if (b < 0) {
log_error("[%s:%u] Failed to parse timer base, ignoring: %s", filename, line, lvalue);
return 0;
}
- if (parse_usec(rvalue, &u) < 0) {
- log_error("[%s:%u] Failed to parse timer value, ignoring: %s", filename, line, rvalue);
- return 0;
+ if (b == TIMER_CALENDAR) {
+ if (calendar_spec_from_string(rvalue, &c) < 0) {
+ log_error("[%s:%u] Failed to parse calendar specification, ignoring: %s", filename, line, rvalue);
+ return 0;
+ }
+
+ id = CLOCK_REALTIME;
+ } else {
+ if (parse_usec(rvalue, &u) < 0) {
+ log_error("[%s:%u] Failed to parse timer value, ignoring: %s", filename, line, rvalue);
+ return 0;
+ }
+
+ id = CLOCK_MONOTONIC;
}
- if (!(v = new0(TimerValue, 1)))
+ v = new0(TimerValue, 1);
+ if (!v)
return -ENOMEM;
v->base = b;
+ v->clock_id = id;
v->value = u;
+ v->calendar_spec = c;
LIST_PREPEND(TimerValue, value, t->values, v);
int r;
DBusError error;
Unit *u;
+ _cleanup_free_ char *p = NULL;
assert(filename);
assert(lvalue);
dbus_error_init(&error);
- if (endswith(rvalue, ".path")) {
- log_error("[%s:%u] Unit cannot be of type path, ignoring: %s", filename, line, rvalue);
+ p = unit_name_printf(UNIT(t), rvalue);
+ if (!p)
+ return log_oom();
+
+ if (endswith(p, ".path")) {
+ log_error("[%s:%u] Unit cannot be of type path, ignoring: %s", filename, line, p);
return 0;
}
- if ((r = manager_load_unit(UNIT(t)->manager, rvalue, NULL, &error, &u)) < 0) {
- log_error("[%s:%u] Failed to load unit %s, ignoring: %s", filename, line, rvalue, bus_error(&error, r));
+ r = manager_load_unit(UNIT(t)->manager, p, NULL, &error, &u);
+ if (r < 0) {
+ log_error("[%s:%u] Failed to load unit %s, ignoring: %s", filename, line, p, bus_error(&error, r));
dbus_error_free(&error);
return 0;
}
return 0;
}
- r = unit_add_cgroup_attribute(u, NULL, l[0], l[1], NULL);
+ r = unit_add_cgroup_attribute(u, NULL, l[0], l[1], NULL, NULL);
strv_free(l);
if (r < 0) {
if (asprintf(&t, "%lu", ul) < 0)
return -ENOMEM;
- r = unit_add_cgroup_attribute(u, "cpu", "cpu.shares", t, NULL);
+ r = unit_add_cgroup_attribute(u, "cpu", "cpu.shares", t, NULL, NULL);
free(t);
if (r < 0) {
r = unit_add_cgroup_attribute(u,
"memory",
streq(lvalue, "MemorySoftLimit") ? "memory.soft_limit_in_bytes" : "memory.limit_in_bytes",
- t, NULL);
+ t, NULL, NULL);
free(t);
if (r < 0) {
r = unit_add_cgroup_attribute(u, "devices",
streq(lvalue, "DeviceAllow") ? "devices.allow" : "devices.deny",
- rvalue, device_map);
+ rvalue, device_map, NULL);
if (r < 0) {
log_error("[%s:%u] Failed to add cgroup attribute value, ignoring: %s", filename, line, rvalue);
return -ENOMEM;
if (device)
- r = unit_add_cgroup_attribute(u, "blkio", "blkio.weight_device", t, blkio_map);
+ r = unit_add_cgroup_attribute(u, "blkio", "blkio.weight_device", t, blkio_map, NULL);
else
- r = unit_add_cgroup_attribute(u, "blkio", "blkio.weight", t, NULL);
+ r = unit_add_cgroup_attribute(u, "blkio", "blkio.weight", t, NULL, NULL);
free(t);
if (r < 0) {
r = unit_add_cgroup_attribute(u, "blkio",
streq(lvalue, "BlockIOReadBandwidth") ? "blkio.read_bps_device" : "blkio.write_bps_device",
- t, blkio_map);
+ t, blkio_map, NULL);
free(t);
if (r < 0) {