summaryrefslogtreecommitdiffhomepage
path: root/compat/process-list.hpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2025-04-25 08:01:32 +0200
committerStanislaw Halik <sthalik@misaki.pl>2025-05-16 08:54:13 +0200
commit78f8c6c81c2e900aa1cb433940667a054cc0b6ed (patch)
treeb03c5c96e1d45645a5528d2007f343f21bd46f48 /compat/process-list.hpp
parent1f737463587fec21337631bc0320718b49fde26c (diff)
buffer flush
Diffstat (limited to 'compat/process-list.hpp')
-rw-r--r--compat/process-list.hpp217
1 files changed, 4 insertions, 213 deletions
diff --git a/compat/process-list.hpp b/compat/process-list.hpp
index 39e12603..361efa4f 100644
--- a/compat/process-list.hpp
+++ b/compat/process-list.hpp
@@ -7,218 +7,9 @@
#pragma once
-#include <QDebug>
-#include <QStringList>
-
-#if defined _WIN32
-
-#include <windows.h>
-#include <tlhelp32.h>
-
-template<typename = void>
-static QStringList get_all_executable_names()
-{
- QStringList ret;
- HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (h == INVALID_HANDLE_VALUE)
- return ret;
-
- PROCESSENTRY32 e;
- e.dwSize = sizeof(e);
-
- if (Process32First(h, &e) != TRUE)
- {
- CloseHandle(h);
- return ret;
- }
-
- do {
- ret.append(e.szExeFile);
- } while (Process32Next(h, &e) == TRUE);
-
- CloseHandle(h);
-
- return ret;
-}
-#elif defined __APPLE__
-#include <libproc.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <cerrno>
-#include <cstring>
+#include "export.hpp"
#include <vector>
+#include <QString>
+#include <QList>
-template<typename = void>
-static QStringList get_all_executable_names()
-{
- QStringList ret; ret.reserve(2048);
- std::vector<int> vec;
-
- while (true)
- {
- int numproc = proc_listpids(PROC_ALL_PIDS, 0, nullptr, 0);
- if (numproc == -1)
- {
- 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)
- {
- std::vector<char> 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++)
- {
- 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;
- }
- 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 == QStringLiteral("wine.bin") || tmp == QStringLiteral("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;
- }
- }
-}
-
-#elif defined __linux__
-
-#include <cerrno>
-
-#ifdef OTR_HAS_LIBPROC2
-#include <libproc2/pids.h>
-template<typename = void>
-QStringList get_all_executable_names()
-{
- QStringList ret; ret.reserve(2048);
- enum pids_item items[] = { PIDS_ID_PID, PIDS_CMD, PIDS_CMDLINE_V };
-
- enum rel_items { rel_pid, rel_cmd, rel_cmdline };
- struct pids_info *info = NULL;
- struct pids_stack *stack;
- QString tmp; tmp.reserve(255);
-
- procps_pids_new(&info, items, 3);
-
- // procps-ng version 4.0.5 removed an unused argument in PIDS_VAL() macro.
- // cf. https://gitlab.com/procps-ng/procps/-/commit/967fdcfb06e20aad0f3
-
- // Although the emitted machine code is identical, backward API
- // compatibility was silently broken in the patch with no upgrade path
- // (e.g. deprecating PIDS_VAL() while introducing PIDS_VAL2()).
-
- // Unfortunately, procps-ng doesn't include a #define for identifying its
- // version. For these reasons the code below depends on undocumented ABI
- // compatibility between procps-ng versions.. -sh 20241226
-
-#define OPENTRACK_PIDS_VAL(i, type, stack) stack->head[i].result.type
-
- while ((stack = procps_pids_get(info, PIDS_FETCH_TASKS_ONLY)))
- {
- char **p_cmdline = OPENTRACK_PIDS_VAL(rel_cmdline, strv, stack);
-
- // note, wine sets argv[0] so no parsing like in OSX case
- if (p_cmdline && p_cmdline[0] && p_cmdline[0][0] &&
- !(p_cmdline[0][0] == '-' && !p_cmdline[0][1]))
- {
- tmp = QString{p_cmdline[0]};
- const int idx = std::max(tmp.lastIndexOf('\\'), tmp.lastIndexOf('/'));
- if (idx != -1)
- tmp = tmp.mid(idx+1);
- //qDebug() << "procps" << tmp;
- ret.append(tmp);
- }
- }
- //qDebug() << "-- procps end";
-
- procps_pids_unref(&info);
-
- return ret;
-}
-#else
-#include <proc/readproc.h>
-#include <cerrno>
-
-template<typename = void>
-QStringList get_all_executable_names()
-{
- QStringList ret; ret.reserve(2048);
- proc_t** procs = readproctab(PROC_FILLCOM);
- if (procs == nullptr)
- {
- qDebug() << "readproctab" << errno;
- return ret;
- }
- for (int i = 0; procs[i]; i++)
- {
- // note, wine sets argv[0] so no parsing like in OSX case
- auto proc = procs[i];
- if (proc->cmdline && proc->cmdline[0])
- {
- QString tmp(proc->cmdline[0]);
- const int idx = std::max(tmp.lastIndexOf('\\'), tmp.lastIndexOf('/'));
- tmp = tmp.mid(idx == -1 ? 0 : idx+1);
- ret.append(tmp);
- }
- freeproc(procs[i]);
- }
- free(procs);
- return ret;
-}
-#endif
-
-#else
-template<typename = void>
-static QStringList get_all_executable_names()
-{
- return QStringList();
-}
-#endif
+OTR_COMPAT_EXPORT QStringList get_all_executable_names();