summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Griebl <robert.griebl@pelagicore.com>2019-05-17 14:43:09 +0200
committerBernd Weimer <bernd.weimer@pelagicore.com>2019-08-01 13:21:21 +0200
commit0cb42db5bb3ff97f1549ef3053ef5685b8dc5e9c (patch)
tree573c12267e721996863eedd67fb5bf09d3350f94
parent3adab135d7aa4c560d29d39964f3ba4afa5abf94 (diff)
Fix broken Wayland socket name detection
The algorithm for finding a free 'qtam-wayland-%d' Wayland socket was modelled after the code in libwayland-server, but due to a mixup between the socket filename and the lock filename it was not working correctly. Cherry-picked from dev: 4d01c85 Change-Id: Iac204c31fd0e6c239e44acefb5d65afe414461a8 Task-number: AUTOSUITE-857 Reviewed-by: Robert Griebl <robert.griebl@pelagicore.com>
-rw-r--r--src/main-lib/defaultconfiguration.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/main-lib/defaultconfiguration.cpp b/src/main-lib/defaultconfiguration.cpp
index 6ee6b2e0..2987a52a 100644
--- a/src/main-lib/defaultconfiguration.cpp
+++ b/src/main-lib/defaultconfiguration.cpp
@@ -45,6 +45,10 @@
#include <QFile>
#include <QDebug>
+#if defined(Q_OS_LINUX)
+# include <sys/file.h>
+#endif
+
#include <QtAppManCommon/logging.h>
#include "defaultconfiguration.h"
@@ -456,12 +460,24 @@ QString DefaultConfiguration::waylandSocketName() const
if (qEnvironmentVariableIsSet(envName))
return qEnvironmentVariable(envName);
- const QString lockPattern = qEnvironmentVariable("XDG_RUNTIME_DIR") + qSL("/qtam-wayland-%1.lock");
+#if defined(Q_OS_LINUX)
+ // modelled after wl_socket_lock() in wayland_server.c
+ const QString xdgDir = qEnvironmentVariable("XDG_RUNTIME_DIR") + qSL("/");
+ const QString pattern = qSL("qtam-wayland-%1");
+ const QString lockSuffix = qSL(".lock");
+
for (int i = 0; i < 32; ++i) {
- QFile lock(lockPattern.arg(i));
- if (lock.open(QIODevice::ReadWrite | QIODevice::NewOnly))
- return qSL("qtam-wayland-%1").arg(i);
+ const QString socketName = pattern.arg(i);
+ QFile lock(xdgDir + socketName + lockSuffix);
+ if (lock.open(QIODevice::ReadWrite)) {
+ if (::flock(lock.handle(), LOCK_EX | LOCK_NB) == 0) {
+ QFile socket(xdgDir + socketName);
+ if (!socket.exists() || socket.remove())
+ return socketName;
+ }
+ }
}
+#endif
return QString();
}