X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcgroups-agent%2Fcgroups-agent.c;h=9fb7e34dd7560da2fbac627e56fcf51e5f3d009d;hb=HEAD;hp=7a6173e2a26fed3d5f03226036a9c80150ec315e;hpb=dce818b390a857a11f7dd634684500675cf79833;p=elogind.git diff --git a/src/cgroups-agent/cgroups-agent.c b/src/cgroups-agent/cgroups-agent.c index 7a6173e2a..9fb7e34dd 100644 --- a/src/cgroups-agent/cgroups-agent.c +++ b/src/cgroups-agent/cgroups-agent.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,83 +17,55 @@ along with systemd; If not, see . ***/ -#include - #include +#include +#include "fd-util.h" #include "log.h" -#include "dbus-common.h" +#include "socket-util.h" + +/// Additional includes needed by elogind +#include "musl_missing.h" int main(int argc, char *argv[]) { - DBusError error; - DBusConnection *bus = NULL; - DBusMessage *m = NULL; - int r = EXIT_FAILURE; - dbus_error_init(&error); + static const union sockaddr_union sa = { + .un.sun_family = AF_UNIX, + .un.sun_path = "/run/systemd/cgroups-agent", + }; + + _cleanup_close_ int fd = -1; + ssize_t n; + size_t l; if (argc != 2) { log_error("Incorrect number of arguments."); - goto finish; + return EXIT_FAILURE; } + elogind_set_program_name(argv[0]); 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 + fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); + if (fd < 0) { + log_debug_errno(errno, "Failed to allocate socket: %m"); + return EXIT_FAILURE; } -#endif - if (bus_check_peercred(bus) < 0) { - log_error("Bus owner not root."); - goto finish; - } + l = strlen(argv[1]); - if (!(m = dbus_message_new_signal("/org/freedesktop/systemd1/agent", "org.freedesktop.systemd1.Agent", "Released"))) { - log_error("Could not allocate signal message."); - goto finish; + n = sendto(fd, argv[1], l, 0, &sa.sa, SOCKADDR_UN_LEN(sa.un)); + if (n < 0) { + log_debug_errno(errno, "Failed to send cgroups agent message: %m"); + return EXIT_FAILURE; } - 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 ((size_t) n != l) { + log_debug("Datagram size mismatch"); + return EXIT_FAILURE; } - 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; + return EXIT_SUCCESS; }