X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fdbus.c;h=764c65cc0d80b4c832fe5d351e7d41e11ee32e9c;hb=e9816c4859454d341279f1c9e77df4af4bacd534;hp=e153c35ab3227a9aa8e86e0ca9d89bd1bce871ca;hpb=3df5bf612325b0f6a19acb67befe28d6b07d3804;p=elogind.git diff --git a/src/dbus.c b/src/dbus.c index e153c35ab..764c65cc0 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -446,7 +446,7 @@ static DBusHandlerResult system_bus_message_filter(DBusConnection *connection, D if (!dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &cgroup, DBUS_TYPE_INVALID)) - log_error("Failed to parse Released message: %s", error.message); + log_error("Failed to parse Released message: %s", bus_error_message(&error)); else cgroup_notify_empty(m, cgroup); } @@ -1212,55 +1212,6 @@ int bus_broadcast(Manager *m, DBusMessage *message) { return oom ? -ENOMEM : 0; } -int bus_parse_strv(DBusMessage *m, char ***_l) { - DBusMessageIter iter, sub; - unsigned n = 0, i = 0; - char **l; - - assert(m); - assert(_l); - - if (!dbus_message_iter_init(m, &iter) || - dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY || - dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_STRING) - return -EINVAL; - - dbus_message_iter_recurse(&iter, &sub); - - while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { - n++; - dbus_message_iter_next(&sub); - } - - if (!(l = new(char*, n+1))) - return -ENOMEM; - - assert_se(dbus_message_iter_init(m, &iter)); - dbus_message_iter_recurse(&iter, &sub); - - while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { - const char *s; - - assert_se(dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRING); - dbus_message_iter_get_basic(&sub, &s); - - if (!(l[i++] = strdup(s))) { - strv_free(l); - return -ENOMEM; - } - - dbus_message_iter_next(&sub); - } - - assert(i == n); - l[i] = NULL; - - if (_l) - *_l = l; - - return 0; -} - bool bus_has_subscriber(Manager *m) { Iterator i; DBusConnection *c; @@ -1323,3 +1274,42 @@ int bus_fdset_add_all(Manager *m, FDSet *fds) { return 0; } + +void bus_broadcast_finished( + Manager *m, + usec_t kernel_usec, + usec_t initrd_usec, + usec_t userspace_usec, + usec_t total_usec) { + + DBusMessage *message; + + assert(m); + + message = dbus_message_new_signal("/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "StartupFinished"); + if (!message) { + log_error("Out of memory."); + return; + } + + assert_cc(sizeof(usec_t) == sizeof(uint64_t)); + if (!dbus_message_append_args(message, + DBUS_TYPE_UINT64, &kernel_usec, + DBUS_TYPE_UINT64, &initrd_usec, + DBUS_TYPE_UINT64, &userspace_usec, + DBUS_TYPE_UINT64, &total_usec, + DBUS_TYPE_INVALID)) { + log_error("Out of memory."); + goto finish; + } + + + if (bus_broadcast(m, message) < 0) { + log_error("Out of memory."); + goto finish; + } + +finish: + if (m) + dbus_message_unref(message); +}