int bus_open_system_systemd(sd_bus **_bus) { _cleanup_bus_unref_ sd_bus *bus = NULL; int r; assert(_bus); if (geteuid() != 0) return sd_bus_open_system(_bus); /* If we are root, then let's talk directly to the system * instance, instead of going via the bus */ r = sd_bus_new(&bus); if (r < 0) return r; r = sd_bus_set_address(bus, "unix:path=/run/systemd/private"); if (r < 0) return r; r = sd_bus_start(bus); if (r < 0) return r; r = bus_check_peercred(bus); if (r < 0) return r; *_bus = bus; bus = NULL; return 0; }
int bus_open_user_systemd(sd_bus **_bus) { _cleanup_bus_unref_ sd_bus *bus = NULL; _cleanup_free_ char *ee = NULL; const char *e; int r; /* Try via kdbus first, and then directly */ assert(_bus); #ifdef ENABLE_KDBUS r = sd_bus_new(&bus); if (r < 0) return r; if (asprintf(&bus->address, KERNEL_USER_BUS_FMT, getuid()) < 0) return -ENOMEM; bus->bus_client = true; r = sd_bus_start(bus); if (r >= 0) { *_bus = bus; bus = NULL; return 0; } bus = sd_bus_unref(bus); #endif e = secure_getenv("XDG_RUNTIME_DIR"); if (!e) return sd_bus_open_user(_bus); ee = bus_address_escape(e); if (!ee) return -ENOMEM; r = sd_bus_new(&bus); if (r < 0) return r; bus->address = strjoin("unix:path=", ee, "/systemd/private", NULL); if (!bus->address) return -ENOMEM; r = sd_bus_start(bus); if (r < 0) return sd_bus_open_user(_bus); r = bus_check_peercred(bus); if (r < 0) return r; *_bus = bus; bus = NULL; return 0; }
int bus_open_system_systemd(sd_bus **_bus) { _cleanup_bus_unref_ sd_bus *bus = NULL; int r; assert(_bus); if (geteuid() != 0) return sd_bus_open_system(_bus); /* If we are root and kdbus is not available, then let's talk * directly to the system instance, instead of going via the * bus */ #ifdef ENABLE_KDBUS r = sd_bus_new(&bus); if (r < 0) return r; r = sd_bus_set_address(bus, KERNEL_SYSTEM_BUS_PATH); if (r < 0) return r; bus->bus_client = true; r = sd_bus_start(bus); if (r >= 0) { *_bus = bus; bus = NULL; return 0; } bus = sd_bus_unref(bus); #endif r = sd_bus_new(&bus); if (r < 0) return r; r = sd_bus_set_address(bus, "unix:path=/run/systemd/private"); if (r < 0) return r; r = sd_bus_start(bus); if (r < 0) return sd_bus_open_system(_bus); r = bus_check_peercred(bus); if (r < 0) return r; *_bus = bus; bus = NULL; return 0; }
int main(int argc, char *argv[]) { DBusError error; DBusConnection *bus = NULL; DBusMessage *m = NULL; int r = EXIT_FAILURE; dbus_error_init(&error); if (argc != 2) { log_error("Incorrect number of arguments."); goto finish; } log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); /* We send this event to the private D-Bus socket and then the * system instance will forward this to the system bus. We do * this to avoid an activation loop when we start dbus when we * are called when the dbus service is shut down. */ if (!(bus = dbus_connection_open_private("unix:path=/run/systemd/private", &error))) { #ifndef LEGACY dbus_error_free(&error); /* Retry with the pre v21 socket name, to ease upgrades */ if (!(bus = dbus_connection_open_private("unix:abstract=/org/freedesktop/systemd1/private", &error))) { #endif log_error("Failed to get D-Bus connection: %s", bus_error_message(&error)); goto finish; } #ifndef LEGACY } #endif if (bus_check_peercred(bus) < 0) { log_error("Bus owner not root."); goto finish; } if (!(m = dbus_message_new_signal("/org/freedesktop/systemd1/agent", "org.freedesktop.systemd1.Agent", "Released"))) { log_error("Could not allocate signal message."); goto finish; } if (!dbus_message_append_args(m, DBUS_TYPE_STRING, &argv[1], DBUS_TYPE_INVALID)) { log_error("Could not attach group information to signal message."); goto finish; } if (!dbus_connection_send(bus, m, NULL)) { log_error("Failed to send signal message on private connection."); goto finish; } r = EXIT_SUCCESS; finish: if (bus) { dbus_connection_flush(bus); dbus_connection_close(bus); dbus_connection_unref(bus); } if (m) dbus_message_unref(m); dbus_error_free(&error); return r; }