From 153c99217d70288b029e965a8c94152705dbd64a Mon Sep 17 00:00:00 2001 From: vaxerski Date: Thu, 10 Nov 2022 13:50:16 +0000 Subject: [PATCH] use spawn in config exec --- src/config/ConfigManager.cpp | 57 +-------------------------------- src/managers/KeybindManager.hpp | 2 ++ 2 files changed, 3 insertions(+), 56 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 12a11268..94c3bc60 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -388,62 +388,7 @@ void CConfigManager::configSetValueSafe(const std::string& COMMAND, const std::s void CConfigManager::handleRawExec(const std::string& command, const std::string& args) { // Exec in the background dont wait for it. - - std::string toExec = args; - - if (g_pXWaylandManager->m_sWLRXWayland) - toExec = std::string("WAYLAND_DISPLAY=") + std::string(g_pCompositor->m_szWLDisplaySocket) + " DISPLAY=" + std::string(g_pXWaylandManager->m_sWLRXWayland->display_name) + " " + toExec; - else - toExec = std::string("WAYLAND_DISPLAY=") + std::string(g_pCompositor->m_szWLDisplaySocket) + " " + toExec; - - Debug::log(LOG, "Config executing %s", toExec.c_str()); - - int socket[2]; - if (pipe(socket) != 0) { - Debug::log(LOG, "Unable to create pipe for fork"); - } - - pid_t child, grandchild; - child = fork(); - if (child < 0) { - close(socket[0]); - close(socket[1]); - Debug::log(LOG, "Fail to create the first fork"); - return; - } - if (child == 0) { - // run in child - grandchild = fork(); - - sigset_t set; - sigemptyset(&set); - sigprocmask(SIG_SETMASK, &set, NULL); - - if (grandchild == 0) { - // run in grandchild - close(socket[0]); - close(socket[1]); - execl("/bin/sh", "/bin/sh", "-c", toExec.c_str(), nullptr); - // exit grandchild - _exit(0); - } - close(socket[0]); - write(socket[1], &grandchild, sizeof(grandchild)); - close(socket[1]); - // exit child - _exit(0); - } - // run in parent - close(socket[1]); - read(socket[0], &grandchild, sizeof(grandchild)); - close(socket[0]); - // clear child and leave child to init - waitpid(child, NULL, 0); - if (child < 0) { - Debug::log(LOG, "Fail to create the second fork"); - return; - } - Debug::log(LOG, "Process created with pid %d", grandchild); + g_pKeybindManager->spawn(args); } void CConfigManager::handleMonitor(const std::string& command, const std::string& args) { diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index 15748709..3d3dbce0 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -7,6 +7,7 @@ #include class CInputManager; +class CConfigManager; struct SKeybind { std::string key = ""; @@ -125,6 +126,7 @@ private: friend class CCompositor; friend class CInputManager; + friend class CConfigManager; }; inline std::unique_ptr g_pKeybindManager;