From a94534606412ec30620f68751382cea5b700ba8d Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Sat, 20 Apr 2024 22:50:07 +0500 Subject: core: remove libsystemd dependency (#5660) * remove libsystemd dependency as per Lennart Poettering's advice: https://github.com/systemd/systemd/issues/32028#issuecomment-2031366922 * fix naming for systemd helper functions * rename vars according to code style * Nix: update meson patch --------- Co-authored-by: Mihai Fufezan --- src/helpers/SdDaemon.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/helpers/SdDaemon.cpp (limited to 'src/helpers/SdDaemon.cpp') diff --git a/src/helpers/SdDaemon.cpp b/src/helpers/SdDaemon.cpp new file mode 100644 index 00000000..0835637a --- /dev/null +++ b/src/helpers/SdDaemon.cpp @@ -0,0 +1,58 @@ +#include "SdDaemon.hpp" + +#include + +#include +#include +#include +#include + +namespace Systemd { + int SdBooted(void) { + if (!faccessat(AT_FDCWD, "/run/systemd/system/", F_OK, AT_SYMLINK_NOFOLLOW)) + return true; + + if (errno == ENOENT) + return false; + + return -errno; + } + + int SdNotify(int unsetEnvironment, const char* state) { + int fd = socket(AF_UNIX, SOCK_DGRAM, 0); + if (fd == -1) + return -errno; + + constexpr char envVar[] = "NOTIFY_SOCKET"; + + auto cleanup = [unsetEnvironment, envVar](int* fd) { + if (unsetEnvironment) + unsetenv(envVar); + close(*fd); + }; + std::unique_ptr fdCleaup(&fd, cleanup); + + const char* addr = getenv(envVar); + if (!addr) + return 0; + + // address length must be at most this; see man 7 unix + size_t addrLen = strnlen(addr, 107); + + struct sockaddr_un unixAddr; + unixAddr.sun_family = AF_UNIX; + strncpy(unixAddr.sun_path, addr, addrLen); + if (unixAddr.sun_path[0] == '@') + unixAddr.sun_path[0] = '\0'; + + if (!connect(fd, (const sockaddr*)&unixAddr, sizeof(struct sockaddr_un))) + return 1; + + // arbitrary value which seems to be enough for s-d messages + size_t stateLen = strnlen(state, 128); + if (write(fd, state, stateLen) >= 0) + return 1; + + return -errno; + } +} -- cgit v1.2.3