diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2025-04-29 18:59:43 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-29 18:59:43 +0200 |
| commit | 5bd7ff884dc613ad22ecd227d41ce6ad7ee336df (patch) | |
| tree | 63696482d6ca82db0f123ed53ce798ba500b7c44 /hyprpm/src/core/HyprlandSocket.cpp | |
| parent | 21184404885cf61f7c10d2eb749478ef6b035dd2 (diff) | |
permissions: add perms for plugin loading (#10184)
Adds permission management for loading plugins
---------
Co-authored-by: Jan Beich <jbeich@FreeBSD.org>
Diffstat (limited to 'hyprpm/src/core/HyprlandSocket.cpp')
| -rw-r--r-- | hyprpm/src/core/HyprlandSocket.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/hyprpm/src/core/HyprlandSocket.cpp b/hyprpm/src/core/HyprlandSocket.cpp new file mode 100644 index 00000000..4d86192c --- /dev/null +++ b/hyprpm/src/core/HyprlandSocket.cpp @@ -0,0 +1,85 @@ +#include "HyprlandSocket.hpp" +#include <pwd.h> +#include <sys/socket.h> +#include "../helpers/StringUtils.hpp" +#include <print> +#include <sys/un.h> +#include <unistd.h> + +static int getUID() { + const auto UID = getuid(); + const auto PWUID = getpwuid(UID); + return PWUID ? PWUID->pw_uid : UID; +} + +static std::string getRuntimeDir() { + const auto XDG = getenv("XDG_RUNTIME_DIR"); + + if (!XDG) { + const std::string USERID = std::to_string(getUID()); + return "/run/user/" + USERID + "/hypr"; + } + + return std::string{XDG} + "/hypr"; +} + +std::string NHyprlandSocket::send(const std::string& cmd) { + const auto SERVERSOCKET = socket(AF_UNIX, SOCK_STREAM, 0); + + if (SERVERSOCKET < 0) { + std::println("{}", failureString("Couldn't open a socket (1)")); + return ""; + } + + const auto HIS = getenv("HYPRLAND_INSTANCE_SIGNATURE"); + + if (!HIS) { + std::println("{}", failureString("HYPRLAND_INSTANCE_SIGNATURE was not set! (Is Hyprland running?) (3)")); + return ""; + } + + sockaddr_un serverAddress = {0}; + serverAddress.sun_family = AF_UNIX; + + std::string socketPath = getRuntimeDir() + "/" + HIS + "/.socket.sock"; + + strncpy(serverAddress.sun_path, socketPath.c_str(), sizeof(serverAddress.sun_path) - 1); + + if (connect(SERVERSOCKET, (sockaddr*)&serverAddress, SUN_LEN(&serverAddress)) < 0) { + std::println("{}", failureString("Couldn't connect to " + socketPath + ". (4)")); + return ""; + } + + auto sizeWritten = write(SERVERSOCKET, cmd.c_str(), cmd.length()); + + if (sizeWritten < 0) { + std::println("{}", failureString("Couldn't write (5)")); + return ""; + } + + std::string reply = ""; + constexpr size_t BUFFER_SIZE = 8192; + char buffer[BUFFER_SIZE] = {0}; + + sizeWritten = read(SERVERSOCKET, buffer, BUFFER_SIZE); + + if (sizeWritten < 0) { + std::println("{}", failureString("Couldn't read (6)")); + return ""; + } + + reply += std::string(buffer, sizeWritten); + + while (sizeWritten == BUFFER_SIZE) { + sizeWritten = read(SERVERSOCKET, buffer, BUFFER_SIZE); + if (sizeWritten < 0) { + std::println("{}", failureString("Couldn't read (7)")); + return ""; + } + reply += std::string(buffer, sizeWritten); + } + + close(SERVERSOCKET); + + return reply; +} |
