[systemd-commits] 2 commits - src/core

Lennart Poettering lennart at kemper.freedesktop.org
Mon Dec 8 07:34:45 PST 2014


 src/core/dbus-manager.c |   98 ++++++++++++++++++++++++++++----
 src/core/dbus-timer.c   |  143 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/core/dbus-timer.h   |    3 +
 src/core/timer.c        |    4 +
 4 files changed, 236 insertions(+), 12 deletions(-)

New commits:
commit d8a812d168971ef2a03bbf3d1cc5e9911f942264
Author: WaLyong Cho <walyong.cho at samsung.com>
Date:   Tue Dec 9 00:03:53 2014 +0900

    timer: timer can be a transient unit

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,
 };

commit ab31f6b8713d43354c3716ee4c37fe4460db9254
Author: WaLyong Cho <walyong.cho at samsung.com>
Date:   Tue Dec 9 00:03:52 2014 +0900

    bus: StartTransientUnit can have aux unit

diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
index 0994d7b..5fe06f9 100644
--- a/src/core/dbus-manager.c
+++ b/src/core/dbus-manager.c
@@ -615,6 +615,90 @@ static int method_set_unit_properties(sd_bus *bus, sd_bus_message *message, void
         return bus_unit_method_set_properties(bus, message, u, error);
 }
 
+static int transient_unit_from_message(
+                Manager *m,
+                sd_bus_message *message,
+                const char *name,
+                Unit **unit,
+                sd_bus_error *error) {
+
+        Unit *u;
+        int r;
+
+        assert(m);
+        assert(message);
+        assert(name);
+
+        r = manager_load_unit(m, name, NULL, error, &u);
+        if (r < 0)
+                return r;
+
+        if (u->load_state != UNIT_NOT_FOUND ||
+            set_size(u->dependencies[UNIT_REFERENCED_BY]) > 0)
+                return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS, "Unit %s already exists.", name);
+
+        /* OK, the unit failed to load and is unreferenced, now let's
+         * fill in the transient data instead */
+        r = unit_make_transient(u);
+        if (r < 0)
+                return r;
+
+        /* Set our properties */
+        r = bus_unit_set_properties(u, message, UNIT_RUNTIME, false, error);
+        if (r < 0)
+                return r;
+
+        *unit = u;
+
+        return 0;
+}
+
+static int transient_aux_units_from_message(
+                Manager *m,
+                sd_bus_message *message,
+                sd_bus_error *error) {
+
+        Unit *u;
+        char *name = NULL;
+        int r;
+
+        assert(m);
+        assert(message);
+
+        r = sd_bus_message_enter_container(message, 'a', "(sa(sv))");
+        if (r < 0)
+                return r;
+
+        while ((r = sd_bus_message_enter_container(message, 'r', "sa(sv)")) > 0) {
+                if (r <= 0)
+                        return r;
+
+                r = sd_bus_message_read(message, "s", &name);
+                if (r < 0)
+                        return r;
+
+                r = transient_unit_from_message(m, message, name, &u, error);
+                if (r < 0 && r != -EEXIST)
+                        return r;
+
+                r = unit_load(u);
+                if (r < 0)
+                        return r;
+
+                r = sd_bus_message_exit_container(message);
+                if (r < 0)
+                        return r;
+        }
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_exit_container(message);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
 static int method_start_transient_unit(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) {
         const char *name, *smode;
         Manager *m = userdata;
@@ -652,21 +736,11 @@ static int method_start_transient_unit(sd_bus *bus, sd_bus_message *message, voi
         if (r < 0)
                 return r;
 
-        r = manager_load_unit(m, name, NULL, error, &u);
-        if (r < 0)
-                return r;
-
-        if (u->load_state != UNIT_NOT_FOUND || set_size(u->dependencies[UNIT_REFERENCED_BY]) > 0)
-                return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS, "Unit %s already exists.", name);
-
-        /* OK, the unit failed to load and is unreferenced, now let's
-         * fill in the transient data instead */
-        r = unit_make_transient(u);
+        r = transient_unit_from_message(m, message, name, &u, error);
         if (r < 0)
                 return r;
 
-        /* Set our properties */
-        r = bus_unit_set_properties(u, message, UNIT_RUNTIME, false, error);
+        r = transient_aux_units_from_message(m, message, error);
         if (r < 0)
                 return r;
 



More information about the systemd-commits mailing list