DBUS_TYPE_STRING, &old_owner,
DBUS_TYPE_STRING, &new_owner,
DBUS_TYPE_INVALID))
- log_error("Failed to parse NameOwnerChanged message: %s", error.message);
+ log_error("Failed to parse NameOwnerChanged message: %s", bus_error_message(&error));
else {
if (set_remove(BUS_CONNECTION_SUBSCRIBED(m, connection), (char*) name))
log_debug("Subscription client vanished: %s (left: %u)", name, set_size(BUS_CONNECTION_SUBSCRIBED(m, connection)));
if (!dbus_message_get_args(message, &error,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID))
- log_error("Failed to parse ActivationRequest message: %s", error.message);
+ log_error("Failed to parse ActivationRequest message: %s", bus_error_message(&error));
else {
int r;
Unit *u;
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);
case DBUS_MESSAGE_TYPE_ERROR:
assert_se(dbus_set_error_from_message(&error, reply));
- log_warning("RequestName() failed: %s", error.message);
+ log_warning("RequestName() failed: %s", bus_error_message(&error));
break;
case DBUS_MESSAGE_TYPE_METHOD_RETURN: {
&error,
DBUS_TYPE_UINT32, &r,
DBUS_TYPE_INVALID)) {
- log_error("Failed to parse RequestName() reply: %s", error.message);
+ log_error("Failed to parse RequestName() reply: %s", bus_error_message(&error));
break;
}
case DBUS_MESSAGE_TYPE_ERROR:
assert_se(dbus_set_error_from_message(&error, reply));
- log_warning("ListNames() failed: %s", error.message);
+ log_warning("ListNames() failed: %s", bus_error_message(&error));
break;
case DBUS_MESSAGE_TYPE_METHOD_RETURN: {
return 0;
}
-static dbus_bool_t allow_only_root(DBusConnection *connection, unsigned long uid, void *data) {
- return uid == 0;
+static dbus_bool_t allow_only_same_user(DBusConnection *connection, unsigned long uid, void *data) {
+ return uid == 0 || uid == geteuid();
}
static void bus_new_connection(
return;
}
- dbus_connection_set_unix_user_function(new_connection, allow_only_root, NULL, NULL);
+ dbus_connection_set_unix_user_function(new_connection, allow_only_same_user, NULL, NULL);
if (bus_setup_loop(m, new_connection) < 0)
return;
m->system_bus = m->api_bus;
else {
if (!(m->system_bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error))) {
- log_debug("Failed to get system D-Bus connection, retrying later: %s", error.message);
+ log_debug("Failed to get system D-Bus connection, retrying later: %s", bus_error_message(&error));
r = 0;
goto fail;
}
&error);
if (dbus_error_is_set(&error)) {
- log_error("Failed to register match: %s", error.message);
+ log_error("Failed to register match: %s", bus_error_message(&error));
r = -EIO;
goto fail;
}
m->api_bus = m->system_bus;
else {
if (!(m->api_bus = dbus_bus_get_private(m->running_as == MANAGER_USER ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &error))) {
- log_debug("Failed to get API D-Bus connection, retrying later: %s", error.message);
+ log_debug("Failed to get API D-Bus connection, retrying later: %s", bus_error_message(&error));
r = 0;
goto fail;
}
&error);
if (dbus_error_is_set(&error)) {
- log_error("Failed to register match: %s", error.message);
+ log_error("Failed to register match: %s", bus_error_message(&error));
r = -EIO;
goto fail;
}
&error);
if (dbus_error_is_set(&error)) {
- log_error("Failed to register match: %s", error.message);
+ log_error("Failed to register match: %s", bus_error_message(&error));
r = -EIO;
goto fail;
}
if (m->private_bus)
return 0;
- /* We want the private bus only when running as init */
- if (getpid() != 1)
- return 0;
+ if (m->running_as == MANAGER_SYSTEM) {
+
+ /* We want the private bus only when running as init */
+ if (getpid() != 1)
+ return 0;
+
+ unlink("/run/systemd/private");
+ m->private_bus = dbus_server_listen("unix:path=/run/systemd/private", &error);
+ } else {
+ const char *e;
+ char *p;
+
+ e = getenv("XDG_RUNTIME_DIR");
+ if (!e)
+ return 0;
+
+ if (asprintf(&p, "unix:path=%s/systemd/private", e) < 0) {
+ log_error("Not enough memory");
+ r = -ENOMEM;
+ goto fail;
+ }
+
+ mkdir_parents(p+10, 0755);
+ unlink(p+10);
+ m->private_bus = dbus_server_listen(p, &error);
+ free(p);
+ }
- unlink("/run/systemd/private");
- if (!(m->private_bus = dbus_server_listen("unix:path=/run/systemd/private", &error))) {
- log_error("Failed to create private D-Bus server: %s", error.message);
+ if (!m->private_bus) {
+ log_error("Failed to create private D-Bus server: %s", bus_error_message(&error));
r = -EIO;
goto fail;
}
case DBUS_MESSAGE_TYPE_ERROR:
assert_se(dbus_set_error_from_message(&error, reply));
- log_warning("GetConnectionUnixProcessID() failed: %s", error.message);
+ log_warning("GetConnectionUnixProcessID() failed: %s", bus_error_message(&error));
break;
case DBUS_MESSAGE_TYPE_METHOD_RETURN: {
&error,
DBUS_TYPE_UINT32, &r,
DBUS_TYPE_INVALID)) {
- log_error("Failed to parse GetConnectionUnixProcessID() reply: %s", error.message);
+ log_error("Failed to parse GetConnectionUnixProcessID() reply: %s", bus_error_message(&error));
break;
}
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 (message)
+ dbus_message_unref(message);
+}