From 413e6fef09190b0ddc1a110415d964f88f332655 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 13 Aug 2015 13:00:38 +0200 Subject: fixed process detector for OSX Issue: #181 --- opentrack-compat/process-list.hpp | 68 +++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 9 deletions(-) (limited to 'opentrack-compat') diff --git a/opentrack-compat/process-list.hpp b/opentrack-compat/process-list.hpp index a00cbb17..f3388c4f 100755 --- a/opentrack-compat/process-list.hpp +++ b/opentrack-compat/process-list.hpp @@ -36,10 +36,12 @@ static QStringList get_all_executable_names() #elif defined __APPLE__ #include #include +#include +#include #include +#include #include -// link to libproc template static QStringList get_all_executable_names() { @@ -51,21 +53,69 @@ static QStringList get_all_executable_names() int numproc = proc_listpids(PROC_ALL_PIDS, 0, nullptr, 0); if (numproc == -1) { - qDebug() << "numproc failed" << errno; - break; + qDebug() << "proc_listpids numproc failed" << errno; + return ret; } vec.resize(numproc); int cnt = proc_listpids(PROC_ALL_PIDS, 0, &vec[0], sizeof(int) * numproc); + if (cnt <= numproc) { - char name[2 * 2 * MAXCOMLEN + 1]; - for (int i = 0; i < cnt; i++) + std::vector arglist; + int mib[2] { CTL_KERN, KERN_ARGMAX }; + size_t sz = sizeof(int); + int maxarg = 0; + if (sysctl(mib, 2, &maxarg, &sz, NULL, 0) == -1) + { + qDebug() << "sysctl KERN_ARGMAX" << errno; + return ret; + } + arglist.resize(maxarg); + for (int i = 0; i < numproc; i++) { - int ret = proc_name(vec[i], name, sizeof(name)-1); - if (ret <= 0) + size_t maxarg_ = (size_t)maxarg; + int mib[3] { CTL_KERN, KERN_PROCARGS2, vec[i] }; + if (sysctl(mib, 3, &arglist[0], &maxarg_, NULL, 0) == -1) + { + //qDebug() << "sysctl KERN_PROCARGS2" << vec[i] << errno; continue; - name[ret] = '\0'; - ret.append(name); + } + QStringList cmdline; + for (unsigned j = sizeof(int) + strlen(&arglist[sizeof(int)]); j < maxarg_; j++) + { + QString arg(&arglist[j]); + if (arg.size() != 0) + { + cmdline << arg; + j += arg.size(); + } + } + if (cmdline.size() > 0) + { + int idx = cmdline[0].lastIndexOf('/'); + if (idx != -1) + { + QString tmp = cmdline[0].mid(idx+1); + if (cmdline.size() > 1 && (tmp == "wine.bin" || tmp == "wine")) + { + idx = cmdline[1].lastIndexOf('/'); + if (idx == -1) + idx = cmdline[1].lastIndexOf('\\'); + if (idx != -1) + { + ret.append(cmdline[1].mid(idx+1)); + } + else + ret.append(cmdline[1]); + } + else + { + ret.append(tmp); + } + } + else + ret.append(cmdline[0]); + } } return ret; } -- cgit v1.2.3