Files
BloomPatched/src/Helpers/Process.cpp

64 lines
1.7 KiB
C++
Raw Normal View History

2022-09-15 00:30:59 +01:00
#include "Process.hpp"
#include <unistd.h>
#include <string>
#include <map>
2022-09-15 00:30:59 +01:00
namespace Bloom
{
::pid_t Process::getProcessId() {
return getpid();
}
::pid_t Process::getParentProcessId() {
return getppid();
}
bool Process::isManagedByClion(std::optional<::pid_t> parentProcessId) {
if (!parentProcessId.has_value()) {
parentProcessId = Process::getParentProcessId();
}
static auto cachedResultsByProcessId = std::map<::pid_t, bool>();
2022-09-15 00:30:59 +01:00
if (cachedResultsByProcessId.contains(*parentProcessId)) {
return cachedResultsByProcessId.at(*parentProcessId);
2022-09-15 00:30:59 +01:00
}
// Walk the process tree until we find CLion
auto processId = *parentProcessId;
2022-09-15 00:30:59 +01:00
while (processId != 0) {
const auto processInfo = Process::getProcessInfo(processId);
if (!processInfo) {
2022-09-15 00:30:59 +01:00
break;
}
const auto commandLine = std::string(processInfo->cmd);
2022-09-15 00:30:59 +01:00
if (commandLine.find("clion.sh") != std::string::npos) {
cachedResultsByProcessId[*parentProcessId] = true;
2022-09-15 00:30:59 +01:00
return true;
}
processId = processInfo->ppid;
2022-09-15 00:30:59 +01:00
}
cachedResultsByProcessId[*parentProcessId] = false;
2022-09-15 00:30:59 +01:00
return false;
}
Process::ProcT Process::getProcessInfo(::pid_t processId) {
auto proc = std::unique_ptr<::PROCTAB, decltype(&::closeproc)>(
::openproc(PROC_FILLSTAT | PROC_FILLARG | PROC_PID, &processId),
::closeproc
);
auto processInfo = ProcT(::readproc(proc.get(), NULL), ::freeproc);
2022-09-15 00:30:59 +01:00
if (processInfo == NULL) {
return ProcT(nullptr, ::freeproc);
2022-09-15 00:30:59 +01:00
}
return processInfo;
}
}