From 6f3b004199a6b1bb0a8f5431d677ab926bdf19f3 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 3 Jun 2022 17:41:57 +0200 Subject: [PATCH] IPC and log changes, introduce signature --- hyprctl/main.cpp | 17 +++++++++++++++-- src/Compositor.cpp | 11 +++++++---- src/Compositor.hpp | 1 + src/debug/HyprCtl.cpp | 8 ++++---- src/debug/Log.cpp | 10 ++++++++-- src/debug/Log.hpp | 3 +++ src/main.cpp | 4 ++++ src/managers/EventManager.cpp | 8 ++++---- 8 files changed, 46 insertions(+), 16 deletions(-) diff --git a/hyprctl/main.cpp b/hyprctl/main.cpp index 60ee9606..d0c7d9ed 100644 --- a/hyprctl/main.cpp +++ b/hyprctl/main.cpp @@ -45,12 +45,25 @@ void request(std::string arg) { return; } + // get the instance signature + auto instanceSig = getenv("HYPRLAND_INSTANCE_SIGNATURE"); + + if (!instanceSig) { + std::cout << "HYPRLAND_INSTANCE_SIGNATURE was not set! (Is Hyprland running?)"; + return; + } + + std::string instanceSigStr = std::string(instanceSig); + sockaddr_un serverAddress = {0}; serverAddress.sun_family = AF_UNIX; - strcpy(serverAddress.sun_path, "/tmp/hypr/.socket.sock"); + + std::string socketPath = "/tmp/hypr/" + instanceSigStr + "/.socket.sock"; + + strcpy(serverAddress.sun_path, socketPath.c_str()); if (connect(SERVERSOCKET, (sockaddr*)&serverAddress, SUN_LEN(&serverAddress)) < 0) { - std::cout << "Couldn't connect to /tmp/hypr/.socket.sock. (3) Is Hyprland running?"; + std::cout << "Couldn't connect to " << socketPath << ". (3)"; return; } diff --git a/src/Compositor.cpp b/src/Compositor.cpp index f7f1d68f..c9a89603 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1,11 +1,14 @@ #include "Compositor.hpp" CCompositor::CCompositor() { - unlink("/tmp/hypr/hyprland.log"); - unlink("/tmp/hypr/hyprlandd.log"); - unlink("/tmp/hypr/.hyprlandrq"); + m_szInstanceSignature = GIT_COMMIT_HASH + std::string("_") + std::to_string(time(NULL)); - system("mkdir -p /tmp/hypr"); + Debug::log(LOG, "Instance Signature: %s", m_szInstanceSignature.c_str()); + + setenv("HYPRLAND_INSTANCE_SIGNATURE", m_szInstanceSignature.c_str(), true); + + const auto INSTANCEPATH = "/tmp/hypr/" + m_szInstanceSignature; + mkdir(INSTANCEPATH.c_str(), S_IRWXU | S_IRWXG); m_sWLDisplay = wl_display_create(); diff --git a/src/Compositor.hpp b/src/Compositor.hpp index d3e76819..92cb1f55 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -63,6 +63,7 @@ public: const char* m_szWLDisplaySocket; + std::string m_szInstanceSignature = ""; std::list m_lMonitors; std::list m_lWindows; diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index c890dbb2..a8030992 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -266,11 +266,11 @@ void HyprCtl::startHyprCtlSocket() { return; } - unlink("/tmp/hypr/.socket.sock"); - sockaddr_un SERVERADDRESS = {.sun_family = AF_UNIX}; - strcpy(SERVERADDRESS.sun_path, "/tmp/hypr/.socket.sock"); + std::string socketPath = "/tmp/hypr/" + g_pCompositor->m_szInstanceSignature + "/.socket.sock"; + + strcpy(SERVERADDRESS.sun_path, socketPath.c_str()); bind(SOCKET, (sockaddr*)&SERVERADDRESS, SUN_LEN(&SERVERADDRESS)); @@ -282,7 +282,7 @@ void HyprCtl::startHyprCtlSocket() { char readBuffer[1024] = {0}; - Debug::log(LOG, "Hypr socket started."); + Debug::log(LOG, "Hypr socket started at %s", socketPath.c_str()); while(1) { const auto ACCEPTEDCONNECTION = accept(SOCKET, (sockaddr*)&clientAddress, &clientSize); diff --git a/src/debug/Log.cpp b/src/debug/Log.cpp index 3a008758..b3d13583 100644 --- a/src/debug/Log.cpp +++ b/src/debug/Log.cpp @@ -4,12 +4,18 @@ #include #include +void Debug::init() { + if (ISDEBUG) + logFile = "/tmp/hypr/hyprlandd-" + std::to_string(time(NULL)) + ".log"; + else + logFile = "/tmp/hypr/hyprland-" + std::to_string(time(NULL)) + ".log"; +} + void Debug::log(LogLevel level, const char* fmt, ...) { // log to a file - const std::string DEBUGPATH = ISDEBUG ? "/tmp/hypr/hyprlandd.log" : "/tmp/hypr/hyprland.log"; std::ofstream ofs; - ofs.open(DEBUGPATH, std::ios::out | std::ios::app); + ofs.open(logFile, std::ios::out | std::ios::app); switch (level) { case LOG: diff --git a/src/debug/Log.hpp b/src/debug/Log.hpp index 7dca950f..d5aa6958 100644 --- a/src/debug/Log.hpp +++ b/src/debug/Log.hpp @@ -12,5 +12,8 @@ enum LogLevel { }; namespace Debug { + void init(); void log(LogLevel level, const char* fmt, ...); + + inline std::string logFile; }; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index cdad06e7..a6f2469c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,6 +19,10 @@ int main(int argc, char** argv) { ignoreSudo = true; } + system("mkdir -p /tmp/hypr"); + + Debug::init(); + if (!ignoreSudo) { if (Init::isSudo()) { Debug::log(CRIT, "Hyprland shall not be run as the root user. If you really want to, use the --i-am-really-stupid flag."); diff --git a/src/managers/EventManager.cpp b/src/managers/EventManager.cpp index a8bde442..eed0e6e5 100644 --- a/src/managers/EventManager.cpp +++ b/src/managers/EventManager.cpp @@ -1,4 +1,5 @@ #include "EventManager.hpp" +#include "../Compositor.hpp" #include #include @@ -26,10 +27,9 @@ void CEventManager::startThread() { return; } - unlink("/tmp/hypr/.socket2.sock"); - sockaddr_un SERVERADDRESS = {.sun_family = AF_UNIX}; - strcpy(SERVERADDRESS.sun_path, "/tmp/hypr/.socket2.sock"); + std::string socketPath = "/tmp/hypr/" + g_pCompositor->m_szInstanceSignature + "/.socket2.sock"; + strcpy(SERVERADDRESS.sun_path, socketPath.c_str()); bind(SOCKET, (sockaddr*)&SERVERADDRESS, SUN_LEN(&SERVERADDRESS)); @@ -41,7 +41,7 @@ void CEventManager::startThread() { sockaddr_in clientAddress; socklen_t clientSize = sizeof(clientAddress); - Debug::log(LOG, "Hypr socket 2 started."); + Debug::log(LOG, "Hypr socket 2 started at %s", socketPath.c_str()); // set the socket nonblock int flags = fcntl(SOCKET, F_GETFL, 0);