From 3aa37924871c6d400ccf1bcf0d85b9bceadb3abc Mon Sep 17 00:00:00 2001 From: Markus <974709+Links2004@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:50:44 +0200 Subject: [PATCH] add $HOME/.local/share/slimevr to the possible dirs of the sockets (fix #43) (#44) * add $HOME/.local/share/slimevr to the possible dirs of the sockets (fix #43) * Don't throw exception when socket fails to open Co-authored-by: Uriel * Add path constants Co-authored-by: Kitlith * Update src/bridge/bridge-unix-sockets.cpp Co-authored-by: Kitlith * fixup! --------- Co-authored-by: Kitlith Co-authored-by: Uriel --- src/bridge/bridge-unix-sockets.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/bridge/bridge-unix-sockets.cpp b/src/bridge/bridge-unix-sockets.cpp index e53e721..8a78bc3 100644 --- a/src/bridge/bridge-unix-sockets.cpp +++ b/src/bridge/bridge-unix-sockets.cpp @@ -33,6 +33,8 @@ #include #define TMP_DIR "/tmp" +#define XDG_DATA_DIR_DEFAULT ".local/share" +#define SLIMEVR_DATA_DIR "slimevr" #define SOCKET_NAME "SlimeVRDriver" namespace fs = std::filesystem; @@ -156,12 +158,28 @@ bool sendBridgeMessage(messages::ProtobufMessage& message, SlimeVRDriver::VRDriv BridgeStatus runBridgeFrame(SlimeVRDriver::VRDriver& driver) { try { if (!client.IsOpen()) { + fs::path socket; // TODO: do this once in the constructor or something if(const char* ptr = std::getenv("XDG_RUNTIME_DIR")) { const fs::path xdg_runtime = ptr; - client.Open((xdg_runtime / SOCKET_NAME).native()); - } else { - client.Open((fs::path(TMP_DIR) / SOCKET_NAME).native()); + socket = (xdg_runtime / SOCKET_NAME); + } + if(!fs::exists(socket)) { + socket = (fs::path(TMP_DIR) / SOCKET_NAME); + } + // try using home dir if the vrserver is run in a chroot like + if(!fs::exists(socket)) { + if (const char* ptr = std::getenv("XDG_DATA_DIR")) { + const fs::path data_dir = ptr; + socket = (data_dir / SLIMEVR_DATA_DIR / SOCKET_NAME); + } else if (const char* ptr = std::getenv("HOME")) { + const fs::path home = ptr; + socket = (home / XDG_DATA_DIR_DEFAULT / SLIMEVR_DATA_DIR / SOCKET_NAME); + } + } + if(fs::exists(socket)) { + driver.Log("bridge socket: " + std::string(socket)); + client.Open(socket.native()); } } client.UpdateOnce();