diff options
author | Robert Griebl <robert.griebl@pelagicore.com> | 2019-05-17 14:43:09 +0200 |
---|---|---|
committer | Bernd Weimer <bernd.weimer@pelagicore.com> | 2019-08-01 13:21:21 +0200 |
commit | 0cb42db5bb3ff97f1549ef3053ef5685b8dc5e9c (patch) | |
tree | 573c12267e721996863eedd67fb5bf09d3350f94 | |
parent | 3adab135d7aa4c560d29d39964f3ba4afa5abf94 (diff) | |
download | qtapplicationmanager-0cb42db5bb3ff97f1549ef3053ef5685b8dc5e9c.tar.gz |
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.cpp | 24 |
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(); } |