diff options
author | Ralf Nolden <nolden@kde.org> | 2016-06-13 11:58:41 +0200 |
---|---|---|
committer | Ralf Nolden <nolden@kde.org> | 2016-06-13 15:12:31 +0000 |
commit | 320ffbca5673445ec059c1874e3855048da2d837 (patch) | |
tree | 65bc3098f9bdc388e5de18aa88d941ffe3448a0a | |
parent | 4d36be62387c9e5ea23ac5751d4fe87536333f70 (diff) |
Make processNameByPid() work on OpenBSD,NetBSD and FreeBSD
Backport of 3432742caa5171ceddee0e75adefda9310c3b1eb in
qtbase/src/corelib/io/qlockfile_unix.cpp of QLockFilePrivate::processNameByPid()
that merged NetBSD, OpenBSD and FreeBSD as well as GNU/kFreeBSD
implementations into one block.
Change-Id: I5fdc086d5c2680d5a431339873c8685b0e68bf57
Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
-rw-r--r-- | src/lib/corelib/corelib.pro | 1 | ||||
-rw-r--r-- | src/lib/corelib/corelib.qbs | 4 | ||||
-rw-r--r-- | src/lib/corelib/tools/processutils.cpp | 38 |
3 files changed, 32 insertions, 11 deletions
diff --git a/src/lib/corelib/corelib.pro b/src/lib/corelib/corelib.pro index 8644f9977..0a6a994f6 100644 --- a/src/lib/corelib/corelib.pro +++ b/src/lib/corelib/corelib.pro @@ -22,7 +22,6 @@ include(parser/parser.pri) include(tools/tools.pri) win32:LIBS += -lpsapi -freebsd:LIBS += -lutil HEADERS += \ qbs.h diff --git a/src/lib/corelib/corelib.qbs b/src/lib/corelib/corelib.qbs index 51355a253..27f058621 100644 --- a/src/lib/corelib/corelib.qbs +++ b/src/lib/corelib/corelib.qbs @@ -23,10 +23,6 @@ QbsLibrary { condition: qbs.targetOS.contains("windows") cpp.dynamicLibraries: base.concat(["Psapi"]) } - Properties { - condition: qbs.targetOS.contains("freebsd") - cpp.dynamicLibraries: base.concat(["util"]) - } cpp.dynamicLibraries: base Properties { diff --git a/src/lib/corelib/tools/processutils.cpp b/src/lib/corelib/tools/processutils.cpp index 8b388ec4c..21822a727 100644 --- a/src/lib/corelib/tools/processutils.cpp +++ b/src/lib/corelib/tools/processutils.cpp @@ -41,9 +41,13 @@ # include <unistd.h> # include <cstdio> #elif defined(Q_OS_BSD4) -# include <libutil.h> -# include <sys/types.h> +# include <QFile> +# if !defined(Q_OS_NETBSD) # include <sys/user.h> +# endif +# include <sys/cdefs.h> +# include <sys/param.h> +# include <sys/sysctl.h> #else # error Missing implementation of processNameByPid for this platform. #endif @@ -82,13 +86,35 @@ QString processNameByPid(qint64 pid) readlink(exePath, buf, sizeof(buf)); return FileInfo::fileName(QString::fromUtf8(buf)); #elif defined(Q_OS_BSD4) - kinfo_proc *proc = kinfo_getproc(pid); - if (!proc) +# if defined(Q_OS_NETBSD) + struct kinfo_proc2 kp; + int mib[6] = { CTL_KERN, KERN_PROC2, KERN_PROC_PID, (int)pid, sizeof(struct kinfo_proc2), 1 }; +# elif defined(Q_OS_OPENBSD) + struct kinfo_proc kp; + int mib[6] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (int)pid, sizeof(struct kinfo_proc), 1 }; +# else + struct kinfo_proc kp; + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (int)pid }; +# endif + size_t len = sizeof(kp); + u_int mib_len = sizeof(mib)/sizeof(u_int); + + if (sysctl(mib, mib_len, &kp, &len, NULL, 0) < 0) + return QString(); + +# if defined(Q_OS_OPENBSD) || defined(Q_OS_NETBSD) + if (kp.p_pid != pid) return QString(); - QString name = QString::fromUtf8(proc->ki_comm); - free(proc); + QString name = QFile::decodeName(kp.p_comm); +# else + if (kp.ki_pid != pid) + return QString(); + QString name = QFile::decodeName(kp.ki_comm); +# endif return name; + #else + Q_UNUSED(pid); return QString(); #endif } |