[systemd-devel] [PATCH v4 2/4] timer: timer can be a transient unit
Lennart Poettering
lennart at poettering.net
Wed Dec 3 10:04:16 PST 2014
On Tue, 02.12.14 23:29, WaLyong Cho (walyong.cho at samsung.com) wrote:
> ---
> src/core/dbus-timer.c | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++
> src/core/dbus-timer.h | 3 +
> src/core/timer.c | 4 ++
> 3 files changed, 166 insertions(+)
>
> diff --git a/src/core/dbus-timer.c b/src/core/dbus-timer.c
> index f1f8c54..e916f5a 100644
> --- a/src/core/dbus-timer.c
> +++ b/src/core/dbus-timer.c
> @@ -24,6 +24,8 @@
> #include "dbus-unit.h"
> #include "dbus-timer.h"
> #include "bus-util.h"
> +#include "errno-list.h"
> +#include "strv.h"
>
> static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, timer_result, TimerResult);
>
> @@ -183,3 +185,160 @@ const sd_bus_vtable bus_timer_vtable[] = {
> SD_BUS_PROPERTY("WakeSystem", "b", bus_property_get_bool, offsetof(Timer, wake_system), SD_BUS_VTABLE_PROPERTY_CONST),
> SD_BUS_VTABLE_END
> };
> +
> +static int bus_timer_set_transient_property(
> + Timer *t,
> + const char *name,
> + sd_bus_message *message,
> + UnitSetPropertiesMode mode,
> + sd_bus_error *error) {
> +
> + const char *str;
> + int r;
> +
> + assert(t);
> + assert(name);
> + assert(message);
> +
> + if (STR_IN_SET(name,
> + "OnActiveSec",
> + "OnBootSec",
> + "OnStartupSec",
> + "OnUnitActiveSec",
> + "OnUnitInactiveSec")) {
> +
> + TimerValue *v;
> + TimerBase b = _TIMER_BASE_INVALID;
> + usec_t u = 0;
> +
> + b = timer_base_from_string(name);
> + if (b < 0)
> + return 0;
"return 0" indicates success, you should really return "b" or -EINVAL here.
> +
> + r = sd_bus_message_read(message, "t", &u);
> + if (r < 0)
> + return r;
> +
> + if (mode != UNIT_CHECK) {
> + unit_write_drop_in_private_format(UNIT(t),
> + mode,
> + name,
> + "%s=%lu\n",
> + name,
> + u);
Too eager line break...
> +
> + v = new0(TimerValue, 1);
> + if (!v)
> + return -ENOMEM;
> +
> + v->base = b;
> + v->value = u;
> +
> + LIST_PREPEND(value, t->values, v);
> + }
> +
> + return 1;
> +
> + } else if (streq(name, "OnCalendar")) {
> +
> + TimerValue *v;
> + CalendarSpec *c = NULL;
> +
> + r = sd_bus_message_read(message, "s", &str);
> + if (r < 0)
> + return r;
> +
> + if (mode != UNIT_CHECK) {
> + r = calendar_spec_from_string(str, &c);
> + if (r < 0)
> + return r;
> +
> + unit_write_drop_in_private_format(UNIT(t),
> + mode,
> + name,
> + "%s=%s\n",
> + name,
> + str);
Same...
> +
> + v = new0(TimerValue, 1);
> + if (!v) {
> + if (c)
> + calendar_spec_free(c);
> + return -ENOMEM;
> + }
> +
> + v->base = TIMER_CALENDAR;
> + v->calendar_spec = c;
> +
> + LIST_PREPEND(value, t->values, v);
> + }
> +
> + return 1;
> +
> + } else if (streq(name, "AccuracySec")) {
> +
> + usec_t u = 0;
> +
> + r = sd_bus_message_read(message, "t", &u);
> + if (r < 0)
> + return r;
> +
> + if (mode != UNIT_CHECK) {
> + t->accuracy_usec = u;
> + unit_write_drop_in_private_format(UNIT(t),
> + mode,
> + name,
> + "%s=%lu\n",
> + name,
> + u);
Same...
> + }
> +
> + return 1;
> +
> + } else if (streq(name, "WakeSystem")) {
> +
> + int b;
> +
> + r = sd_bus_message_read(message, "b", &b);
> + if (r < 0)
> + return r;
> +
> + if (mode != UNIT_CHECK) {
> + t->wake_system = b;
> + unit_write_drop_in_private_format(UNIT(t),
> + mode,
> + name,
> + "%s=%s\n",
> + name,
> +
> yes_no(t->wake_system));
Same...
> + }
> +
> + return 1;
> +
> + }
> +
> + return 0;
> +}
Looks really good otherwise!
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list