aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRalf Nolden <nolden@kde.org>2016-06-13 11:58:41 +0200
committerRalf Nolden <nolden@kde.org>2016-06-13 15:12:31 +0000
commit320ffbca5673445ec059c1874e3855048da2d837 (patch)
tree65bc3098f9bdc388e5de18aa88d941ffe3448a0a
parent4d36be62387c9e5ea23ac5751d4fe87536333f70 (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.pro1
-rw-r--r--src/lib/corelib/corelib.qbs4
-rw-r--r--src/lib/corelib/tools/processutils.cpp38
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
}