[systemd-devel] [PATCH v6 2/3] timer: timer can be a transient unit
Lennart Poettering
lennart at poettering.net
Mon Dec 8 07:38:29 PST 2014
On Tue, 09.12.14 00:03, WaLyong Cho (walyong.cho at samsung.com) wrote:
Applied 1/3 and 2/3!
Thanks!
> ---
> src/core/dbus-timer.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++
> src/core/dbus-timer.h | 3 ++
> src/core/timer.c | 4 ++
> 3 files changed, 150 insertions(+)
>
> diff --git a/src/core/dbus-timer.c b/src/core/dbus-timer.c
> index f1f8c54..43e7852 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,144 @@ 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) {
> +
> + 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 -EINVAL;
> +
> + r = sd_bus_message_read(message, "t", &u);
> + if (r < 0)
> + return r;
> +
> + if (mode != UNIT_CHECK) {
> + char time[FORMAT_TIMESPAN_MAX];
> +
> + unit_write_drop_in_private_format(UNIT(t), mode, name, "%s=%s\n", name, format_timespan(time, sizeof(time), u, USEC_PER_MSEC));
> +
> + 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;
> + const char *str;
> +
> + 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);
> +
> + 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) {
> + char time[FORMAT_TIMESPAN_MAX];
> +
> + t->accuracy_usec = u;
> + unit_write_drop_in_private_format(UNIT(t), mode, name, "%s=%s\n", name, format_timespan(time, sizeof(time), u, USEC_PER_MSEC));
> + }
> +
> + 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));
> + }
> +
> + return 1;
> +
> + }
> +
> + return 0;
> +}
> +
> +int bus_timer_set_property(
> + Unit *u,
> + const char *name,
> + sd_bus_message *message,
> + UnitSetPropertiesMode mode,
> + sd_bus_error *error) {
> +
> + Timer *t = TIMER(u);
> + int r;
> +
> + assert(t);
> + assert(name);
> + assert(message);
> +
> + if (u->transient && u->load_state == UNIT_STUB) {
> + r = bus_timer_set_transient_property(t, name, message, mode, error);
> + if (r != 0)
> + return r;
> + }
> +
> + return 0;
> +}
> diff --git a/src/core/dbus-timer.h b/src/core/dbus-timer.h
> index cfff88e..103172f 100644
> --- a/src/core/dbus-timer.h
> +++ b/src/core/dbus-timer.h
> @@ -22,5 +22,8 @@
> ***/
>
> #include "sd-bus.h"
> +#include "unit.h"
>
> extern const sd_bus_vtable bus_timer_vtable[];
> +
> +int bus_timer_set_property(Unit *u, const char *name, sd_bus_message *i, UnitSetPropertiesMode mode, sd_bus_error *error);
> diff --git a/src/core/timer.c b/src/core/timer.c
> index 9155dfc..309852a 100644
> --- a/src/core/timer.c
> +++ b/src/core/timer.c
> @@ -748,6 +748,7 @@ const UnitVTable timer_vtable = {
> "Unit\0"
> "Timer\0"
> "Install\0",
> + .private_section = "Timer",
>
> .init = timer_init,
> .done = timer_done,
> @@ -773,4 +774,7 @@ const UnitVTable timer_vtable = {
>
> .bus_interface = "org.freedesktop.systemd1.Timer",
> .bus_vtable = bus_timer_vtable,
> + .bus_set_property = bus_timer_set_property,
> +
> + .can_transient = true,
> };
> --
> 1.9.3
>
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list