From 0175f5d456a9cdae24f2ef9ac1d511236748b34e Mon Sep 17 00:00:00 2001 From: xtex Date: Sat, 14 Oct 2023 21:58:25 +0800 Subject: [PATCH] fix: linux cap test with libcap-progs at /usr/sbin (gh#764) Signed-off-by: xtex --- sys/linux/LinuxCap.cpp | 19 +++++++++++++++++-- sys/linux/LinuxCap.h | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/sys/linux/LinuxCap.cpp b/sys/linux/LinuxCap.cpp index b5245b0..5e65311 100644 --- a/sys/linux/LinuxCap.cpp +++ b/sys/linux/LinuxCap.cpp @@ -1,12 +1,14 @@ #include "LinuxCap.h" +#include #include +#include #define EXIT_CODE(p) (p.exitStatus() == QProcess::NormalExit ? p.exitCode() : -1) QString Linux_GetCapString(const QString &path) { QProcess p; - p.setProgram("getcap"); + p.setProgram(Linux_FindCapProgsExec("getcap")); p.setArguments({path}); p.start(); p.waitForFinished(500); @@ -16,7 +18,7 @@ QString Linux_GetCapString(const QString &path) { int Linux_Pkexec_SetCapString(const QString &path, const QString &cap) { QProcess p; p.setProgram("pkexec"); - p.setArguments({"setcap", cap, path}); + p.setArguments({Linux_FindCapProgsExec("setcap"), cap, path}); p.start(); p.waitForFinished(-1); return EXIT_CODE(p); @@ -31,3 +33,16 @@ bool Linux_HavePkexec() { p.waitForFinished(500); return EXIT_CODE(p) == 0; } + +QString Linux_FindCapProgsExec(const QString &name) { + QString exec = QStandardPaths::findExecutable(name); + if (exec.isEmpty()) + exec = QStandardPaths::findExecutable(name, {"/usr/sbin", "/sbin"}); + + if (exec.isEmpty()) + qDebug() << "Executable" << name << "could not be resolved"; + else + qDebug() << "Found exec" << name << "at" << exec; + + return exec.isEmpty() ? name : exec; +} diff --git a/sys/linux/LinuxCap.h b/sys/linux/LinuxCap.h index 1a05bef..64750e4 100644 --- a/sys/linux/LinuxCap.h +++ b/sys/linux/LinuxCap.h @@ -7,3 +7,5 @@ QString Linux_GetCapString(const QString &path); int Linux_Pkexec_SetCapString(const QString &path, const QString &cap); bool Linux_HavePkexec(); + +QString Linux_FindCapProgsExec(const QString &name);