summaryrefslogtreecommitdiff
path: root/src/helpers/MiscFunctions.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-05-01 16:41:17 +0100
committerVaxry <vaxry@vaxry.net>2024-05-01 16:41:17 +0100
commit8bcccf9f0f0f69986e315d4288dfdbf119dd19db (patch)
treeeebb6714fc1e41a0df2784ed22752f0efe2bbdc1 /src/helpers/MiscFunctions.cpp
parent4ed6b69b68a544a81cec583a1ad8aff218f7db5d (diff)
ime-v2: move to new impl
Diffstat (limited to 'src/helpers/MiscFunctions.cpp')
-rw-r--r--src/helpers/MiscFunctions.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp
index b8061bef..22aa48f4 100644
--- a/src/helpers/MiscFunctions.cpp
+++ b/src/helpers/MiscFunctions.cpp
@@ -2,9 +2,12 @@
#include "../defines.hpp"
#include <algorithm>
#include "../Compositor.hpp"
+#include "../managers/TokenManager.hpp"
#include <optional>
#include <set>
#include <sys/utsname.h>
+#include <sys/mman.h>
+#include <fcntl.h>
#include <iomanip>
#include <sstream>
#ifdef HAS_EXECINFO
@@ -834,3 +837,35 @@ bool envEnabled(const std::string& env) {
return false;
return std::string(ENV) == "1";
}
+
+std::pair<int, std::string> openExclusiveShm() {
+ std::string name = g_pTokenManager->getRandomUUID();
+
+ for (size_t i = 0; i < 69; ++i) {
+ int fd = shm_open(name.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600);
+ if (fd >= 0)
+ return {fd, name};
+ }
+
+ return {-1, ""};
+}
+
+int allocateSHMFile(size_t len) {
+ auto [fd, name] = openExclusiveShm();
+ if (fd < 0)
+ return -1;
+
+ shm_unlink(name.c_str());
+
+ int ret;
+ do {
+ ret = ftruncate(fd, len);
+ } while (ret < 0 && errno == EINTR);
+
+ if (ret < 0) {
+ close(fd);
+ return -1;
+ }
+
+ return fd;
+}