diff options
author | Petr Mrázek <peterix@gmail.com> | 2018-10-31 22:44:23 +0100 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2018-10-31 22:44:23 +0100 |
commit | d5037d4f795242998e1a296a592df460a545b6f6 (patch) | |
tree | 60e350108f767362ca44ab5e3b1ba43cd4f64bcf | |
parent | aef0ccb1a25ff9989256796dcb5264ff936f81b7 (diff) | |
download | MultiMC-d5037d4f795242998e1a296a592df460a545b6f6.tar MultiMC-d5037d4f795242998e1a296a592df460a545b6f6.tar.gz MultiMC-d5037d4f795242998e1a296a592df460a545b6f6.tar.lz MultiMC-d5037d4f795242998e1a296a592df460a545b6f6.tar.xz MultiMC-d5037d4f795242998e1a296a592df460a545b6f6.zip |
GH-2412: collect dead processes on linux properly
Issues were caused by use of `popen()` with no `pclose()` counterpart...
-rw-r--r-- | api/logic/FileSystem.cpp | 2 | ||||
-rw-r--r-- | api/logic/minecraft/launch/PrintInstanceInfo.cpp | 95 |
2 files changed, 59 insertions, 38 deletions
diff --git a/api/logic/FileSystem.cpp b/api/logic/FileSystem.cpp index 1d8b290d..7e3c1841 100644 --- a/api/logic/FileSystem.cpp +++ b/api/logic/FileSystem.cpp @@ -294,7 +294,7 @@ QString NormalizePath(QString path) } } -QString badFilenameChars = "\"\\/?<>:*|!"; +QString badFilenameChars = "\"\\/?<>:*|!+"; QString RemoveInvalidFilenameChars(QString string, QChar replaceWith) { diff --git a/api/logic/minecraft/launch/PrintInstanceInfo.cpp b/api/logic/minecraft/launch/PrintInstanceInfo.cpp index 83bf584f..6d5b93ae 100644 --- a/api/logic/minecraft/launch/PrintInstanceInfo.cpp +++ b/api/logic/minecraft/launch/PrintInstanceInfo.cpp @@ -19,67 +19,88 @@ #include "PrintInstanceInfo.h" #include <launch/LaunchTask.h> -void PrintInstanceInfo::executeTask() -{ - auto instance = m_parent->instance(); - auto lines = instance->verboseDescription(m_session); - #ifdef Q_OS_LINUX +namespace { +void probeProcCpuinfo(QStringList &log) +{ std::ifstream cpuin("/proc/cpuinfo"); for (std::string line; std::getline(cpuin, line);) { if (strncmp(line.c_str(), "model name", 10) == 0) { - QStringList clines = (QStringList() << QString::fromStdString(line.substr(13, std::string::npos))); - logLines(clines, MessageLevel::MultiMC); + log << QString::fromStdString(line.substr(13, std::string::npos)); break; } } +} +void runLspci(QStringList &log) +{ + // FIXME: fixed size buffers... char buff[512]; int gpuline = -1; int cline = 0; - FILE *fp = popen("lspci -k", "r"); - if (fp != NULL) + FILE * lspci = popen("lspci -k", "r"); + + if (!lspci) + return; + + while (fgets(buff, 512, lspci) != NULL) { - while (fgets(buff, 512, fp) != NULL) + std::string str(buff); + if (str.length() < 9) + continue; + if (str.substr(8, 3) == "VGA") { - std::string str(buff); - if (str.length() < 9) - continue; - if (str.substr(8, 3) == "VGA") - { - gpuline = cline; - QStringList glines = (QStringList() << QString::fromStdString(str.substr(35, std::string::npos))); - logLines(glines, MessageLevel::MultiMC); - } - if (gpuline > -1 && gpuline != cline) + gpuline = cline; + log << QString::fromStdString(str.substr(35, std::string::npos)); + } + if (gpuline > -1 && gpuline != cline) + { + if (cline - gpuline < 3) { - if (cline - gpuline < 3) - { - QStringList alines = (QStringList() << QString::fromStdString(str.substr(1, std::string::npos))); - logLines(alines, MessageLevel::MultiMC); - } + log << QString::fromStdString(str.substr(1, std::string::npos)); } - cline++; } + cline++; } - - FILE *fp2 = popen("glxinfo", "r"); - if (fp2 != NULL) + pclose(lspci); +} + +void runGlxinfo(QStringList & log) +{ + // FIXME: fixed size buffers... + char buff[512]; + FILE *glxinfo = popen("glxinfo", "r"); + if (!glxinfo) + return; + + while (fgets(buff, 512, glxinfo) != NULL) { - while (fgets(buff, 512, fp2) != NULL) + if (strncmp(buff, "OpenGL version string:", 22) == 0) { - if (strncmp(buff, "OpenGL version string:", 22) == 0) - { - QStringList drlines = (QStringList() << QString::fromUtf8(buff)); - logLines(drlines, MessageLevel::MultiMC); - break; - } + log << QString::fromUtf8(buff); + break; } } + pclose(glxinfo); +} + +} +#endif + +void PrintInstanceInfo::executeTask() +{ + auto instance = m_parent->instance(); + QStringList log; + +#ifdef Q_OS_LINUX + ::probeProcCpuinfo(log); + ::runLspci(log); + ::runGlxinfo(log); #endif - logLines(lines, MessageLevel::MultiMC); + logLines(log, MessageLevel::MultiMC); + logLines(instance->verboseDescription(m_session), MessageLevel::MultiMC); emitSucceeded(); } |