summaryrefslogtreecommitdiff
path: root/hyprpm/src/core/HyprlandSocket.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-04-29 18:59:43 +0200
committerGitHub <noreply@github.com>2025-04-29 18:59:43 +0200
commit5bd7ff884dc613ad22ecd227d41ce6ad7ee336df (patch)
tree63696482d6ca82db0f123ed53ce798ba500b7c44 /hyprpm/src/core/HyprlandSocket.cpp
parent21184404885cf61f7c10d2eb749478ef6b035dd2 (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.cpp85
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;
+}